控制器HD44780驱动资料2004液晶测试程序
单片机技术 •
作者: qpzmg
前两天在淘宝上拍了四块2004液晶,为了测试一下,于是就东拼西凑弄了两个C51的测试程序,一个是连接八条数据线的,另一个是连接四条数据线的。在下图的2004液晶上测试通过。
两个C51单片机的测试程序,一个是连接八条数据线的,另一个是连接四条数据线的。附件里有原程序和proteus仿真文件。
单片机源程序如下:
- /*=========================================================
- LCD2004模拟口线接线方式 连接线图: =
- —————————————————- =
- | LCM—–51 | LCM—–51 | LCM——51 | | =
- —————————————————| =
- | | RS ——-P3.5 | | =
- | | RW——- GND | | =
- | | E ——–P3.4 | | =
- | | | | =
- | DB4—–P0.4 | | | =
- | DB5—–P0.5 | | | =
- | DB6—–P0.6 | | | =
- | DB7—–P0.7 | | | =
- —————————————————- =
- [注:AT89S51 使用 11.0592M 晶体震荡器] =
- =========================================================*/
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LCM_RS=P3^5; //定义引脚
- sbit LCM_E =P3^4;
- sbit LED =P2^5;//LED 的输出锁存端
- sbit dula =P2^6;//数码管的段锁存端 74HC573
- sbit wela =P2^7;//数码管的位锁存端
- #define LCM_Data P0
- #define Busy 0x80 //用于检测 LCM 状态字中的 Busy 标识
- uchar num;
- uchar code table0[]=”ABCDEFGHIJKLMNOPQRST”;
- uchar code table1[]=”01234567890123456789″;
- uchar code table2[]=”UVWXYZ!@#%&?+<[>]*-;”;
- uchar code table3[]=”abcdefghijklmnopqrst”;
- void delay(uint z)//延时函数
- {
- uint x,y;
- for(x=z;x>0;x–)
- for(y=110;y>0;y–);
- }
- //写数据 RS=H,RW=L,D0~D7=数据,E=高脉冲
- void WriteDataLCM(uchar Data)
- {
- LCM_RS = 1;
- LCM_E = 0;
- LCM_Data =(Data & 0xF0);
- LCM_E = 1;
- delay(5);
- LCM_E = 0;
- LCM_Data =(Data & 0x0F)<<4;
- LCM_E = 1;
- delay(5);
- LCM_E = 0;
- }
- //写指令 RS=L,RW=L,D0~D7=指令码,E=高脉冲
- void WriteCommandLCM(uchar Command)
- {
- delay(5); //短暂延时,代替检测忙状态
- LCM_RS = 0;
- LCM_E = 0;
- LCM_Data =( Command & 0xF0);
- LCM_E = 1;
- delay(5);
- LCM_E = 0;
- LCM_Data =( Command & 0x0F )<<4;
- LCM_E = 1;
- delay(5);
- LCM_E = 0;
- }
- //读数据 RS=H,RW=H,E=H
- //读状态 RS=L,RW=H,E=H
- //由于不要检测忙,所以读数据和读状态两个函数省略
- void LCMInit(void) //LCM 初始化
- {
- WriteCommandLCM(0x03);
- delay(5);
- WriteCommandLCM(0x02);
- delay(5);
- WriteCommandLCM(0x28); //显示模式设置,开始要求每次检测忙信号
- WriteCommandLCM(0x0C);
- WriteCommandLCM(0x06); // 显示光标移动设置
- WriteCommandLCM(0x01);
- delay(5);
- }
- void main(void)
- {
- LED=0; //将LED的锁存端关闭
- dula=0;//将数码管的段锁存端关闭
- wela=0;//将数码管的位锁存端关闭
- LCMInit(); //LCM 初始化
- //第一行显示
- WriteCommandLCM(0x80+0x00);
- for(num=0;num<20;num++)
- {
- WriteDataLCM(table0[num]);
- delay(250);
- }
- //第二行显示
- WriteCommandLCM(0x80+0x40);
- for(num=0;num<20;num++)
- {
- WriteDataLCM(table1[num]);
- delay(250);
- }
- //第三行显示
- WriteCommandLCM(0x80+0x14);
- for(num=0;num<20;num++)
- {
- WriteDataLCM(table2[num]);
- delay(250);
- }
- //第四行显示
- WriteCommandLCM(0x80+0x54);
- for(num=0;num<20;num++)
- —–限于篇幅余下内容下载附件———-
复制代码