轩_雨

青山不厌三杯酒,长日惟消一局棋
记树莓派的一个项目_RGB1602的实际使用(续——使用日语/添加常用汉字)

概述

功能:使树莓派可以利用RGB1602(LCD1602扩展板,I2C Interface 16*2 LCD PI Plate With KeyPad With RGB LED)显示日语和汉字

语言:python

设备:

  • 树莓派:树莓派4B (操作系统: Raspbian)
  • RGB1602:MCP23017 + RGB三色灯 + 五个按键 + LCD1602

说明:

这篇文章续着《记树莓派的一个项目_RGB1602的实际使用》进一步介绍LCD1602的其他拓展功能。

代码:https://gitee.com/xuanyusan/raspberrypi_rgb1602.git

LCD1602显示日语及其他特殊字符

LCD1602(1602字符型液晶)是一种专门用来显示字母、数字、符号、片假名等的点阵型液晶模块。之所以叫1602是因为它可以同时显示2行16列的字符。

LCD1602显示英文数字和常见半角字符很方便,因为显示数据就是它们的ASCII码。但是片假名和一些特殊字符就比较难进行对应。可以先看下面的对照图。

image-20210517102907224

可以看到0x20~0x7F是常见的一些字符,不过也有几个字符是例外的。

0x5C # '¥' 原先是'\',罗马字下的'\'键就是'¥'
0x7E # '→' 原先是'~'
0x7F # '←'

而0xA0~0xFF是日语片假名和一些特殊字符。

0xA1 # '。' 日语的句号
0xA2 # '「' 日语的引号
0xA3 # '」' 日语的引号
0xA4 # '、' 日语的逗号
0xA5 # '・' 日语的中点号,日语下的'?'键就是'・'
0xA6 # 'ヲ' wo
0xA7~0xAB # 日语合成音
0xAC~0xAE # 日语坳音的复元音
0xAF # 'ッ' 日语促音
0xB0 # 'ー' 日语长音
0xB1~0xDD # 日语五十音,除了'ヲ'
0xDE # 日语浊音
0xDF # 日语半浊音
0xE0 # 'α'
0xE1 # 'ä'
0xE2 # 'β'
0xE3 # 'ε'
0xE4 # 'μ'
0xE5 # 'σ'
0xE6 # 'ρ'
# 0xE7为g,可能为日语g
0xE8 # '√'
# 0xE9可能为-1次方
# 0xEA为j,可能为日语j
# 0xEB可能为上角标
# 0xEC - 0xED没识别出来
0xEE # 'ñ'
0xEF # 'ö'
# 0xF0为p,可能为日语p
# 0xF1为q,可能为日语q
0xF2 # 'θ'
0xF3 # '∞'
0xF4 # 'Ω'
0xF5 # 'ü'
0xF6 # 'Σ'
0xF7 # 'π'
# 0xF8可能为均值
# 0xF8为y,可能为日语y
0xFA # '千'
0xFB # '万'
0xFC # '円'
0xFD # '÷'

在文章开头提供的代码里,我整理了一个字典变量(位于/python/char.py),可以用于平假名和特殊字符Unicode编码转LCD显示编码。除此之外,我修改了上一篇文章的代码里的字符打印函数,使之兼容了平假名和特殊字符的显示。

LCD1602自定义汉字

LCD1602可以接受部分自定义字符。我们可以把LCD1602当成一个电脑来看,分为主机部分(寄存器、RAM、ROM)和输入输出接口。字符显示的点阵数据就是在CGROM中;而控制显示屏显示的数据是在运行过程中写入DDRAM;如果我们需要自定义字符则需要在运行过程中将自定义点阵数据写入CGRAM。

根据ROM的特性,我们可以知道CGROM的设计是不可变的,我们可以的改动是0x40-0x7E的CGRAM部分,每个字符占8个字节,总共是8个字符。对应上文的那幅图中CGRAM的部分,用0x00~0x0F来进行显示。

接下来以年为例来介绍这个过程。

1、字形设计

由于LCD1602每个字符位是5*8的点阵,所以我们只有40bit的发挥空间。

0x40 ⬜⬜⬛⬜⬜
0x41 ⬜⬛⬛⬛⬛
0x42 ⬛⬜⬜⬛⬜
0x43 ⬜⬛⬛⬛⬛
0x44 ⬜⬛⬜⬛⬜
0x45 ⬛⬛⬛⬛⬛
0x46 ⬜⬜⬜⬛⬜
0x47 ⬜⬜⬜⬜⬜

字符每一行的亮灭是由CGRAM字节的低5位决定的。根据设计,我们可以得出字符每一行的数据。第一个字符的设计应该从0x40开始,所以0x40为0x04。因为每个字符是8个字节,第二个字符的设计应该从0x48开始。

需要注意的是,CGRAM断电会丢失数据,所以每次重启需要重新写入。

2、代码实现

DefaultRAMUnOrderMap = {
    "switch": False,
    "日": 0,
    "月": 1,
    "年": 2,
    "二": 3,
    "上": 4,
    "下": 5,
    "左": 6,
    "右": 7
}

DefaultRAMContent = {
    "日": [0x1F, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x1F, 0x00],
    "月": [0x1F, 0x11, 0x1F, 0x11, 0x1F, 0x11, 0x11, 0x00],
    "年": [0x08, 0x0F, 0x12, 0x0F, 0x0A, 0x1F, 0x02, 0x00],
    "二": [0x00, 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x00, 0x00],
    "上": [0x08, 0x08, 0x08, 0x0E, 0x08, 0x08, 0x1F, 0x00],
    "下": [0x1F, 0x08, 0x08, 0x0C, 0x0A, 0x08, 0x08, 0x00],
    "左": [0x04, 0x1F, 0x08, 0x17, 0x02, 0x02, 0x0F, 0x00],
    "右": [0x04, 0x1F, 0x08, 0x17, 0x09, 0x09, 0x0F, 0x00]
}

def injectRAMContent(RAMContent):
    cnt = 0
    for key in RAMContent:
        DefaultRAMUnOrderMap[key] = cnt
        send_command(0x40+cnt*8)
        for temp in RAMContent[key]:
            send_data(temp)
        cnt += 1
    DefaultRAMUnOrderMap['switch'] = True

这里简单展示了注入自定义字符的核心代码,完整代码可以通过文章开头的代码链接进行下载,/python/python_char.py是展示的demo程序。

效果展示

23941621739004_.pic_hd

posted on 2021-05-23 11:17  轩_雨  阅读(364)  评论(0编辑  收藏  举报