各位高手,谁有51单片机 控制19264的程序!小弟急要!先谢谢各位了!小弟本比较少,请见谅!要有详细说明

各位高手,谁有51单片机 控制19264的程序!小弟急要!先谢谢各位了!小弟本比较少,请见谅!要有详细说明,第1张

// 19264 Demo Program

//***************************************************************************

//连线表: CPU=89C52*

//RS=P3.0 R/W=P3.1 E=P3.2 CS1=P3.3 CS2=P3.4 CS3=P3.5*

//SysClock=12MHz DB0-DB7=P1.0-P1.7

//SysClock=12MHz DB0-DB7=P1.0-P1.7

//Reset 接1来节省口

//V0 接-6v我所知的只能接 -6v 不知道其他可不可以 ,要小心!我的已经挂了一个了。

//vee 接5~ -13v 或者不接

//leda 接+5v

//vss 0v

//vdd 5v

//P1 为数据

//***************************************************************************

#include "STC89C51RC_RD_PLUS.H" // 包含的头文件

#include <stdlib.h>

#include <intrins.h>

#include <stdio.h>

#include "code_data.h"

/********************引脚定义********************/

sbitRS =P2^0 //数据指令

sbitRW =P2^1 //读写

sbitE =P2^5 //使能

sbitCSL =P2^2 //左片选

sbitCSM =P2^3 //中片选

sbitCSR =P2^4 //右片选

sbitCPUWR =P3^6

sbitCPURD =P3^7

unsigned char Page//页 地址

unsigned char Col //列 地址

void Delay(unsigned int MS)

void wtcom(void)

/***************************/

/*检查Busy */

/***************************/

void BusyL(void)

{

CSL= 0

CSM= 1

CSR= 1

wtcom()

}

void BusyM(void)

{

CSL= 1

CSM= 0

CSR= 1

wtcom()

}

void BusyR(void)

{

CSL= 1

CSM= 1

CSR= 0

wtcom()

}

void wtcom(void)

{

RS = 0//指令

RW = 1

P0 = 0xFF //输出0xff以便读取正确

E = 1

_nop_()_nop_()_nop_()

while(P0 &0x80) //Status Read Bit7 = BUSY

E = 0

_nop_()_nop_()_nop_()

}

/********************************************************/

/*根据设定的坐标数据,定位LCM上的下一个 *** 作单元位置 */

/********************************************************/

void Locatexy(void)

{

unsigned char x,y

switch (Col&0xc0) /* col.and.0xC0*/

{ /*条件分支执行 */

case 0: {BusyL()break}/*左区 */

case 0x40: {BusyM()break}/*中区 */

case 0x80: {BusyR()break}/*右区 */

}

x = Col&0x3F|0x40 /* col.and.0x3f.or.Set Y Address*/

y = Page&0x07|0xB8/* row.and.0x07.or.set Page */

wtcom() /* waitting for enable */

RS = 0//指令

RW = 0//写

P0 = y//设置页面地址

E = 1

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

wtcom() /* waitting for enable */

RS = 0

RW = 0

P0 = x//设置列地址

E = 1

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

}

/***************************/

/*写指令 */

/***************************/

void WriteCommandL( unsigned char CommandByte )

{

BusyL()

P0 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

}

void WriteCommandM( unsigned char CommandByte )

{

BusyM()

P0 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

}

void WriteCommandR( unsigned char CommandByte )

{

BusyR()

P0 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

}

/***************************/

/*读数据 */

/***************************/

unsigned char ReadData( void )

{

unsigned char DataByte

Locatexy()/*坐标定位,返回时保留分区状态不变 */

RS = 1/*数据输出*/

RW = 1/*读入 */

P0 = 0xFF //输出0xff以便读取正确

E = 1/*读入到LCM*/

_nop_()_nop_()_nop_()_nop_()_nop_()

DataByte = P0/*数据读出到数据口P1 */

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

return DataByte

}

/***************************/

/*写数据 */

