micropython不用取模软件,直接输入中文并用OLED显示中文的方法

我之前写过一个不用取模显示中文的方法,但是那个方法没有解决编码问题,所以必须预先处理下编码才能显示。这次提供一个自带编码解决方案的显示方式。思路其实就是一个:查表,输入中文先查表查出GB2312编码然后用编码继续查表找到字磨点阵然后逐个点显示。

关于2312查表可以看这篇内容,它进行了编码工作为了解决他的模块GB2312问题,首先贴出GB2312编码查表的引用地址

然后我贴出本篇博客的主要内容,直接显示中文的方式。需要两个查表文件。下面是代码。

python 复制代码
# update=1
# 上面1表示更新,0表示不更新
ver=1.5
#####
import machine,ssd1306,time
from machine import Pin
oled_vcc=Pin(27,Pin.OUT,value=1)
oled_gnd=Pin(26,Pin.OUT,value=0)
try:
    time.sleep(0.7)
    i2c=machine.SoftI2C(scl=machine.Pin(14),sda=machine.Pin(12)) #这里是引脚改成自己的,不能偷懒
    oled=ssd1306.SSD1306_I2C(128,64,i2c)
    oled.fill(0)
    oled.show()
except:
    print('OLED 屏幕故障')
class gb2312(object):
    def __init__(self):
        self.f = open('utf2gb2312.bin', 'r', encoding='utf-8')
    def b2i(self, byte):  # bytes转int
        r = 0
        for i in range(len(byte)):
            r = (r << 8) + byte[i]
        return r
    def i2b(self, num):  # int转bytes
        num = int(num, 16)
        return num.to_bytes(2, 'big')
    def one_char(self, char):  # 将一个字符转化成gb2312
        utf_byte = char.encode('utf-8')
        r = self.B_S(0, 7296, self.b2i(utf_byte))
        gb2312_byte = self.i2b(r)
        # print(gb2312_byte)
        return gb2312_byte
    def strs(self, st):  # 将字符串转化成gb2312
        r = b''
        for s in st:
            # print(s.encode('utf-8'))
            if len(s.encode('utf-8')) <= 1:
                r += s.encode('utf-8')
            else:
                r += self.one_char(s)
        return r
    def B_S(self, low, high, m):  # 二分查找
        if 0 <= low <= high <= 7296:
            mid = (low + high) // 2
            self.f.seek(mid * 12)
            data = self.f.read(12)
            utf = data[0:6]
            if int(utf, 16) < m:
                return self.B_S(mid + 1, high, m)
            elif int(utf, 16) > m:
                return self.B_S(low, mid - 1, m)
            else:
                return data[7:-1]
    def get_gb2312(self,a):
        f = open('HZK16S','rb')
        a=self.strs(a)
        #a = a.encode('gb2312')
        area = a[0]-160
        index = a[1]-160
        offset = (94*(area-1)+(index-1))*32
        try:
            f.seek(offset)
            btxt=f.read(32)
        except:
            print("out range chinese")
            btxt=None
        f.close()
        return btxt
    def __del__(self):
        self.f.close()
def chchar(oled,x,y,btxt,origin=1,color = 1):
    # if ((x+16)>= self.width) or ((y+16)>= self.height):
    #     return
    for i in range(16):
        t1 = btxt[i<<1]
        t1 = int(bin(t1)[2:])
        t1 = "%08d" % t1

        t2 = btxt[(i<<1)+1]
        t2 = int(bin(t2)[2:])
        t2 = "%08d" % t2
        t = t1+t2
        for j in range(16):
            if t[j]=='1':
                oled.pixel((x+j),(y+i),color)
    oled.show()


gb=gb2312()
chchar(oled,0,0,gb.get_gb2312('行') )

库表1
库表2

相关推荐
冷雨夜中漫步33 分钟前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴1 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再1 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
m0_736919102 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手3 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934733 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy3 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
黎雁·泠崖3 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472464 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威4 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos