void LCD_initialize()//初始化函数 { write_command(0x38); _nop_(); write_command(0x0c); _nop_(); write_command(0x0b); _nop_(); write_command(0x01); delay(1); } 这个你把0xb改为0x6就可以显示,但是显示是一次显示的。我用自己的实验板演示了以下。 |
检查一下是a6还是a18 |
* 指针运算符 //*p为p所指向的存储单元的内容 p就相当于存储单元地址 |
谢谢蟹蟹,还有个问题,这两个*都不可省略嘛???? |
*是指针 |
void string(uchar ad,uchar *p,uchar n)//显示字符函数 { uchar i; write_command(ad); for(i=0;i<n;i++) { write_data(*p++); delay(100); } } 请问这个*号是什么呢?为什么去掉之后就不对了,而显示乱码 |
时序问题或者电位器 |
zl2168 发表于 2018-5-2 12:52 已经改好了,多谢帮助! |
wulin 发表于 2018-5-2 16:27 行,已经改好了,多谢帮助! |
![]() 改了一下,实物验证正常。 #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define out P0 sbit RS=P2^0;//将P2口的0,1,2号口作为RS RW E的接口 sbit RW=P2^1;// sbit E=P2^2;// //void LCD_initialize();//初始化函数 //void check_busy();//查忙函数,但是这次没有用到 //void write_command(uchar com);//写命令函数 //void write_data(uchar dat);//写数据函数 //void string(uchar ad,uchar*p,uchar n);//使Lcd显示字符的函数 //void delay(uchar i);//延时函数 void delay(uchar i)//延时函数 { uchar t; while(i--) { for(t=0;t<120;t++); } } void write_command(uchar com)//写命令函数 { // delay(1); E=0; RS=0; // RW=0; out=com; delay(1); E=1; delay(1); E=0; // delay(1); } void write_data(uchar dat)//写数据函数 { // delay(1); // E=0; RS=1; // RW=0; out=dat; delay(1); E=1; delay(1); E=0; // delay(1); } void LCD_initialize()//初始化函数 { RW=0; write_command(0x38); write_command(0x01); write_command(0x0c); write_command(0x06); // write_command(0x0b); write_command(0x80); } void string(uchar ad,uchar *p,uchar n)//显示字符函数 { uchar i; write_command(ad); for(i=0;i<n;i++) { write_data(*p++); delay(100); } } void main() { LCD_initialize();//LCD初始化 while(1) { string(0x85,"welcome",7);//写入welcome string(0xc2,"Harbin China",12);//写入Harbin China delay(100); write_command(0x01);//清屏 delay(100); } } |
实例67 LCD1602显示屏显示 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1。书中电路和程序设计有详细说明,程序语句条条有注解。 |