【单片机】16-LCD1602和12864和LCD9648显示器
1.LCD显示器相关背景
1.LCD简介
(2)LCD(Liquid Crystal Display),液晶显示器,原理介绍
(3)LCD应用领域:手机,电脑
(4)将来取代LCD:LED,OLED【全面屏---软性】
2.电子显示器的原理
1.像素(分辨率)
显示单元【液晶分子】
但是实际上:像素!=分辨率
比如:出厂时电脑的像素已经确定,就是最大的显示【比如是1920*1080】,所以最大的分辨率是1920*1080,但是不能超过1920*1080,却可以小于1920*1080
2.显存
用来做显示的内存【电子显示效果跟内存有关】
找一块空间来存储像素和内存的对应关系。【将要显示的内容丢到显存中---存储的是要显示的内容与液晶分子的一一对应关系】
3.字模
字的模型。表示将这个字如何对应到显示器中。【将“A“放入相同的分辨率的显示器上,会产生不同的字模】
4.字库
字模形成的库。
5.控制器(关键)和驱动器
LCD显示器中的2个器件
控制器:方向盘,挂挡---跟CPU对接---靠近软件
驱动器:马达,发动器---将要显示的东西打到液晶显示器上---靠近硬件
6.软件+硬件实现功能
2.LCD1602
1.简介
1.为什么叫1602
16*2--》显示器可以显示的字符【显示器可以显示2排,每排16个】
能显示的字符数是32,但是像素数不是32,因为一个字符是由多个像素组成的。有可能一个字符是由5*7=35个像素组成的,也有可能是由6*8=48给像素组成的。但是我们不用去管,因为LCD1602内置了字库了。
2.带ASCII码字库,不能显示中文
当我们想要让LCD1602显示某一个ASCII码字符时候,只需要将这个字符对应的ASCII码发给LCD1602内部的控制器,控制器就会去查字库就得到字模,如何将字模发给内部的驱动器去驱动LCD做显示。
2.原理图和接线引脚
1.引脚分为:数据接口+控制接口
16根线:2根VCC,2根GND,1根VO(调节屏幕亮度),RS+RW+E(控制信号线),DB0-DB7(数据线)
2.并行接口
串行:就是数据线只有1根(I2C中的SDA),同时只能传输1个bit位,如果要传送多个bit位必须分时传输。
并行:就是数据线有很多根,每一根可以传输1个bit位,所以同时可以传输多个bit位。
如LCD1602有8根数据线,所以一次同时传输8bit位
3.背光调节
1根VO(调节屏幕亮度)
4.接线确认
3.数据手册
LCD1602数据手册速览 - 电子组培训文档
https://www.dfrobot.com.cn/image/data/DFR0063/CN/HD44780.pdf
1.LCM和LCD
LCM:就是lcd module(LCD模组)
2.主要技术参数解析
3.引脚定义(结合原理图来对照分析)
4.控制器接口说明(主要控制器型号)
RS=1时候,D0-D7上传输的是数据
RS=0时候,D0-D7上传输的是命令
RW=1时候,表示我们要读
RW=0时候,表示我们要写
E=1时候,表示使能 enable
E=0时候,表示禁止(禁能) disable
3.LCD1602控制器的底层时序
1.关键点
(1)时序走控制接口引脚
(2)指令码,状态字,数据,这三个走数据接口
(3)注意是并行的
2.控制器接口
3.读状态时序分析(判断是否在忙)
判断当前LCD是否有在显示数据
对控制器每一次进行读写操作之前,都必须进行读写检测,确保bit7==0
状态字的解析方法
读状态:RS=0;RW=1;RE=1;
读取状态字的bit7位,如果此时bit7=1--》表示此时还在显示东西,此时不可以进入
bit7=0---》表示此时没有显示东西,可以开始显示
//基本操作时序:读状态:输入RS=0,RW=1,EN=1 输出:bit0-bit7--》状态 void Read_Busy{ //忙检测函数,判断bit7是0:允许执行;1禁止 unsigned char sta; LCD1602_DB=0xff; LCD1602_RS=0; LCD1602_RW=1; do{ LCD1602_EN=1;//使能 sta=LCD1602_DB;//读取8个bit位的状态 LCD1602_EN=0; //如果sta&0x80==1,表示sta的bit7为1,则表示禁止状态,还要继续循环 }while(sta & 0x80); }
4.写指令时序分析
void Lcd1602_Write_Cmd(unsigned char cmd){ Read_Busy(); LCD1602_RS=0; LCD1602_RW=0; LCD1602_DB=cmd; //写入bit0-bit7 LCD1602_EN=1; LCD1602_EN=0; }
5.读数据时序分析
读数据实际上是读”显存“
但是实际上我们不需要
6.写数据的时序分析
void Lcd1602_Write_Data(unsigned char dat){ //写数据 Read_Busy(); LCD1602_RS=0; LCD1602_RW=0; LCD1602_DB=dat; //将数据写入 LCD1602_EN=1; LCD1602_EN=0; }
注意点:
写指令-->RS=0
写数据-->RS=1
7.RAM地址映射图
芯片范围是0-39每行,但是实际只用了0-15每行
将”A“给00这个空间,这个00会自动查找该位
4.指令说明
1.显示模式设置
lcd1602_write_cmd(0x38);//设置16*2显示,数据总线8位,5*7点阵/字符
2.显示开/关及光标设置
// 本函数用来设置当前光标位置,其实就是设置当前正在编辑的位置, // 其实就是内部的数据地址指针,其实就是RAM显存的偏移量 // x范围是0-15,y=0表示上面一行,y=1表示下面一行 void lcd1602_set_cursor(unsigned char x,unsigned char y){//显示坐标位置 unsigned char addr;//鼠标所在位置 if(y==0){//第一行 addr=0x00+x; }else{//第二行 //LCD1602是一行只能显示16个,但是实际上一行有40 addr=0x40+x; } lcd1602_write_cmd(addr|0x80); }
关闭显示:0000 1000 0x08
打开显示不显示光比 : 0000 1100 0x0c
打开显示并且显示光标且光标闪烁: 0000 1111 0x0f
地址指针自动+1,整体屏幕不移动 :0000 0110 0x06
3.数据控制
控制器内部设有一个数据地址指针,用户可以通过它们来访问内部的全部80字节RAM
1.数据指针设置
0x80+(0x00-0x0f) 第一行设置地址指针指令
0x80+(0x40-0x4f) 第二行设置地址指针指令
2.读数据
3.写数据
4.其他设置
0x01 显示清屏
0x02 显示回车
5.初始化过程
void lcd1602_init(void) { lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符 lcd1602_write_cmd(0x08);//显示关闭【可以省略】 lcd1602_write_cmd(0x01);//显示清屏【可以省略】 lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁 lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动 lcd1602_write_cmd(0x01);//清屏 }
4.显示字符
可以进行换行的
/******************************************************************************* * 函 数 名 : lcd1602_show_string * 函数功能 : LCD1602显示字符 * 输 入 : x,y:显示坐标,x=0~15,y=0~1; str:显示字符串 * 输 出 : 无 *******************************************************************************/ void lcd1602_show_string(u8 x,u8 y,u8 *str) { u8 i=0; if(y>1||x>15)return;//行列参数不对则强制退出 if(y