LCD1602学习——Proteus仿真(显示操作)
学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)
读状态 |
输入 |
RS=L,R/W=H,E=H |
输出 |
D0—D7=状态字 |
写指令 |
输入 |
RS=L,R/W=L,D0—D7=指令码,E=高脉冲 |
输出 |
无 |
读数据 |
输入 |
RS=H,R/W=H,E=H |
输出 |
D0—D7=数据 |
写数据 |
输入 |
RS=H,R/W=L,D0—D7=数据,E=高脉冲 |
输出 |
无 |
由时序图可知,写操作时(包括写指令、写数据),RS=0;RW=0;再进行I/O口写操作,然后使能端口完成一次高脉冲(——高——低),这是液晶就会执行写操作的内容;
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
序号 |
指令 |
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
1 |
清显示 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
2 |
光标返回 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
3 |
置输入模式 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
4 |
显示开/关控制 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
5 |
光标或字符移位 |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
6 |
置功能 |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
7 |
置字符发生存贮器地址 |
0 |
0 |
0 |
1 |
字符发生存贮器地址 |
|||||
8 |
置数据存贮器地址 |
0 |
0 |
1 |
显示数据存贮器地址 |
||||||
9 |
读忙标志或地址 |
0 |
1 |
BF |
计数器地址 |
||||||
10 |
写数到CGRAM或DDRAM) |
1 |
0 |
要写的数据内容 |
|||||||
11 |
从CGRAM或DDRAM读数 |
1 |
1 |
读出的数据内容 |
思路:
1、控制液晶显示输出,需要对其进行写数据(写数据前,同样需要先告诉液晶你下一步要在哪里写,因此写数据前,要写命令先设定数据指针)
程序设计方式:
write_com();//写命令函数,
write_date();//写数据函数
2、由于要先进行初始化,(初始化实际就是对液晶写指令,告诉其工作方式等)因此初始化函数里面自然就需要调用写命令函数write_com();
程序结构如下:
int init()
{
EN = 0;
write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0X0C);//设置开显示,不显示光标
write_com(0X06);//写一个字符时,整屏右移
write_com(0X01);//显示清零
return 0;
}
主函数部分程序结构:
int main()
{
init();//调用初始化函数
write_com(0x80);//调用写指令函数,设置写数据开始指针(第一行)
for(x=0;x<6;x++)//数据写入循环程序
{
write_date(table[x]);
delay(150);
}
write_com(0x80+0x40); ;//调用写指令函数,设置写数据开始指针(第二行)
for(x=0;x<17;x++)//数据写入循环程序
{
write_date(table1[x]);
delay(150);
}
while(1);
return 0;
}
完整程序如下:
1 #include<reg52.h> 2 int init(); //声明初始化函数 3 int write_com(unsigned char);//声明写命令函数 4 int write_date(unsigned char);//声明写数据函数 5 int delay(unsigned char);//声明延迟函数 6 unsigned char x; 7 sbit RS = P1^0; 8 sbit RW = P1^1; 9 sbit EN = P1^2; 10 unsigned char code table[]="HELLO!"; 11 unsigned char code table1[]="MY name is Terry!"; 12 13 int main(void)//主函数 14 { 15 init(); 16 write_com(0x80); 17 for(x=0;x<6;x++) 18 { 19 write_date(table[x]); 20 delay(150); 21 } 22 write_com(0x80+0x40); 23 for(x=0;x<17;x++) 24 { 25 write_date(table1[x]); 26 delay(150); 27 } 28 while(1); 29 return 0; 30 } 31 32 int init()//初始化函数体 33 { 34 EN = 0; 35 write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口 36 write_com(0X0C);//设置开显示,不显示光标 37 write_com(0X06);//写一个字符时,整屏右移 38 write_com(0X01);//显示清零 39 return 0; 40 } 41 42 int write_com(unsigned char com)//写命令的函数体 43 { 44 RS = 0; 45 RW = 0; 46 P0 = com; 47 delay(5); 48 EN = 1; 49 delay(5); 50 EN = 0; 51 return 0; 52 } 53 54 int write_date(unsigned char date)//写数据的函数体 55 { 56 RS = 1; 57 RW = 0; 58 P0 = date; 59 delay(5); 60 EN = 1; 61 delay(5); 62 EN = 0; 63 return 0; 64 } 65 66 int delay(unsigned char xms) 67 { 68 unsigned char x,y; 69 for(x=xms;x>0;x--) 70 for(y=110;y>0;y--); 71 return 0; 72 }
显示输出如下: