lcd1602的三种显示模式仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #define uc unsigned char
- #define ui unsigned int
- #define out P0
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit e=P2^2;
- void prime(void); //初始化函数
- void busy(void); //检查忙标志位函数
- void command(uc com); //写命令
- void wdata(uc dat); //写数据
- void string(ui ad,uc *s); //指针直接输入显示函数(ad=行列位置,*s=字符)
- //void tu(ui h,ui l,ui d); //显示单位字符函数(h=行,l=列,d=字符)
- //void display(ui h,ui l,ui z);//显示三位数字字符函数 (h=行,l=列,z=字符)
- void delay(int x); //延迟函数
- void delay(x) //延迟函数
- {int i;
- while(x)
- {
- for(i=0;i<125;i++);
- x--;
- }
- }
- void busy(void) //检查忙标志位函数
- {uc dt;
- do
- {dt=0xff;
- e=0;
- rs=0;
- rw=1;
- e=1;
- dt=out;
- }while(dt&0x80);
- e=0;
- }
- void command(uc com) //写命令
- {busy();
- e=0;
- rs=0;
- rw=0;
- out=com;
- e=1;
- delay(1);
- e=0;
- delay(1);
- }
- void wdata(uc dat) //写数据
- {busy();
- e=0;
- rs=1;
- rw=0;
- out=dat;
- e=1;
- delay(1);
- e=0 ;
- delay(1);
-
- }
- void prime(void) //初始化函数
- {command(0x38); //功能设置:5*7点阵,8位数据接口
- command(0x01); //清屏
- command(0x06); //显示模式设置
- command(0x0c); //显示开关及光标设置
- delay(1);
- }
- void string(ui ad,uc *s) //指针直接输入显示函数(ad=行列位置,*s=字符)
- {command(ad); //行列设置0x85:字符在第二行第五列开始显示,0xcc:字符在第二行第十二列开始显示。
- while(*s>0)
- {
- wdata(*s++);
- delay(10);
- }
- }
- //void display(ui h,ui l,ui z) //显示单位字符函数(h=行,l=列,d=字符)
- //{ if(h==1) //如果h=1就在第一行
- // {
- // command(0x80+l); //l为多少就从哪里显示
- // }
- // if(h==2) //如果h=2就在第二行
- // {
- // command(0xc0+l);
- // }
- // wbata(z); //只能输入一个字符(可以是lcd1602可以显示的任意字符)
- //}
- //void tu(ui h,ui l,ui d) //显示三位数字字符函数(h=行,l=列,z=字符)
- //{ display(h,l,d/100%10+'0'); //只能显示数字
- // display(h,l+1,d/10%10+'0');
- // display(h,l+2,d%10+'0');
- //}
- main()
- {prime();
- while(1)
- {ui a=121,b=567;
- string(0x80,"Come on");
- string(0xc0,"No question");
- // display(1,0,'1');
- // display(2,15,'A');
- // tu(1,0,b);
- // tu(2,0,a);
- delay(1000);
- command(0x01);
- delay(1);
- }
- }
复制代码
所有资料51hei提供下载:
LCD1602.zip
(69.38 KB, 下载次数: 22)
|