数码之家

 找回密码
 立即注册
搜索
查看: 2563|回复: 23

[AVR] 哪位TX可以实验下这种结构体存储字符表的方法

[复制链接]
发表于 2019-3-13 17:29:13 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x

牛哥zqharmstudio的牛帖在这里:
http://bbs.mydigit.cn/read.php?tid=2199847



                               
登录/注册后可看大图



这个思路茶觉得蛮好,符合写字习惯,
但茶水平太低 还理解不了其中的原理,程序自己写不出来 :loveliness:

劳烦哪位TX可以按这种方法  写几个完整的代码出来,
能简单演示几个汉字这种效果就行
:handshake:





发表于 2019-3-13 18:34:29 | 显示全部楼层
:loveliness: 存储双列数据,按数据结构教材上的说法得用符号表,通俗讲就是字典。

点评

透明哥好 请教原帖里 定义的结构体中 GBK14.Index[0] 对应具体哪个 GBK14.Index[1] 对应具体哪个 是不是最后面的索引数字前的 // 都应该清掉?  详情 回复 发表于 2019-3-14 09:21
回复 支持 反对

使用道具 举报

发表于 2019-3-13 21:31:28 | 显示全部楼层
原理就是抽屉贴上标签,对于小字库比较实用
回复 支持 反对

使用道具 举报

发表于 2019-3-13 22:52:58 | 显示全部楼层
我的做法是自顶向下设计:
1-程序随便display各种字符串
2-编译通过后,用自己写的一个专用软件扫描所有C文件,提取所有字符串、排序、去重复,得到一串汉字,然后对这串汉字取模,输出到一个独立的C文件,里面打印点阵字模数据为数组,再打印汉字字符串作为索引
3-重新编译一次就可以了。显示时,先二分法查找汉字内码在索引数组的位置,计算出该汉字在点阵数组的偏移量,读取汉字点阵并显示

好处是编程随心所欲,不用关心点阵取模、偏移量什么的,就跟有个完整字库一样方便。:lol:

打赏

参与人数 1家元 +10 收起 理由
不长叶子的树 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 09:21:16 | 显示全部楼层
数码小透明 发表于 2019-3-13 18:34
存储双列数据,按数据结构教材上的说法得用符号表,通俗讲就是字典。 ...

透明哥好 :handshake:

请教原帖里 定义的结构体中
GBK14.Index[0]   对应具体哪个
GBK14.Index[1]   对应具体哪个

是不是最后面的索引数字前的  //  都应该清掉?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 09:26:50 | 显示全部楼层
amo73 发表于 2019-3-13 22:52
我的做法是自顶向下设计:
1-程序随便display各种字符串
2-编译通过后,用自己写的一个专用软件扫描所有C文 ...

欢迎探讨 :handshake:
您讲的太过高深  茶一头雾水
不如发些实例教教吧

回复 支持 反对

使用道具 举报

发表于 2019-3-14 09:44:47 | 显示全部楼层
amo73 发表于 2019-3-13 22:52
我的做法是自顶向下设计:
1-程序随便display各种字符串
2-编译通过后,用自己写的一个专用软件扫描所有C文 ...

:loveliness: 封装得很科学,扫描、取模、初始化字典一气呵成,自动化了。
回复 支持 反对

使用道具 举报

发表于 2019-3-31 10:56:17 | 显示全部楼层
我在树莓派上点12864屏幕的时候也是做了个字库文件不过我生成的字库文件是二进制的 用取模软件生成的是标准的G2312字库 代码根据标准字库去查找汉字位置 取出数据来显示
回复 支持 反对

使用道具 举报

发表于 2019-4-3 00:10:28 | 显示全部楼层
茶壹杯 发表于 2019-3-14 09:21
透明哥好

请教原帖里 定义的结构体中

有哪么难理解吗不就一个比较简单的结构体吗?
它对应汉字内码的高/低8位呀

点评

当汉字遇到UTF8的编译器,, 您试试? 用的是arduino ide 茶是新新手没基础,目前照猫画虎 只实践了英文ASCII字符的显示  详情 回复 发表于 2019-4-4 18:09
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-4 18:09:19 | 显示全部楼层
lbq691477940 发表于 2019-4-3 00:10
有哪么难理解吗不就一个比较简单的结构体吗?
它对应汉字内码的高/低8位呀 ...

当汉字遇到UTF8的编译器,,  您试试?
用的是arduino  ide

茶是新新手没基础,目前照猫画虎  只实践了英文ASCII字符的显示

点评

