基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法

 

 

                                                                                          摘要

lcd1602应该算是一个难点,不管是对于单片机的学习还是FPGA的学习。因为里面涉及到时序分析,地址度写,数据读写,指令读写,建立时间和保持时间,还有操作流程会变的复杂,这些都给刚学习的人一些困惑或是难以理解。在我的博文中,一直贯彻的理念是,希望能够起到抛砖引玉的作用,尽量将思考的过程描述清楚,而不是简单的写出相关知识和代码。

                                                  干货

关于lcd1602的文档有很多。市面上绝大部分都是基于HD44780,所以这里的控制显示等都是一样的。HD44780内置了DDRAM、CGROM、CGRAM.其中要让lcd显示就需要将DDRAM的相应地址写入数据。

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第1张图片

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第2张图片

上图可知DDRAM一共有40个地址,但是对应于1602显示,只能有32个地址有效。这是因为1602可以显示上下两行,每一行显示16符号,一共显示32个符号,每个显示对应于DDRAM一个地址。例如,我需要在1602的第一行最左边显示一个字母A。首先找到第一行最左边对应DDRAM的地址是什么,查看上图可知是:00H,然后大写字母A对应于ASCII中为41H,此时我们只需要给DDRAM的00H地址写个数据41H即可显示了。

问题1:为何写个41H,就可以显示为"A"呢?

  对于这个问题,就需要理解CGROM和CGRAM的作用。在芯片HD44780中内置了192个常用字符的字模,存于CGROM(character generate ROM)中,还有8个允许用户自定义字符(也就是可以显示八个中文字)的RAM,也就是CGRAM。具体描述为下图

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第3张图片

可以从上图分析A在字模中代码:高4位为0100,低4位为0001.所以组成8位就变成了41H,这就说明了为何写入41H就可以显示“A”。

上图红框里面表示为CGRAM,字模代码为:00H-0FH;ASCII的字模代码为:20H-7FH;日文和希腊字符的字模代码为:A0H-FFH;10H-1FH和80H-9FH没有使用。

问题2:如何任意显示一个字母,数字?

      这个问题是接着上面一个问题而言,具体就是:在1602中我要在某一行某个位置显示我想要的数字或是字母,我应该对应DDRAM地址写个什么样的八位数据?例如,我想显示“1”,那不是就写个01H呢?此时就需要一个思维转换,我们要显示的“1”不再是一个数据,而是需要转换为一个图案,可以看到上图有1的图案,该图案对应了31H,所以需要显示一个“1”,我们就需要给1602的数据总线(DB7--DB0)输入31H。以此类推,例如我们需要输入kb129 is a good man,于是就需要给1602顺序输入:6BH,62H,31H,32H,39H ,20H(空格),69H,73H,20H,61H,20H,67H,6FH,6FH,64H,20H,6DH,61H,6EH。

问题4:如何显示汉字?

问题2中解决了显示任意一个字母和数字,但是汉字在图中找不到汉字,怎么办?这时候需要使用CGRAM了,先用字模软件,将对应汉字的变为二进制数。

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第4张图片

例如我想要显示一个“电”字,由于1602中显示的图案为5*7或是5*10,所以在8*8中左边三列不能使用。得到8列八位数据:04, 1F, 15,1F, 15,1F, 04,07.

然后就需要将这8个8bit数据写入CGRAM中,写CGRAM需要使用指令:

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第5张图片

可以设置地址指针自加一模式,所以如果我们想把“电”这个字方在第1个CGRAM中,也就是对应DDRAM中的00H,就需要将地址写为DB7--DB0:0100_0000.然后将数据04, 1F, 15,1F, 15,1F, 04,07依次写进CGRAM中。这样在CGROM字符的字模中00H就代表了“电”。

最后就是显示,也就是如果需要将“电”显示在1602中,就讲地址指针指向DDRAM,然后写数据为00H。

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第6张图片

重点.

上面已经了解到要让1602显示就需要将特地的地址输入特地的值,如果你刚接触1602,此时一定特别想了解怎么将上面的思路转换为verilog代码。但是一定需要注意时序问题,1602的读写时序为:

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第7张图片

 这里特别注意了setup和 hold time,但是实际使用中由于1602显示不需要很高的时序,所以我们只需降低1602工作的时钟就可以很容易满足1602的时序要求。

最后效果图

基于FPGA,Verilog语言的LCD1602时钟和汉字显示方法_第8张图片

分频器是将50MHZ分频为500HZ做LCD1602指令时钟。

 

程序资源链接:https://download.csdn.net/download/weixin_42168194/11183496

 

 

 

你可能感兴趣的:(硬件介绍)