完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#define uchar unsigned char #define uint unsigned int #define DataPort P3 ***it E=P2^0; ***it RW=P2^1; ***it RS=P2^2; ***it PSB=P2^3; uchar code a1[]="啊啊啊啊啊啊啊啊"; uchar code a2[]="哈哈哈哈哈哈哈哈"; uchar code a3[]="啦啦啦啦啦啦啦啦"; uchar code a4[]="呃呃呃呃呃呃呃呃"; uchar d[]={0x98,0x90,0x88,0x80}; /**************延时1ms*count*****************/ void delay(int count) { int x,y; for(x=0;x } /***********忙检测********************/ void Busy() { DataPort=0xFF; RS=0; RW=1; while (1) { E =1; if (P0^7==0) break; } E=0; } /***********写指令子程序****************/ void Write_Com(uchar command) { Busy(); //检测忙标志位 RS=0; RW=0; DataPort=command; //写入指令 E=1; delay(1); E=0; } /***********写数据子程序***************/ void Write_Data(uchar Data) { Busy(); RS=1; RW=0; DataPort=Data; E=1; delay(1); E=0; } /***********LCD初始化*******************/ void Init_LCD(void) { PSB=0; delay(1); PSB=1; //将PSB置1,通信方式为8位数据并口 delay(1); Write_Com(0x30);//30H--基本指令操作 Write_Com(0x34); Write_Com(0x0c);//开显示,关光标,不闪烁。 Write_Com(0x01);//清除显示 Write_Com(0x02); Write_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。 Write_Com(0x04);//显示状态 全关 } /*****************清屏***********************/ void Clear_Lcd(void) { Write_Com(0x01); Write_Com(0x34); Write_Com(0x30); } /*******************逐行显示***************************************/ void Lcd_pos(uchar X,uchar Y) { uchar pos; if (X==1) {X=0x80;} else if (X==2) {X=0x90;} else if (X==3) {X=0x88;} else if (X==4) {X=0x98;} pos = X+Y ; Write_Com(pos); //显示地址 } void main() { uchar i; delay(100); //上电,等待稳定 Init_LCD(); //初始化LCD while(1) { Lcd_pos(1,0); //设置显示位置为第一行 for(i=0;i<16;i++) { Write_Data(a1[i]); delay(30); } Lcd_pos(2,0); //设置显示位置为第二行 for(i=0;i<16;i++) { Write_Data(a2[i]); delay(30); } Lcd_pos(3,0); //设置显示位置为第三行 for(i=0;i<16;i++) { Write_Data(a3[i]); delay(30); } Lcd_pos(4,0); //设置显示位置为第四行 for(i=0;i<16;i++) { Write_Data(a4[i]); delay(30); } Clear_Lcd(); //清屏函数,为下次刷新准备 } } |
|
相关推荐
11个回答
|
|
问题不清楚,具体现在描述太少了,代码也不全,尽量上传一下完整的工程文件。这样好帮你调试,你懂的。
|
|
|
|
|
|
|
|
你用的不是仿真吧!这个程序我看了一下,你的应该类似1602的驱动,也就是说在仿真中用的是LM041,只不过仿真中的模型不带中文字库。 你说的开始时乱码,后来好使了,具体是个什么现象呢?不是很清楚。另外你的忙检测有问题,看一下手册你就知了。我qq441747863,如果你自己确实解决不了了,就加我, |
|
|
|
好的非常感谢! |
|
|
|
客气了
|
|
|
|
我也有同样的问题,你的解决了吗?分享一下方案吧! 我用12864B液晶,显示数字时有的地方正常,有的地方显示的是乱码(偶尔乱码)。是单片机的问题还是程序的问题?高手们指点一下!!!不胜感激!!! #include #include //12864端口定义 #define LCD_DATA P5 //数据口 ***it RS = P3^0; //并行的指令/数据选择信号, H数据, L命令 ***it RW = P3^1; //并行读写选择信号, H读, L写 ***it E = P3^2; //并行使能端, H有效, L无效 ***it PSB = P3^3; //并/串接口选择, H并,L串 ***it RST = P3^4; //复位, L有效 void delayms(unsigned int time) //延时 time * 1ms { unsigned int i,j; for(i = 0; i < time; i++) for(j = 0; j < 300; j++); } bit checkBusy() //检测LCD是否处于忙状态, 若忙返回1, 空闲返回0 { bit busy; RS = 0; RW = 1; E = 1; delayms(1); busy = (bit)(LCD_DATA&0x80); E = 0; return busy; } void wait() //等待LCD到空闲 { while(checkBusy()); } void writeCmd(unsigned char cmd) //写命令 { wait(); RS = 0; RW = 0; E = 0; delayms(1); LCD_DATA = cmd; delayms(1); E = 1; delayms(1); E = 0; } void writeData(unsigned char dat) //写数据 { wait(); RS = 1; RW = 0; E = 0; delayms(1); LCD_DATA = dat; delayms(1); E = 1; delayms(1); E = 0; } void LCD_Init() //初始化LCD屏 { RST = 0; delayms(100); RST = 1; PSB = 1; //并口方式 writeCmd(0x30); //基本指令, 扩充指令为34H delayms(10); writeCmd(0x0c); //显示开, 关光标 delayms(10); writeCmd(0x01); //清屏 delayms(10); } void setPosition(unsigned char x, unsigned char y) { unsigned char p; switch(x%4) { case 0: p = 0x80; break; //第一行开始地址 case 1: p = 0x90; break; //第二行 case 2: p = 0x88; break; //第三行 case 3: p = 0x98; break; //第四行 } p += y; writeCmd(p); } void writeString(unsigned char * str) { unsigned char i = 0; while(str[i] != ' |