LCD简介
(1)显示器,常见显示器
(2)LCD(Liquid Crystal Display),液晶显示器,原理介绍
(3)LCD应用领域
(4)LED OLED
1.17.1.2、电子显示器的原理
(1)像素(分辨率)
(2)显存,用来做显示的内存
(3)字模
(4)字库
(5)控制器和驱动器
(6)软件+硬件实现功能
1.17.1.3 1602显示屏
简介:为什么叫1602(16*2显示器显示2排,每排16个字符)。能显示的字符数为 32。此时32不是像素,像素可能是 5*7,我们编程时只需要把相应的字符的的ascii码,送给液晶驱动器(软件做到这里就可以了),控制器就会自动将此字符的字模与字库相对应。发给驱动器去驱动LCD显示。
1.17.3.2原理图和接线引脚
(1)引脚分为:数据线(8位(bit0-bit7)) + 控制接口 (3根(W/R、RS、E))+背光VO+电源地
并行接口: 相比之前的SPI、IIC是串行接口。他每次只能传输一个 bit位,每一个SCL 传输一位(分时传送)。但是并行接口(8位)一次传输 8位数据。相比较代价较大。
数据手册:
LCM (LCD 模组) 我们只是和LCD的控制器打交道(HD44780芯片)
主要技术参数、接口信号 :RS(命令/数据)W/R(写/读选择端)E(使能端)
截屏的功能就是读显示屏的数据。
3.RAM地址映射图
这个就是我们说的是 显存 80个字节。总共有2*40。但是我们显示时只用了 16 * 2 个内存。
譬如我要显示 一个 大写字母 A,我们需要把 大写字母A的字模放到这个显存中去,但是这个芯片本身是带字库的,我们只需要给他索引值,那么他是如何查找的呢?就是靠ASCII码,我只需要把 'A'的ascii码,写入到显存中去。就显示了。编程本身是挺简单的。
指令说明:
00001000 0x08 // 关闭光标
需要写在任意位置需要改变 写入显存的地址才能在改变后的位置显示。
手册上的严格时序:
杜绝显示屏刚开始时,显示屏上显示杂乱的东西。
1.17.712864显示屏:
(1)128p*64p (注意不是字符而是pixel)和1602不一样。
(2)本身是没有字库的,需要自己制作字模给LCD12864内部的控制器。
(3)可以显示文字和图片
1.17.7.2原理图和数据手册和接线
原理图注意转接板的引脚对应
数据手册分两个(lcd12864模组 和 它的内部的控制器(芯片ST7565p) ),
lcd12864模组 数据手册里面并没有与编程有关的内容。除过interface description( chip脚 一 一对应 (从原理图 到 转接板 到 12864模组的数据手册chip脚) 这里稍有繁杂)抓住关键点。
编程接口:
(2)控制总线+数据总线
(3)控制总线的定义
数据接口(p0)+ 控制总线(RS(1命令/0 数据)+CS(片选-低电平有效)+RD(读控制线-低电平有效)+RW(写控制线-低电平有效) +reset肯定是拉低的) (根据interface description)
学习方法:遇到坎的时候从容易到难我们一下是受不了,
(1)学习方法:数据书册是查的,找准数据书册关键信息点,用来查而不是挨个看。
(2)数据手册对照官方示例代码来参照对比
(3)要结合各部分原理图、各部分书册、示例代码来综合分析 (有时某一份资料会出错)
(4)必要时要记笔记 /*********************************************************功力就是这么来的*************************************************/ 牢记
但是在两份数据手册中均没有找到时序图,所以只能猜测 根据 interface description 来大致根据经验先大致猜测,然后再各根据代码,来具体分析。
在参考示例代码的时候:先看底层时序代码:写命令和写数据 区别只是在 RS 的不同。
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 0; //select command,选择命令 // 这里和我们之前在interface description 分析的不一样。无语。。。。。。
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_(); DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_(); LCD12864_RW = 1; //command writing ,写入命令
}
1.17.9 ST7565 的指令集
1.17.9.1 高层时序分析
(1)指令式交互系统:ST7567芯片内部事先规定了各种指令,cpu只要发送特定的指令达到特定的功能。这就是指令式交互系统。根据指令表具体看。
(2)指令表是关键(非常普遍)ST7565很具有代表性。
1.17.9.2 指令系统学习方法:
(1)沿着数据手册顺序分析。
(2)沿着示例代码按需分析 两种方法综合来看,先大致沿着看手册(简单的),在结合示例代码具体看。
查指令表 :(1) display on 0xAF / display off 0xAE
1.17.9.3先顺序分析简单的指令 :
(2)2号指令:显示行号设置 (display start line set)
01000000+0-0x3F 即就是 0x40+(0 - 63)(也就是64行)
(3)3号指令: 页地址设置 (page address set)10110000+( 0 - 7)0xB0+(0-7); 设置page address ( 0-7 64个纵向像素点分为8份) 具体参考 figure 4
(4)4号指令: 列地址设置 (Column adress set) 0001 bit7-bit4 + 0000+bit3-bit0 <bit7-bit0 (00000000 -10000011) (0-131) >
设置Column address 一个完整的指令事发两次 (1.先发高位 0001 bit7-bit4 2. 后发低位 0000 bit3-bit 0)。
(5)status read 详细看看每一位代表的意思:
(6) 设置ADC
0XA0 normal
0xA1 reverse
1.17.9.4 以代码为纲领来分析
(1) void Lcd12864_Init()
{
时序(reset、)、硬件特性参数(对比度、亮度)、显示参数(起始行、ADC(0-127 / 4-131)、 )
}
自己对某个参数特性不清楚,可以对着代码,来修改某个参数来实际看看效果。<比如 像素全开 >
1.17.9.5 好好研究一下清屏函数:
void Lcd12864_ClearScreen(void)
{
uchar i, j; for(i=; i<; i++)
{
//--表格第3个命令,设置Y的坐标--//
//--Y轴有64个,一个坐标8位,也就是有8个坐标--//
//所以一般我们使用的也就是从0xB0到0x07,就够了--//
LcdSt7565_WriteCmd(0xB0+i); //--表格第4个命令,设置X坐标--//
//--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--// 131(0x83)这里应该是 0x18 0x03吧
//--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--// 128(0x80)-----0x18 0x00
//--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--//
//--我们的X坐标从0x10,0x00开始---//
LcdSt7565_WriteCmd(0x10);
LcdSt7565_WriteCmd(0x04); //--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
for(j=; j<; j++)
{
LcdSt7565_WriteData(0xf0); //如果设置背景为白色时,清屏选择0XFF
}
}
}
他的本质就是往显存里边写数据,列地址好说0-128 但是行(64行)它分为8个列地址(每一个bit代表8行像素点(bit0-bit7)),如果初始化的时候背景是白的,那么写入数据的时候就应该写入0xff,显示的是128*64个点阵黑色的。如果初始化的时候设置背景是黑的,那么则无需写入数据(0x00)。具体可以参考这幅表:
1.17.14.2、LCD12864显示文字
(1)字模
(2)像素&显存
(3)显示函数:将字模丢到正确的显存中去
1.17.14.3、字模的获取
(1)芯片自带字库(输入ascii即可)
(2)网上下载字库
(3)字模生成软件自助生成。
代码实战自己写一个显示函数,
遗留问题:
(1)初始化和字模不匹配,字显示是反的。
(2)初始化不对,造成x坐标是从右往左的。解决。
将选择方向的命令改为 0xA0,对应的的 坐标也要改变。
17.17.15.1 超过8*8的字符如何显示?
(1)常见汉字字模大小是 16*16(32字节的数据(32*8=16*16))。也就是说每一个bit代表一个像素,把他分解成 两个8*16(上下来分),横向显示。纵向设置 page address (8 bit),显示上一半。page address 加一,显示下一半,横向显示。这样一个字就显示出来了。注意要和取模软件一一对应。
一个像素点代表一个bit。
参考资料:朱老师物联网大讲堂教程