awxd 发表于 2022-8-12 20:06:57

1602液晶怎么自定义字符

如标题所示,我想请教的问题就是1602怎么自定义字符。在网上搜过,不太懂。我主要是想请教一下操作过程,比如“写指令……”,“写数据……”,“写地址……”之类的。
求教了!

t3486784401 发表于 2022-8-12 22:59:52

从 Arduino 的 1602 库摘一个代码来吧:

void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[])
{
location &= 0x7; // we only have 8 locations 0-7
command(LCD_SETCGRAMADDR | (location << 3));
for (int i=0; i<8; i++) {
    write(charmap);
}
}

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

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

Jack315 发表于 2022-8-13 00:28:16

LCD1602 控制器的数据手册对操作过程有详细的描述。

网上查到的控制器 LCD1602 有日立的 HD44780 三星的 KS0066:

Jack315 发表于 2022-8-13 11:46:33

以日立的 HD44780 为例。

控制器内部框图:


简化的框图:


在控制器内部有 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 ,如下图所示:


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

CGRAM 就是存放自定义字符点阵数据的地方。
其地址和数据如下图所示:

高 4 位全 0 加显示地址 3 位(第 4 位无作用,相当于 0)
构成了显示时使用的地址(参考 DDRAM 的说明)。
范围为 0x00 ~ 0x07 (0 ~ 7)。

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

Jack315 发表于 2022-8-13 13:03:05

假设自定义字符为 “℃” ,存放在 DDRAM 地址为 0x02 的存储单元。
即在显示这个字符时,向相应的 DDRAM 存储单元写入数据 0x02 。
相关地址和数据如下图所示:


下列过程需在初始化(复位)过程后进行。
详见 LCD1602 使用说明书:


下列过程中:
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 。

写入自定义字符点阵数据完成。

Jack315 发表于 2022-8-13 13:28:09

【4-位单片机】

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


软件中要设置数据宽度为 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 位。

yinkesha 发表于 2022-8-18 16:41:29

不是一两句话能说明白的,最好参考下教程。一般要建一个自定义字符的码表,在程序中做个数据块,循环读数据写到LCD对应点。

lxa000 发表于 2022-8-20 12:36:21

好象见过有自定义的软件工具。
页: [1]
查看完整版本: 1602液晶怎么自定义字符