LCD1602显示
-
概述
LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)
-
引脚说明
//电源 VSS -- GND VDD -- 5V //对比度 VO -- GND //控制线 RS -- P1.0 RW -- P1.1 E -- P1.4 //背光灯 A -- 5V K -- GDN //数据 D0到D7 -- P0.0到P0.7
-
开发逻辑
-
在哪里显示
例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)
-
显示什么
-
读写操作时序
-
读操作时序
-
写操作时序
-
数序参数
-
-
显示一个字符
#include "reg52.h" #include "intrins.h" #define BUFF P0 /* 控制线接口: RS -- P1.0 RW -- P1.1 E -- P1.4 */ sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy()//每次写指令,读/写数据操作均需要检测忙信号 { char tmp = 0x80; BUFF = 0x80; while(tmp & 0x80){ RS = 0; RW = 1; EN = 0; _nop_(); EN = 1; _nop_(); tmp = BUFF; _nop_(); _nop_(); EN = 0; _nop_(); } } void Write_cmd(char cmd)//写指令 { check_busy(); RS = 0; RW = 0; EN = 0; _nop_(); BUFF = cmd; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Write_data(char _data)//写数据 { check_busy(); RS = 1; RW = 0; EN = 0; _nop_(); BUFF = _data; _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()//LCD1602初始化 { //(1)延时 15ms Delay15ms(); //(2)写指令 38H(不检测忙信号) Write_cmd(0x38); //(3)延时 5ms Delay5ms(); //(4)以后每次写指令,读/写数据操作均需要检测忙信号 //(5)写指令 38H:显示模式设置 Write_cmd(0x38); //(6)写指令 08H:显示关闭 Write_cmd(0x08); //(7)写指令 01H:显示清屏 Write_cmd(0x01); //(8)写指令 06H:显示光标移动设置 Write_cmd(0x06); //(9)写指令 0CH:显示开及光标设置 Write_cmd(0x0c); } void main() { char cmd = 0x80 + 0x05;//第一行第五个位置 char _data = 'C'; LCD1602_init(); Write_cmd(cmd); Write_data(_data); }
-
显示一行字符
#include "reg52.h" #include "intrins.h" #define BUFF P0 /* 控制线接口: RS -- P1.0 RW -- P1.1 E -- P1.4 */ sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy()//每次写指令,读/写数据操作均需要检测忙信号 { char tmp = 0x80; BUFF = 0x80; while(tmp & 0x80){ RS = 0; RW = 1; EN = 0; _nop_(); EN = 1; _nop_(); tmp = BUFF; _nop_(); _nop_(); EN = 0; _nop_(); } } void Write_cmd(char cmd)//写指令 { check_busy(); RS = 0; RW = 0; EN = 0; _nop_(); BUFF = cmd; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Write_data(char _data)//写数据 { check_busy(); RS = 1; RW = 0; EN = 0; _nop_(); BUFF = _data; _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(0x38); //(3)延时 5ms Delay5ms(); //(4)以后每次写指令,读/写数据操作均需要检测忙信号 //(5)写指令 38H:显示模式设置 Write_cmd(0x38); //(6)写指令 08H:显示关闭 Write_cmd(0x08); //(7)写指令 01H:显示清屏 Write_cmd(0x01); //(8)写指令 06H:显示光标移动设置 Write_cmd(0x06); //(9)写指令 0CH:显示开及光标设置 Write_cmd(0x0c); } void LCD1602_print_line(char line,char col,char *string)//写入一行数据 { switch(line){//switch选择那一行 case 1: Write_cmd(0x80+col);//col 决定从哪个地方开始 while(*string){ Write_data(*string); string++; } break; case 2: Write_cmd(0x80+0x40+col); while(*string){ Write_data(*string); string++; } break; } } void main() { LCD1602_init(); LCD1602_print_line(1,0,"hello world"); LCD1602_print_line(2,0,"to be number one"); }