arduino ide ? UTF-8的问题 算是这个ide在win平台下的一个bug吧 我也没法在win下编译出utf-8正确的内容 要想在win下utf-8正确,需要使用 esclips 或者 vscode这类编译器才行或者在ubuntu mac这类utf-8环境的系统  详情 回复 发表于 2019-4-26 15:20
照猫画虎也得思考的 UTF8的编译器汉字几乎固定是三个字节 ,本例的汉字内码只有二个字节, 比如原来如下: typedef struct typFNT_GB16 //汉字字模数据结构 { u8 Msk[32]; //汉字点阵数据 u8 Index[2];  详情 回复 发表于 2019-4-13 15:21
回复 支持 反对

使用道具 举报

发表于 2019-4-12 15:38:04 | 显示全部楼层
楼主想显示汉字的话,可以看看我今天分享的OLED实现汉字滚动效果:smile:

点评

我顶楼的提问 请再仔细看看  详情 回复 发表于 2019-4-12 21:41
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-12 21:41:34 | 显示全部楼层
yaosongjin 发表于 2019-4-12 15:38
楼主想显示汉字的话,可以看看我今天分享的OLED实现汉字滚动效果

我顶楼的提问   请再仔细看看
回复 支持 反对

使用道具 举报

发表于 2019-4-13 07:12:25 | 显示全部楼层
没弄明白,,你是想实现在代码中输入实际的中文字符吗?

这个简单,首先你得有个能存储所有中文字符表的内存空间. 中文弄个GB2312就可以了,

16*16 的话,一个字要占用32字节.大概要1~2MB 的空间,,空间不够可以外挂存储器, 或者买专门的字符IC.




回复 支持 反对

使用道具 举报

发表于 2019-4-13 07:20:36 | 显示全部楼层
哦哦,, 特意看了下你的来贴..
他用的是另一种方法,
将 汉字码写在一个结构体中. 这个结构体包含两部分,一个作索引,一个是点阵信息.

方法虽好,但是更新字符表麻烦哦~~
----





回复 支持 反对

使用道具 举报

发表于 2019-4-13 15:21:47 | 显示全部楼层
茶壹杯 发表于 2019-4-4 18:09
当汉字遇到UTF8的编译器,,  您试试?
用的是arduino  ide

照猫画虎也得思考的:lol:
UTF8的编译器汉字几乎固定是三个字节 ,本例的汉字内码只有二个字节,
比如原来如下:
typedef struct typFNT_GB16                //汉字字模数据结构
{       
        u8 Msk[32];      //汉字点阵数据
        u8 Index[2];         //汉字内码索引
};

struct typFNT_GB16 const GB_16[] =  //数据表
{

        0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x02,0x80,
        0x0C,0x60,0x32,0x18,0xC1,0x06,0x1F,0xE0,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40,"零",//0

};
for(j = 0;j < sizeof(GB_16) / sizeof(GB_16[0]);j++)        //共查找 j 个汉字
{
        if(dat[0] == GB_16[j].Index[0] && dat[1] == GB_16[j].Index[1])//判断汉字内码是否相等
                break;
}

UTF8的编译器改为如下:
typedef struct typFNT_GB16                //汉字字模数据结构
{       
        u8 Msk[32];      //汉字点阵数据
        u8 Index[3];         //UTF8码索引
};


struct typFNT_GB16 const GB_16[] =  //数据表
{

        0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x02,0x80,
        0x0C,0x60,0x32,0x18,0xC1,0x06,0x1F,0xE0,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40,"零",//0

};

for(j = 0;j < sizeof(GB_16) / sizeof(GB_16[0]);j++)        //共查找 j 个汉字
{
        if(dat[0] == GB_16[j].Index[0] && dat[1] == GB_16[j].Index[1] && dat[2] == GB_16[j].Index[2])//判断UTF8码是否相等
                break;
}


打赏

参与人数 1家元 +10 收起 理由
不长叶子的树 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-14 04:34:10 | 显示全部楼层
lbq691477940 发表于 2019-4-13 15:21
照猫画虎也得思考的
UTF8的编译器汉字几乎固定是三个字节 ,本例的汉字内码只有二个字节,
比如原来如 ...

非常感谢!  :handshake:

另 想去看您在sina的博文   URL可能有误, 请核对下

回复 支持 反对

使用道具 举报

发表于 2019-4-14 18:22:39 | 显示全部楼层
这段代码就是顶层应用程序,3级页面,满足一定条件后的显示内容

若想了解每个函数的具体实现细节,就需进一步读代码和分析所使用的LCD的规格,时序等等

带着C基础,去读程序和敲代码,外加勤做实验,细心观察现象+综合判读分析,提高相对较快

回复 支持 反对

使用道具 举报

