矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1193|回复: 7

1602液晶怎么自定义字符

[复制链接]
     
发表于 2022-8-12 20:06:57 来自手机 | 显示全部楼层 |阅读模式
如标题所示,我想请教的问题就是1602怎么自定义字符。在网上搜过,不太懂。我主要是想请教一下操作过程,比如“写指令……”,“写数据……”,“写地址……”之类的。
求教了!
     
发表于 2022-8-12 22:59:52 | 显示全部楼层
从 Arduino 的 1602 库摘一个代码来吧:

  1. void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[])
  2. {
  3.   location &= 0x7; // we only have 8 locations 0-7
  4.   command(LCD_SETCGRAMADDR | (location << 3));
  5.   for (int i=0; i<8; i++) {
  6.     write(charmap[i]);
  7.   }
  8. }
复制代码


大致就是先发送 LCD_SETCGRAMADDR 指令,让后配合一个 0-7 的地址,接着发送 8 字节数据。
此后就在 ASCII 表的 0x0-0x7 的位置创建了一个自定义字符。

之后打印上述字符的时候(0x0-0x7),就会显示自定义字符
回复 支持 反对

使用道具 举报

     
发表于 2022-8-13 00:28:16 | 显示全部楼层
LCD1602 控制器的数据手册对操作过程有详细的描述。

网上查到的控制器 LCD1602 有日立的 HD44780 三星的 KS0066:
HD44780.pdf (322.07 KB, 下载次数: 35)
ks0066.pdf (541 KB, 下载次数: 31)
回复 支持 反对

使用道具 举报

     
发表于 2022-8-13 11:46:33 | 显示全部楼层
以日立的 HD44780 为例。

控制器内部框图:
HD44780_A.png

简化的框图:
HD44780_B.png

在控制器内部有 3 个寄存器和 2 块 RAM 需要单片机软件来控制。
1. IR - Instruction Register,指令寄存器。
2. DR - Data Register,数据寄存器。
这两个寄存器是 LCD 控制器与单片机的接口。

3. AC - Address Counter,地址计数器(寄存器)。
AC 用于在指令的控制下形成 RAM 的地址。

4. DDRAM - Display Data RAM,显示数据 RAM 。
这块 RAM 的地址范围分为两种情况。
(a) 1 行 80 个字符:0x00 ~ 0x4F (0 ~ 79)
(b) 2 行 40 个字符:0x00 ~ 0x27 (0 ~ 39) 和 0x40 ~ 0x67 (64 ~ 103)
每个 DDRAM 字节存放的是要显示的字符点阵数据的地址。
LCD1602 使用的是 2 行 40 个字符模式,只使用了一半不到,即 2 行 16 个字符。

5. CGRAM - Character Generator RAM,字符生成器 RAM 。
这里称为点阵数据比较容易理解。
点阵数据由 CGROM(字符生成器 ROM)和 CGRAM 共同组成。
每个字符有 5 x 8 点阵和 5 x 10 点阵两种模式。
LCD1602 使用的是每个字符由 5 x 8 点阵组成这个模式。
实际字符为 5 x 7 点阵,最下面一横为光标。

点阵数据存储器的地址范围为 0x00 ~ 0xFF (0 ~ 255)。
其中 240 个地址分配给 CGROM,16 个地址分配给 CGRAM ,如下图所示:
CGMemory.png

HD44780 具体实现了 208 个 CGROM 字节,8 个 CGRAM 字节。
LCD1602 里用的是 COB (Chip On Board),
具体实现了多少点阵数据字节不详。

CGRAM 就是存放自定义字符点阵数据的地方。
其地址和数据如下图所示:
CGRAM.png
高 4 位全 0 加显示地址 3 位(第 4 位无作用,相当于 0)
构成了显示时使用的地址(参考 DDRAM 的说明)。
范围为 0x00 ~ 0x07 (0 ~ 7)。

在自定义字符(写入点阵数据)时的地址为 0x00 ~ 0x3F (0 ~ 63) 。
自定义字符的点阵数据占 7 行,第 8 行为光标,数据为全 0 。
回复 支持 反对

使用道具 举报

     
发表于 2022-8-13 13:03:05 | 显示全部楼层
假设自定义字符为 “℃” ,存放在 DDRAM 地址为 0x02 的存储单元。
即在显示这个字符时,向相应的 DDRAM 存储单元写入数据 0x02 。
相关地址和数据如下图所示:
UDC.png

下列过程需在初始化(复位)过程后进行。
详见 LCD1602 使用说明书:
1602液晶说明.pdf (255.88 KB, 下载次数: 43)

下列过程中:
IR 为指令寄存器。
DR 为数据寄存器。
参考 4 楼的说明。

【写入自定义点阵数据】
1. 等待 LCD 控制器就绪。
一直读 IR 寄存器,直到 DB7 为 0 表示就绪为止。

2. 设定 Entry Mode:地址计数器 AC 自动递增。
指令为 0x07,即向 IR 寄存器写入 0x07 。

3. 等待 LCD 控制器就绪。

4. 写自定义字符 CGRAM 首地址 0x10。
指令为 0x40,与 CGRAM 首地址相加后为 0x50 。
即向 IR 寄存器写入 0x50 。

5. 等待 LCD 控制器就绪。

6. 写 CGRAM 点阵第 0 行数据 0x18 。
即向 DR 寄存器写入 0x18 。
此时地址计数器 AC 自动递增,指向 CGRAM 地址 0x11 。

7. 等待 LCD 控制器就绪。

8. 写 CGRAM 点阵第 1 行数据 0x1B 。

9. 等待 LCD 控制器就绪。

10. 写 CGRAM 点阵第 2 行数据 0x04 。

11. 等待 LCD 控制器就绪。

12. 写 CGRAM 点阵第 3 行数据 0x08 。

13. 等待 LCD 控制器就绪。

14. 写 CGRAM 点阵第 4 行数据 0x08 。

15. 等待 LCD 控制器就绪。

16. 写 CGRAM 点阵第 5 行数据 0x04 。

15. 等待 LCD 控制器就绪。

16. 写 CGRAM 点阵第 6 行数据 0x03 。

17. 等待 LCD 控制器就绪。

18. 写 CGRAM 点阵第 7 行(光标行)数据 0x00 。

写入自定义字符点阵数据完成。
回复 支持 反对

使用道具 举报

     
发表于 2022-8-13 13:28:09 | 显示全部楼层
【4-位单片机】

在一些功能要求不高的场合,如小家电、遥控器……等,
为节约成本可能会选择 4-位单片机。
这时的电路连接如下图:
HD44780_C.png

软件中要设置数据宽度为 4 位。
对于 LCD1602 ,指令为:0x28,即向 IR 寄存器写入 0x28 。

设定的功能为:
DB7, DB6, DB5 = 001,设定功能指令;
DB4 = 0, 数据宽度为 4 位;
DB3 = 1, 2行 LCD 字符;
DB2 = 0, 5 x 8 点阵;
DB1, DB0 = 00,无作用,取 0 。

在读写 IR 和 DR 寄存器时要读写两次。
第一次为高 4 位,第二次为低 4 位。
回复 支持 反对

使用道具 举报

     
发表于 2022-8-18 16:41:29 | 显示全部楼层
不是一两句话能说明白的,最好参考下教程。一般要建一个自定义字符的码表,在程序中做个数据块,循环读数据写到LCD对应点。
回复 支持 反对

使用道具 举报

     
发表于 2022-8-20 12:36:21 | 显示全部楼层
好象见过有自定义的软件工具。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-14 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表