/***************************/

void WriteData( unsigned char DataByte )

{

Locatexy()/*坐标定位,返回时保留分区状态不变 */

RS = 1/*数据输出*/

RW = 0/*写输出 */

P0 = DataByte/*数据输出到数据口 */

E = 1/*写入到LCM*/

_nop_()_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()_nop_()

}

void LcmClear( void )

{

Page = 0

Col = 0

for(Page=0Page<8Page++)

for(Col=0Col<192Col++)

WriteData(0)

}

void LcmInit( void )

{

WriteCommandL(0x3f) //开显示

WriteCommandM(0x3f)

WriteCommandR(0x3f)

WriteCommandL(0xc0) //设置起始地址=0

WriteCommandM(0xc0)

WriteCommandR(0xc0)

WriteCommandL(0x3f) //开显示

WriteCommandM(0x3f)

WriteCommandR(0x3f)

LcmClear()

Col = 0

Page= 0

Locatexy()

}

//////////////////////////////////////////////以上是驱动程序/////////////////////////////

void LcmPutDots( unsigned char DotByte )//点显示

{

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

WriteData( DotByte )

DotByte = ~DotByte

}

}

}

void LcmPutBMP( unsigned char *puts ) //显示图片

{

unsigned int X=0

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

WriteData( puts[X] )

X++

}

}

}

void LcmReverseBMP( void ) //反白控制

{

unsigned char temp

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

temp = ReadData() //空读一次

temp = ReadData()

temp = ~temp

WriteData(temp)

}

}

}

void Delay(unsigned int MS)

{

unsigned char us,usn

while(MS!=0)

{

usn = 2 //for 12M

while(usn!=0)

{

us=0xf6

while (us!=0){us--}

usn--

}

MS--

}

}

/****************************************/

/*写字符串 不得超过27个 */

/****************************************/

void write_chars(unsigned char x,unsigned char y,unsigned char code *date,unsigned char quantity)//任意行写不超过一行的字符串

{

unsigned char i,ii,iii

Page = 0

Col = 0

for(i=0i<quantityi++) //字符串数

{

for(ii=0ii<2ii++) //上下

{

Page=x+ii

for(iii=0iii<7iii++) //一个单元

{

Col=iii+7*(i+y)

WriteData(date[iii+7*ii+14*i])

}

}

}

}

/****************************************/

/*写汉字串 不得超过12个 */

/****************************************/

void write_chineses(unsigned char x,unsigned char y,unsigned char code *date,unsigned char quantity)//任意行写不超过一行的字符串

{

unsigned char i,ii,iii

Page = 0

Col = 0

for(i=0i<quantityi++)

{

for(ii=0ii<2ii++) //上下

{

Page=x+ii

for(iii=0iii<15iii++)

{

Col=iii+15*(i+y)

WriteData(date[iii+15*ii+30*i])

}

}

}

}

/*********************************************/

/*汉字反白 */

void write_Reverse_chineses(unsigned char x,unsigned char y,unsigned char quantity)//任意行写不超过一行的字符串

{

unsigned char temp

unsigned char i,ii,iii

Page = 0

Col = 0

for(i=0i<quantityi++)

{

for(ii=0ii<2ii++) //上下

{

Page=x+ii

for(iii=0iii<15iii++)

{

Col=iii+15*(i+y)

temp = ReadData() //空读一次

temp = ReadData()

temp = ~temp

WriteData(temp)

}

}

}

}

///////////////////////////////////////////

void Main( )

