历史上的今天
今天是:2024年10月20日(星期日)
2021年10月20日 | 【自学51单片机】12 --- 1602液晶初步认识
2021-10-20 来源:eefocus
1、1602液晶硬件接口介绍
1602液晶技术参数

说明:(1) 工作电流:在5v工作电压下液晶的工作电流为2mA,仅仅指液晶,不包括背光。
1602液晶接口原理图及引脚功能
说明:(1) 引脚3:液晶显示偏压信号。用来调整显示黑点与不显示黑点的对比度。(2) 4引脚:数据命令选择引脚。置高电平1,为读写数据,置低电平0,为读写命令。(3) 5引脚:读写选择引脚。置高电平1,为读数据或命令,置低电平0,为写数据或命令。(4) 6引脚:使能信号引脚。高电平有效,低电平无效。(5) 7~14引脚:8个数据引脚。因为总电流不大,直接接到PO口上,不用通过74HC245。
2、1602的读写时序介绍
液晶内部自带80字节的显示RAM,用来存储发送的数据,内部RAM如下图

说明:(1) 1603字符液晶是显示字符的,字符要跟ASCII码字符表对应,比如液晶显示字符’1’, 就要向对应地址发送数据字符‘1’或十六进制31,或十进制49。(2) 第一行的地址0x00 ~ 0x27,第二行的地址0x40 ~ 0x67。第一行的0x00 ~ 0x0F与液晶第一行16个字符显示地址对应。第二行的0x40 ~ 0x4F与液晶第二行16个字符显示地址对应.每行多出来的地址用于显示移动字幕。
1602液晶基本操作有四个时序,理解,运用1602液晶查阅即可
读状态:RS = L(0), R/W = H(1),E= H(1);
单片机读1602液晶的状态,是通过读取液晶里的状态字字节内容,来了解液晶内部情况,液晶状态字字节如下表12-5,

说明:(1) 状态字节有八位,最高位表示当前液晶是否在 ‘忙’ (给液晶写数据或命令,液晶需先保存到缓存,然后再写到液晶内部寄存器或RAM中,这个需要一定时间),1表示液晶在忙,在忙时禁止读者读写数据或命令操作,0则可以。低七位表示当前数据指针的位置,一般低七位很少用到。(2) 单片机读外设状态时,需要保证接收状态信息的引脚为高电平。所以在读取液晶状态时,P0口要先保证为高电平。(3) 因其他外设和液晶都共用P0口总线,若读完液晶状态仍保持液晶E使能信号引脚为高电平,则液晶会继续输出状态值,因状态值在P0口输入,将会干扰到其他外设的P0口总线的数据,所以读完液晶状态要拉低E使能信号引脚来释放P0总线。
以上说明,在单片机读取液晶状态程序部分体现,见下程序。
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;//引脚声明
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
//等待液晶准备好
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB; //读取状态字
LCD1602_E = 0;//bit7等于1表示液晶正在忙,重复检测直到其等于0为止
}while(sta & 0x80);
}
读数据:RS = H(1),RW = H(1),E = H(1), 读数据不常用。
写指令:RS = L(0),RW = L(0),D0 ~ D7 = 指令码,E = 高脉冲。
说明:(1) E = 高电平:E使能引脚先从低到高,再从高到低,形成一个高脉冲。
写数据:RS = H(1),RW = L(0),D0 ~ D7 = 指令码,E = 高脉冲
说明:(1) 液晶内部有一个指针,它指向哪里,我们写的数据就会送到相应的那个地址。
3、1602液晶的指令介绍
单片机给液晶写指令有5种设置,理解,查阅1602液晶手册
显示模式设置

说明:固定0x38即可
显示开/关以及光标设置

数据指针及移动设置

清屏指令

RAM地址设置指令

说明:该指令最高位为1,低七位为RAM地址,十六进制0x80+地址码,在程序中用 (0x80 | 地址码)来表示该指令。在读写程序中先设置地址,然后进行数据的读写操作。
4、1602液晶简单示例
//160LCD显示指定字符
#include #define Lcd1602_DB P0 sbit Lcd1602_RS = P1^0; sbit Lcd1602_RW = P1^1; sbit Lcd1602_E = P1^5; void InitLcd1602(); void Lcdwritecmd(unsigned char cmd); void LcdWaitReady(); void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str); void Lcdcursor(unsigned char x, unsigned char y); void LcdWritedat( unsigned char str); void main() { InitLcd1602(); LcdShowstr(5, 0, "L Z Y"); LcdShowstr(3, 1, "come on!!!"); while(1); } //初始化1602液晶 void InitLcd1602() { Lcdwritecmd(0x38);//16*2显示,5*7点阵,8位数据口 Lcdwritecmd(0x0C); //显示器开,光标关闭 Lcdwritecmd(0x06);//文字不动,地址自动加+1 Lcdwritecmd(0x01);//清屏 } //向LCd1602写入一个一字节命令,cmd为待写入命令值 void Lcdwritecmd(unsigned char cmd) { LcdWaitReady(); Lcd1602_RS = 0; Lcd1602_RW = 0; Lcd1602_DB = cmd; Lcd1602_E = 1; Lcd1602_E = 0; } //等待液晶准备好 void LcdWaitReady() { unsigned char sta; Lcd1602_DB = 0xFF; Lcd1602_RS = 0; Lcd1602_RW = 1; do{ Lcd1602_E = 1; sta = Lcd1602_DB;//读取状态字 Lcd1602_E = 0; }while(sta & 0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止 } //在液晶上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符指针 void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str) { Lcdcursor(x, y);//设置起始地址 while(*str != '






