目录
- 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介
- 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境
- 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
- 普冉PY32系列(四) PY32F002A/003/030的时钟设置
- 普冉PY32系列(五) 使用JLink RTT代替串口输出日志
- 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD
1602 LCD
1602LCD 是工业上常用的模块, 在工厂交通运输设备上经常能见到. 1602LCD 的字符显示为两行, 每行16个字符, 字符基于5×8的像素矩阵
驱动芯片为 HD44780, 工作电压为5V, 市场上还有使用型号 HD44780U 的1602LCD, 这个型号可以兼容3.3V的电压
PIN脚功能
Pin | Name | Function |
---|---|---|
1 | Ground | 地 (0V) |
2 | Vcc | 供电 5V (4.7V – 5.3V), 注意不能用3.3V供电 |
3 | Vo / VEE | 对比度调节. 连接一个可变电阻, 过高无法分辨显示的字符, 过低字符太淡无显示 |
4 | RS | 寄存器选择(Register Select), 低电平为命令寄存器, 高电平为数据寄存器 |
5 | Read/write | 读写选择, 低电平写入, 高电平读取 |
6 | Enable | EN 闲时处于低电平, 当需要执行指令前几个毫秒将EN拉高, 执行完再拉低 |
7~14 | DB0~DB7 | 8-bit 数据pin |
15 | Led+ | LED 背光电源 |
16 | Led- | LED 背光接地 |
RS (Register Select)
1602LCD有两组寄存器, 命令寄存器和数据寄存器, RS用于数据和命令寄存器的切换
实际使用时, 需要配合 EN 和 R/W
- 在 EN = 1, R/W = 0, RS = 1 时, 往数据寄存器写入的字符会用于展示.
- EN = 1, R/W = 0, RS = 0 时, 往命令寄存器写入, 用于发送指令, 例如: 初始化, 清空屏幕, 设置光标位置, 控制显示等
指令编码
以下是各指令位的说明
/*-------------------------------------------------------------
* Instruction D7 D6 D5 D4 D3 D2 D1 D0
* ==============================================
* Display clear 0 0 0 0 0 0 0 1
* Cursor home 0 0 0 0 0 0 1 *
* Entry Mode Set 0 0 0 0 0 1 I/D S
* Display On/Off 0 0 0 0 1 D C B
* Curs/Disp shift 0 0 0 1 S/C R/L * *
* Function Set 0 0 1 DL N F * *
* CG RAM addr set 0 1 ---------Acg---------
* DD RAM addr set 1 -------------Add---------
*
* Meaning:
* * - nonvalid bit
* Acg - CG RAM address (CHARACTER GENERATOR)
* Add - DD RAM address (DATA DISPLAY)
* AC - adress counter
*
* I/D - 1-increment, 0-decrement
* S - 1-display shift, 0-no display shift
* D - 1-display ON, 0-display OFF
* C - 1-cursor ON, 0-cursor OFF
* B - 1-blink ON, 0-blink OFF
* S/C - 1-display shift, 0-cursor movement
* R/L - 1-right shift, 0-left shift
* DL - 1-8 bits data transfer, 0-4 bits data transfer
* N - 1-1/16 duty, 0-1/8 or 1/11 duty
* F - 1-5x10 dot matrix, 0-5x7 dot matrix
* BF - 1-internal operation in progress, 0-display ready
*
\**************************************************************/
配合 EN = 1, R/W = 0, RS = 0 时, 往命令寄存器写入, 可以执行以下指令
No. | Hex | Binary | 命令说明 |
---|---|---|---|
1 | 01 | 0000 0001 | 清除显示 |
2 | 02 | 0000 001x | 光标回原位 |
3 | 04 | 0000 0100 | 向左移动光标(两个bit分别控制方向左右, 光标还是屏幕) |
4 | 06 | 0000 0110 | 向右移动光标 |
5 | 05 | 0000 0101 | 向右移显示 |
6 | 07 | 0000 0111 | 向左移动显示 |
7 | 08 | 0000 1000 | 显示关闭, 光标关闭(三个bit分别控制屏幕显示, 光标显示, 光标闪烁) |
8 | 0A | 0000 1010 | 显示关闭, 光标打开 |
9 | 0C | 0000 1100 | 显示打开, 光标关闭 |
10 | 0E | 0000 1110 | 显示打开, 光标闪烁 |
11 | 0F | 0000 1111 | 显示打开, 光标闪烁 |
12 | 10 | 0001 00xx | 将光标位置向左移动(两个bit分别控制光标还是屏幕, 左移还是右移) |
13 | 14 | 0001 01xx | 将光标位置向右移动 |
14 | 18 | 0001 10xx | 将整个显示屏向左移动 |
15 | 1C | 0001 11xx | 将整个显示屏向右移动 |
16 | 28 | 0010 10xx | 4位, 2行, 5x8矩阵(三个bit分别控制4位还是8位,一行还是两行,5x10还是5x8) |
17 | 20 | 0010 00xx | 4位, 1行, 5x8矩阵 |
18 | 38 | 0011 10xx | 8位, 2行, 5×8 |
19 | 4x | 01xx xxxx | 设置 CGRAM 地址, 后面6个bit是地址, 在这个指令之后发送或接收数据 |
20 | 8x | 1xxx xxxx | 设置 DDRAM 地址, 后面7个bit是地址, 在这个指令之后发送或接收数据 |
21 | 80 | 1000 0000 | 将光标强制移动到开头(第一行) |
22 | C0 | 1100 0000 | 将光标强制移动到开头(第二行) |
显示自定义字符
自定义字符要在 CG-RAM 中设置. CG-RAM地址从 0x40 开始到 0x7F 共 64 byte, 可以创建8个字符, 每个字符8个byte. 在这些地址创建字符后, 就可以在LCD中显示.
CG-RAM 地址和命令
No. | Addr. | Command |
---|---|---|
0 | 0x40 | 0 |
1 | 0x48 | 1 |
2 | 0x50 | 2 |
3 | 0x58 | 3 |
4 | 0x60 | 4 |
5 | 0x68 | 5 |
6 | 0x70 | 6 |
7 | 0x78 | 7 |
上面的表中可以看到每个字符的起始地址及其打印命令, 例如第一个字符的地址是 [0x40, 0x47], 使用命令0
可以输出这个字符, 第二个字符的地址[0x48, 0x55], 使用命令1
输出.
自定义字符时, 每个字符是5x8的点阵, 5是列数, 8是行数. 对应字母b
的点阵可以表示为
char b[7] = {0x10,0x10,0x16,0x19,0x11,0x11,0x1E};