本帖最后由 swzswz 于 2023-8-12 11:10 编辑
控制屏幕显示中文总体流程
很高兴参加第二期的活动,由于第一期也是用micropython语言进行编程,第二期仍然采用这个进行编程。最开始想用板载的tft 7789芯片彩屏进行中文显示,但是没能成功。后来借助第一期的OLED显示,利用0.96寸的屏幕进行中文显示,过程分为两部分:
- 首先找到中文字体的文件ttf,利用otf2bdf命令(linux)进行文件格式转换,再利用adafruit_bitmap_font模块导入BDF字体
- 在样例文件ssd1306的模版上进行改进,主要是替换字体,已经修改显示的字符,将字符改成中文。
注意提前搭建好环境,安装thonny软件,以及将相应的库导入到板子中,放到其lib目录下。可以参考dk_adafruit_esp32_s3_tft_feather_en.pdf这个文档。具体我放在附件中。
字体格式转换以及导入字体
- 字体转换
参考https://learn.adafruit.com/custom-fonts-for-pyportal-circuitpython-display/use-otf2bdf这个链接,先进行otf2bdf命令脚本安装,再执行转换。
电脑字体文件,在系统盘(c盘)下的/windows/font目录下,下面是我的字体截图。
利用linux环境进行字体转换,我用ubuntu22,ssh远程命令进行转换。
sudo ap-get install otf2bdf
otf2bdf STXINWEI.TTF -p 12 -o STXINWEI.bdf
转换后的字体导入板子中,由于文件太大,我直接在电脑上写代码,保存在电脑中,如下图。
- 字体导入
利用adafruit_bitmap_font模块导入字体,并将bitmap进行更新,具体可以看这个模块的使用,
from adafruit_bitmap_font import bitmap_font
from displayio import Bitmap
font = bitmap_font.load_font("./font/STXINWEI.bdf", Bitmap)
中文显示
借助displayio_ssd1305_simpletest.py模版,我们主要修改的代码在两个位置,如下,第一个是文本字符串改成中文,第二个是label函数第一个参数改成导入的字体。
text = "中国人"
text_area = label.Label(
font, text=text, color=0xFFFFFF, x=28, y=HEIGHT
)
总代码如下:
"""
This test will initialize the display using displayio and draw a solid white
background, a smaller black rectangle, and some white text.
"""
"""
This test will initialize the display using displayio and draw a solid white
background, a smaller black rectangle, and some white text.
"""
import board
import displayio
import terminalio
from adafruit_display_text import label
import adafruit_displayio_ssd1306
from adafruit_bitmap_font import bitmap_font
from displayio import Bitmap
displayio.release_displays()
oled_reset = board.D9
font = bitmap_font.load_font("STXINWEI.bdf", Bitmap)
i2c = board.I2C()
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C, reset=oled_reset)
WIDTH = 128
HEIGHT = 32
BORDER = 5
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT)
splash = displayio.Group()
display.show(splash)
color_bitmap = displayio.Bitmap(WIDTH, HEIGHT, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0xFFFFFF
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)
inner_bitmap = displayio.Bitmap(WIDTH - BORDER * 2, HEIGHT - BORDER * 2, 1)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0x000000
inner_sprite = displayio.TileGrid(
inner_bitmap, pixel_shader=inner_palette, x=BORDER, y=BORDER
)
splash.append(inner_sprite)
text = "中国人"
text_area = label.Label(
font, text=text, color=0xFFFFFF, x=28, y=HEIGHT // 2 - 1
)
splash.append(text_area)
while True:
pass
现象
先点击软件thonny中的stop按钮,再点击运行,oled上会有“中国人”字符显示。
下面是附件,一个是文档说明,一个是代码。