LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)
第 1 脚: VSS 为电源地与单片机的接线:

在哪里显示:

例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实 际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)
显示什么:
读操作时序:
写操作时序:
数序参数:

代码示例:
- #include "reg52.h"
- #include "intrins.h"
- /*
- RS -- P1.0
- RW -- P1.1
- E -- P1.4 */
- #define databuffer P0 //定义8位数据线,Po端口组
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^4;
-
- void check_busy()
- {
- char tmp = 0x80;
- databuffer = 0x80;
-
- while(tmp & 0x80){//1000 0000
- RS = 0;
- RW = 1;
- EN = 0;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- tmp = databuffer;
- EN = 0;
- _nop_();
- }
- }
-
- void Write_Cmd_Func(char cmd)
- {
- check_busy();
- RS = 0;
- RW = 0;
-
- EN = 0;
- _nop_();
- databuffer = cmd;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- EN = 0;
- _nop_();
- }
-
- void Write_Data_Func(char dataShow)
- {
- check_busy();
- RS = 1;
- RW = 0;
-
- EN = 0;
- _nop_();
- databuffer = dataShow;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- EN = 0;
- _nop_();
- }
-
- void Delay15ms() //@11.0592MHz
- {
- unsigned char i, j;
-
- i = 27;
- j = 226;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
-
- i = 9;
- j = 244;
- do
- {
- while (--j);
- } while (--i);
- }
-
-
- void LCD1602_INIT()
- {
- //(1)延时 15ms
- Delay15ms();
- //(2)写指令 38H(不检测忙信号)
- Write_Cmd_Func(0x38);
- //(3)延时 5ms
- Delay5ms();
- //(4)以后每次写指令,读/写数据操作均需要检测忙信号
- //(5)写指令 38H:显示模式设置
- Write_Cmd_Func(0x38);
- //(6)写指令 08H:显示关闭
- Write_Cmd_Func(0x08);
- //(7)写指令 01H:显示清屏
- Write_Cmd_Func(0x01);
- //(8)写指令 06H:显示光标移动设置
- Write_Cmd_Func(0x06);
- //(9)写指令 0CH:显示开及光标设置}
- Write_Cmd_Func(0x0c);
- }
-
- void main()
- {
- char position = 0x80 + 0x05;
- char dataShow = 'C';
- LCD1602_INIT();
- Write_Cmd_Func(position);//选择要显示的地址
- Write_Data_Func(dataShow);//发送要显示的字符
-
- }
-
代码示例:
- #include "reg52.h"
- #include "intrins.h"
- /*
- RS -- P1.0
- RW -- P1.1
- E -- P1.4 */
- #define databuffer P0 //定义8位数据线,Po端口组
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^4;
-
- void check_busy()
- {
- char tmp = 0x80;
- databuffer = 0x80;
-
- while(tmp & 0x80){//1000 0000
- RS = 0;
- RW = 1;
- EN = 0;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- tmp = databuffer;
- EN = 0;
- _nop_();
- }
- }
-
- void Write_Cmd_Func(char cmd)
- {
- check_busy();
- RS = 0;
- RW = 0;
-
- EN = 0;
- _nop_();
- databuffer = cmd;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- EN = 0;
- _nop_();
- }
-
- void Write_Data_Func(char dataShow)
- {
- check_busy();
- RS = 1;
- RW = 0;
-
- EN = 0;
- _nop_();
- databuffer = dataShow;
- _nop_();
- EN = 1;
- _nop_();
- _nop_();
- EN = 0;
- _nop_();
- }
-
- void Delay15ms() //@11.0592MHz
- {
- unsigned char i, j;
-
- i = 27;
- j = 226;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
-
- i = 9;
- j = 244;
- do
- {
- while (--j);
- } while (--i);
- }
-
-
- void LCD1602_INIT()
- {
- //(1)延时 15ms
- Delay15ms();
- //(2)写指令 38H(不检测忙信号)
- Write_Cmd_Func(0x38);
- //(3)延时 5ms
- Delay5ms();
- //(4)以后每次写指令,读/写数据操作均需要检测忙信号
- //(5)写指令 38H:显示模式设置
- Write_Cmd_Func(0x38);
- //(6)写指令 08H:显示关闭
- Write_Cmd_Func(0x08);
- //(7)写指令 01H:显示清屏
- Write_Cmd_Func(0x01);
- //(8)写指令 06H:显示光标移动设置
- Write_Cmd_Func(0x06);
- //(9)写指令 0CH:显示开及光标设置}
- Write_Cmd_Func(0x0c);
- }
-
- void LCD1602_showLine(char row, char col, char *string)
- {
-
- switch(row){
-
- case 1:
- Write_Cmd_Func(0x80+col);
- while(*string){
- Write_Data_Func(*string);
- string++;
- }
- break;
-
- case 2:
- Write_Cmd_Func(0x80+0x40+col);
- while(*string){
- Write_Data_Func(*string);
- string++;
- }
- break;
-
- }
- }
-
- void main()
- {
- char position = 0x80 + 0x05;
- //char dataShow = 'C';
- LCD1602_INIT();
- LCD1602_showLine(1,5,"NO.1");
- LCD1602_showLine(2,0,"zgl nb");
-
- }
-