发表于 2019-4-26 10:17:59 | 显示全部楼层
mircopython当年搜了一个nokia屏的汉显代码,就是分了两部分

chinese.py
  1. class CN_UTF8:
  2.     """docstring for CN_UTF8"""
  3.     #key:values
  4.     #key: 使用汉字的UTF-8码
  5.     #values: 16*16
  6.     #   [0] 8*16 上半部分
  7.     #   [1] 8*16 下半部分
  8.     UTF8_CHINESE = {
  9.         0xe789a9:[
  10.                                         [0x40,0x3C,0x10,0xFF,0x10,0x10,0x20,0x10,0x8F,0x78,0x08,0xF8,0x08,0xF8,0x00,0x00],
  11.                                         [0x02,0x06,0x02,0xFF,0x01,0x01,0x04,0x42,0x21,0x18,0x46,0x81,0x40,0x3F,0x00,0x00]
  12.                 ],#物
  13.         0xe88194:[
  14.                                         [0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0x10,0x11,0x16,0xF0,0x14,0x13,0x10,0x00,0x00],
  15.                                         [0x10,0x1F,0x08,0x08,0xFF,0x04,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00]
  16.                 ],#联
  17.         0xe7bd91:[
  18.                                         [0x00,0xFE,0x02,0x22,0x42,0x82,0x72,0x02,0x22,0x42,0x82,0x72,0x02,0xFE,0x00,0x00],
  19.                                         [0x00,0xFF,0x10,0x08,0x06,0x01,0x0E,0x10,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00]
  20.                 ],#网                  
  21.     }
  22.     #key 汉字的UTF-8码
  23.     #isBottom 确定这次是获取 某个字的 上半部分(0) 还是下半部分(1)
  24.     def get_chinese_utf8(self, key,isBottom = 0):
  25.         values = self.UTF8_CHINESE[key]
  26.         return values[isBottom]
复制代码

upcd8544.py

  1. import chinese
  2. def lcd_write_chineses(str,x,y,space = 9):
  3.         # i,j=0,0
  4.         # lsLen = len(str)
  5.         # while (j<lsLen)
  6.             # self.lcd_write_chinese(str[j],x+(i*space),y)
  7.             # i+=1
  8.             # j+=1
  9.         return 0
  10.    
  11.     def lcd_write_chinese(self,data,x,y):
  12.         #获取 字 的UTF8码
  13.         code = 0x00 #赋初值
  14.         data_code = data.encode("UTF-8")
  15.         code |= data_code[0]<<16
  16.         code |= data_code[1]<<8
  17.         code |= data_code[2]
  18.         #获取 字 的UTF8码 END
  19.         self.position(x,y)
  20.         self.data(self.chinese.get_chinese_utf8(code,0))
  21.         self.position(x,y+1)
  22.         self.data(self.chinese.get_chinese_utf8(code,1))
复制代码
  1. # main.py
  2. import pyb
  3. import upcd8544
  4. from machine import SPI,Pin

  5. def main():
  6.     lcd_5110.lcd_write_string('MicroPython',10,1)

  7.     lcd_5110.lcd_write_chinese("物",18,3)
  8.     lcd_5110.lcd_write_chinese("联",34,3)
  9.     lcd_5110.lcd_write_chinese("网",50,3)

  10.     pyb.delay(1000)

  11. if __name__ == '__main__':
  12.     SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
  13.     RST    = pyb.Pin('X1')
  14.     CE     = pyb.Pin('X2')
  15.     DC     = pyb.Pin('X3')
  16.     LIGHT  = pyb.Pin('X4')
  17.     lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
  18.     while(1):
  19.      main()
复制代码



打赏

参与人数 1家元 +5 收起 理由
不长叶子的树 + 5

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 10:55:35 | 显示全部楼层
qingkong 发表于 2019-4-26 10:17
mircopython当年搜了一个nokia屏的汉显代码,就是分了两部分

chinese.py

:handshake:

8544居然用的是py :shocked:  什么环境?
没想明白

软字库已经在英文字符上实验成功
但汉字还是不行  问题在编码上解析不出来

点评

环境是micropython 我没试过 但是应该是可以地 因为网上N多例子都是这么写的。。。  详情 回复 发表于 2019-4-26 14:34
回复 支持 反对

使用道具 举报

发表于 2019-4-26 14:34:20 | 显示全部楼层
茶壹杯 发表于 2019-4-26 10:55
8544居然用的是py   什么环境?
没想明白

环境是micropython 我没试过 但是应该是可以地 因为网上N多例子都是这么写的。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 22:31 , Processed in 0.280800 second(s), 19 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表