学习关键:先看懂液晶操作时序图(写操作:写命令、写数据) 读状态 | 输入 | 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 }
|