{

unsigned char kp=10

CPUWR=1

CPURD=0

Delay(200)//等待复位

LcmInit()

LcmClear()

CPUWR=1

CPURD=0

while(1)

{

P4=P4&0xfd

LcmClear()

while(kp--)

{

write_chineses(3,2,pray,8)

Delay(100)

write_Reverse_chineses(3,2,8)

Delay(100)

}

LcmClear()

write_chars(2,4,moble_num,13)

write_chars(4,4,QQ,16)

kp=10

while(kp--)

{

write_chineses(0,0,moble,3)

Delay(100)

write_Reverse_chineses(0,0,3)

Delay(100)

}

Delay(10000)

LcmClear()//刷新

write_chineses(4,2,write_me,5)

Delay(500)

LcmReverseBMP()

Delay(500)

LcmReverseBMP()

Delay(500)

LcmReverseBMP()

Delay(500)

LcmReverseBMP()

Delay(1500)

LcmReverseBMP()

LcmPutBMP(BMP1)

Delay(1500)

LcmReverseBMP()

Delay(1500)

LcmPutBMP(BMP2)

Delay(1500)

LcmReverseBMP()

Delay(1500)

for(kp=0kp<=255kp++){

LcmPutDots(kp)

Delay(2500)

}

}

}

液晶不知道你用过没有。

其实STM32和51IO唯一区别就是51的不用配置输入还是输出,只要把IO拉高,就可以用作输入比如P1=0XFF, A=P1 此时A读取P1就相当于输入使用了,给IO赋值比如P1=0xF0,就已经成为输出了。

而STM32在使用IO前需要先开启IO时钟,然后配置好对应的IO配置寄存器,即配置为输入还是输出。这样才可以使用,当你需要输出时先要配置为输出模式,等你要读取时就需要在配置为输入模式,在读取。

而且STM32的IO是16位的,即GOIOx0~GPIOx15。相当于51的2组IO口比如P0+P1这样,因为51Px只有Px.0-Px.7.

所以你使用前先要硬件配置好IO接口,比如D0-D7 8位数据配置为GPIOA.0-.7使用GPIOA口的低8位,然后相应的使能,19265貌似还有个EN1,EN2左半屏和右半屏。还是上半屏下半屏,我记不住了,然后就是A0数据/命令信号,RW读取/写入信号,比如为低电平为写入,为高电平为读取。

还有个复位信号,每次开机初始化前复位一次就够了,这些都可以通过手册查找到

另外就是19264的信号电平问题,19264貌似大部分是5V的,因为STM32IO是3.3V的标有[FT]的为能够耐受5V不过需要你外部加上拉电阻接到5V,而且输出需要配置为开漏输出。我记得他的GPIOB口基本全是FT的IO。所以你可以把他的这些电平信号全接到GPIOB口上。通过上拉电阻去拉高电平。然后在程序中定义好EN,RW,RS或A0这些就可以了,剩下的就是按照手册去写命令。具体可以查下网上很多19264的驱动C程序,只是可能是51驱动的,你需要根据你的实际使用去改变IO定义以及写入时把IO配置为输出,需要读取时把IO配置为输入。

#include <reg52.h>

#include <stdlib.h>

#include <intrins.h>

#include <stdio.h>

/********************引脚定义********************/

sbitRS =P3^0 //数据指令

sbitRW =P3^1 //读写

sbitE =P3^2 //使能

sbitCSL =P3^3 //左片选

sbitCSM =P3^4 //中片选

sbitCSR =P3^5 //右片选

sbitRST =P3^6

unsigned char Page//页 地址

unsigned char Col //列 地址

unsigned char code BMP1[]

unsigned char code BMP2[]

void Delay(unsigned int MS)

void wtcom(void)

/***************************/

/*检查Busy */

/***************************/

void BusyL(void)

{

CSL= 1

CSM= 0

CSR= 0

wtcom()

}

void BusyM(void)

{

CSL= 0

CSM= 1

CSR= 0

wtcom()

}

void BusyR(void)

{

CSL= 0

CSM= 0

CSR= 1

wtcom()

}

void wtcom(void)

{

RS = 0//指令

RW = 1

P1 = 0xFF //输出0xff以便读取正确

E = 1

_nop_()_nop_()_nop_()

while(P1 &0x80) //Status Read Bit7 = BUSY

E = 0

_nop_()_nop_()_nop_()

}

/********************************************************/

/*根据设定的坐标数据,定位LCM上的下一个 *** 作单元位置 */

/********************************************************/

void Locatexy(void)

{

unsigned char x,y

switch (Col&0xc0) /* col.and.0xC0*/

{/*条件分支执行 */

case 0: {BusyL()break}/*左区 */

case 0x40: {BusyM()break}/*中区 */

case 0x80: {BusyR()break}/*右区 */

}

x = Col&0x3F|0x40 /* col.and.0x3f.or.Set Y Address*/

y = Page&0x07|0xB8/* row.and.0x07.or.set Page */

wtcom() /* waitting for enable */

RS = 0//指令

RW = 0//写

P1 = y//设置页面地址

E = 1

_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

wtcom() /* waitting for enable */

RS = 0

RW = 0

P1 = x//设置列地址

E = 1

_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

}

/***************************/

/*写指令 */

/***************************/

void WriteCommandL( unsigned char CommandByte )

{

BusyL()

P1 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

}

void WriteCommandM( unsigned char CommandByte )

{

BusyM()

P1 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

}

void WriteCommandR( unsigned char CommandByte )

{

BusyR()

P1 = CommandByte

RS = 0//指令

RW = 0

E = 1

_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

}

/***************************/

/*读数据 */

/***************************/

unsigned char ReadData( void )

{

unsigned char DataByte

Locatexy()/*坐标定位,返回时保留分区状态不变 */

RS = 1/*数据输出*/

RW = 1/*读入 */

P1 = 0xFF //输出0xff以便读取正确

E = 1/*读入到LCM*/

_nop_()_nop_()_nop_()_nop_()

DataByte = P1 /*数据读出到数据口P1 */

E = 0

_nop_()_nop_()_nop_()_nop_()

return DataByte

}

/***************************/

/*写数据 */

/***************************/

void WriteData( unsigned char DataByte )

{

Locatexy()/*坐标定位,返回时保留分区状态不变 */

RS = 1/*数据输出*/

RW = 0/*写输出 */

P1 = DataByte /*数据输出到数据口 */

E = 1/*写入到LCM*/

_nop_()_nop_()_nop_()_nop_()

E = 0

_nop_()_nop_()_nop_()_nop_()

}

void LcmClear( void )

{

Page = 0

Col = 0

for(Page=0Page<8Page++)

for(Col=0Col<192Col++)

WriteData(0)

}

void LcmInit( void )

{

WriteCommandL(0x3f) //开显示

WriteCommandM(0x3f)

WriteCommandR(0x3f)

WriteCommandL(0xc0) //设置起始地址=0

WriteCommandM(0xc0)

WriteCommandR(0xc0)

WriteCommandL(0x3f) //开显示

WriteCommandM(0x3f)

WriteCommandR(0x3f)

LcmClear()

Col = 0

Page= 0

Locatexy()

}

void LcmPutDots( unsigned char DotByte )

{

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

WriteData( DotByte )

DotByte = ~DotByte

}

}

}

void LcmPutBMP( unsigned char *puts )

{

unsigned int X=0

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

WriteData( puts[X] )

X++

}

}

}

void LcmReverseBMP( void )

{

unsigned char temp

Page = 0

Col = 0

for(Page=0Page<8Page++)

{

for(Col=0Col<192Col++)

{

temp = ReadData() //空读一次

temp = ReadData()

temp = ~temp

WriteData(temp)

}

}

}

void Delay(unsigned int MS)

{

unsigned char us,usn

while(MS!=0)

{

usn = 2 //for 12M

while(usn!=0)

{

us=0xf6

while (us!=0){us--}

usn--

}

MS--

}

}

void Main( void )

{

Delay(200)//等待复位

LcmInit()

LcmClear()

while(1)

{

LcmPutBMP(BMP1)

Delay(1500)

LcmReverseBMP()

Delay(1500)

LcmPutBMP(BMP2)

Delay(1500)

LcmReverseBMP()

Delay(1500)

}

}

更多0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12087009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存