FPGA学习之LCD1602基本知识(控制,显示,时序)
前言
LCD1602顾名思义就是显示两行,每行16个字符。如下图所示:
LCD1602的控制线主要有4根:
(1)RS:数据/指令选择端,当RS = 0时,写指令,当RS = 1时,写数据
(2)RW:读/写选择端,当RW = 0时,写指令/数据,当RW = 1时,读状态/数据
(3)EN:使能端,下降沿使指令/数据生效
(4)data[7:0]:8根并行数据口
那LCD1602总共引出的接口信号线如下图所示:
其中VL代表液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高会产生“鬼影”,使用时可以通过电位器进行调整对比度。
内部控制指令
字符显示
不论是什么LCD的控制显示都内置了字符显示RAM缓冲区(DDRAM)。
字符显示是通过将字符显示编码写入该字符显示RAM实现。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库),HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。
其实就是DDRAM是用来使液晶显示的,CGROM是液晶屏可显示的内容(在CGROM表中查看),CGRAM是用来扩展液晶屏可以显示的内容的。
LCD1602内置了DDRAM,CGROM和CGRAM,其中要让LCD显示就是需要在DDRAM的相应地址写入数据。
其中DDRAM地址和液晶显示位置的对应关系如下图所示
上图中可以看出DDRAM一共有40个地址,但是对于LCD1602只有32个地址有效。
例如我们在第一行最左边显示字母A,该如何进行操作呢?
首先我们需要找到第一行最左边对应DDRAM的地址是什么?查看上图可知是00H。
第二步我们需要知道字母A对应的字符代码是多少?最直接的方法就是查找ASCII表。
另一种就是我们知道LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据呢?例如下图的字符“A”的字模数据就知道了。
上图的左边就是字符“A”的字模数据,右边就是将左边数据用“○”代表0,用“■”代表1,从而显示出“A”这个字形,
从上面图中可以看出字符“A”的高四位是0100,低四位是0001,合在一起就是01000001b,即41H,恰好与ASCII码一致。
由上图可以看出10H-1FH和80H-9FH是空白没有使用的。
因此总结得出如果想在LCD左上角显示字符“A”,那么就把字符“A”的字符代码41H写入DDRAM的00H地址处即可。
那如何实现任意地址显示任意字母和数字呢?
这个是接着字符“A”显示的总结来说,具体一点就是:“在LCD中我要在某一行某个位置显示任意字母或数字,就在对应的DDRAM的地址上写入该字母或数字的字符代码”。
什么意思呢?
就是说,比如我想要显示“1”这个数字,对应LCD上就不是在对应上真的写入01H就能显示数字“1”,而是把数据“1”当做一个图案,而这个图案对应的字符代码是31H,因此需要显示数字“1”,就需要在LCD的数据总线上写入31H即可。
以此类推,例如我们需要显示“2020 year”,因此我们输入给LCD的数据字符代码顺序是:32H,30H,32H,30H,20H(空格),79H,65H,61H,72H。
那如果需要显示汉字怎么办?
上面解决了任意位置显示任意字母或数字的问题,但在我们看出汉字在图中找不到,例如上面显示的“2020 year”要改成显示“2020年”怎么办?
在讲到字符“A”提到的字符的字模数据是怎么产生的?
借助于字模软件,如下图所示,可以得出汉字“年”的字模数据。
由于LCD1602显示的图案是57或者510的,所以在8*8的左边三列不能使用,得出汉字“年”的字模格式,看出1602显示该汉字有些力不从心,但依然得到8行八位数据:08H,0FH,12H,…,02H,02H。
然后我们就需要将这个8个8位数据写入CGRAM中去,写CGRAM的的指令如下
读写时序操作
总结一下可得出下表时序操作:
本篇文章介绍了入门级LCD1602液晶的基本知识和显示部分。
下篇文章将介绍如何在FPGA实现LCD1602驱动,由于手上没有LCD1602液晶模块,将选用其他液晶显示模块来展示如何在FPGA中实现液晶驱动,以及后续学习如何制作在实际应用的的IP封装核。