本文来源电子发烧友社区,作者:徐以锋, 帖子地址:https://bbs.elecfans.com/jishu_2012060_1_1.html
上一篇报告已经过去一个月了,主要是公司项目太急,耽搁太长时间。上一次的报告主要主要介绍了HI3861的IIC操作,控制OLED显示英文“hello world”,当时调试的时候其实是想显示中文的,但是因为原先IAR开发环境下的中文显示程序移植到鸿蒙里面后居然一堆错误,编译器差异文中对应细节会详述,所以只显示了英文。
上一篇报告已经过去一个月了,主要是公司项目太急,耽搁太长时间。上一次的报告主要主要介绍了HI3861的IIC操作,控制OLED显示英文“hello world”,当时调试的时候其实是想显示中文的,但是因为原先IAR开发环境下的中文显示程序移植到鸿蒙里面后居然一堆错误,编译器差异文中对应细节会详述,所以只显示了英文。
那之后总归觉得OLED怎么也得能显示中文吧,所以本篇主要介绍怎么在OLED上显示中文,当然是基于上次报告的代码,最终代码会在文末附件里。主要内容有如下几点:
1、 汉字取模
2、 代码编写修改
3、 烧录测试
一、汉字取模
上次报告已经介绍过,套件使用的OLED显示cache如下图所示,显示点阵对应cache每个字节的顺序是从左到右从上倒下,而显示的每个字节的bit是高位在下。

通过显存与点阵对应关系,那汉字取模要遵循字节从左到右从上到下,字节内为纵向8点(一个字节位数)下高位取模方式,使用的取模软件是“LcmZimoLCD字模提取工具软件”,报告后边会在附件中体现。因此,最终软件设置界面设置内容如下图所示:

设置完成后点击“参数确认“并在下方文字框中输入”你好“并点击输入字串进入下一界面,下一界面如下图所示:

由图中可以看出汉字取模已经完成,并直接生成C语言代码。形式如下:
- // ------------------汉字字模的数据结构定义------------------------ //
- typedef struct typFNT_GB16 // 汉字字模数据结构
- {
- signed char Index[2]; // 汉字内码索引
- char Msk[32]; // 点阵码数据
- };
- /////////////////////////////////////////////////////////////////////////
- // 汉字字模表 //
- // 汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下 //
- /////////////////////////////////////////////////////////////////////////
- struct typFNT_GB16 code GB_16[] = // 数据表
- {
- "你",0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,
- 0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
- 0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,
- 0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00,
- "好",0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,
- 0x82,0x82,0xE2,0x92,0x8A,0xC6,0x80,0x00,
- 0x40,0x22,0x15,0x08,0x14,0x63,0x00,0x00,
- 0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00
- };
- // 汉字表:
- // 你好
此处生成的代码需要做进一步修改方可使用鸿蒙系统使用的GCC编译器,具体修改内容会在代码修改中做详述。
二、代码编写与修改
代码修改主要有如下几点。
1、 单个汉字字符机构体修改:
修改汉字取模软件生成的代码,能够通过鸿蒙交叉编译器,其中结构体 struct typFNT_GB16 内的signed char Index[2]; 索引值由2更改为3,因为单个汉字在双引号内时还需要一个字节存储字符串结束字符“”。最终更改后的结构体如下:
- struct typFNT_GB16 // 汉字字模数据结构
- {
- unsigned charindex[3]; // 汉字内码索引
- charmask[32]; // 点阵码数据
- };
2、 汉字码表:
查看上文中生成的汉字码表struct typFNT_GB16 code GB_16[],可以看出字模软件将所有数据都以字节数组的方式存放的,这种存放方式在IAR中可以直接编译通过,也就是IAR会将字符数组映射到struct typFNT_GB16内容中,而鸿蒙使用的GCC编译器不支持此类操作,所以上次报告未能实现中文显示。根据编译器报错提示,需要将生成的汉字码表更改为如下:
- const structtypFNT_GB16ST_GB_16[] =
- {
- {
- {"你",},
- {
- 0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,
- 0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
- 0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,
- 0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00,
- }
- },
- {
- {"好",},
- {
- 0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,
- 0x82,0x82,0xE2,0x92,0x8A,0xC6,0x80,0x00,
- 0x40,0x22,0x15,0x08,0x14,0x63,0x00,0x00,
- 0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
- }
- },
- };
3、 显示函数添加中文显示代码:
需要在OLED驱动中添加汉字处理部分,本报告依据上一个报告主要是修改OLED_DrawString16函数。其中有几个需要特别注意的在代码中有注释。修改后代码如下:
i
- ntOLED_DrawString16(int x, int y ,constchar* p_str, int color)
- {
- int i , j , m ;
- const unsigned char *p_asc= 0;
- const char* p_cn= 0;
- const struct typFNT_GB16* p_cn_lib ;
- if((x >= 120) || (y >= 7))
- return -1;
- while(*p_str != '')
- {
- // 判断当前字节是不是汉字字符,
- // 汉字编码用两个字节表示一个汉字,并且起始自己大余0x7f
- // 本来使用(*p_str)<0X80,但是编译器编译有Warning提示
- // 提示为此条指令永远为true,编译中不允许有告警故更改为
- //(*p_str)&0X80)==0
- if(((*p_str)&0X80)==0)
- {
- p_asc = nAsciiDot16X8 + ((*p_str -32)<< 4) ;
- for(j = 0 ; j < 2 ; j++)
- {
- for(i = 0 ; i < 8 ; i++)
- {
- if(color)
- {
- OLEDBuffer[(y + j)][x +i]= * p_asc ++;
- }
- else
- {
- OLEDBuffer[(y + j)][x +i] = ~(* p_asc ++) ;
- }
- }
- }
- x += 8 ;
- p_str ++ ;
- }
- Else
- {
- printf("[xxxxx]hanzi.
- ");
- p_cn = (char*)-1;
- p_cn_lib = ST_GB_16 ;
- m = GetSTLiberayNum();
- for(i = 0 ; i < m ; i++)
- {
- printf("[xxxxx] *p_str =%x.
- ",*p_str);
- // 此处多一个char型指针取值与0xff解释在代码末尾
- if(((*p_str)&0xff) ==p_cn_lib->index[0])
- {
- printf("[xxxxx]bingo1.
- ");
- if(((*(p_str+1))&0xff)== p_cn_lib->index[1])
- {
- p_cn = p_cn_lib->mask ;
- printf("[xxxxx]bingo2.
- ");
- break ;
- }
- }
- p_cn_lib++;
- }
- if(p_cn != (char*)-1)
- {
- for(j = 0 ; j < 2 ; j++)
- {
- for(i = 0 ; i < 16 ;i++)
- {
- if(color)
- {
- OLEDBuffer[(y +j)][x + i]= * p_cn ++;
- }
- else
- {
- OLEDBuffer[(y +j)][x + i] = ~(* p_cn ++) ;
- }
- }
- }
- }
- x += 16 ;
- p_str += 2;
- }
- }
- return x;
- }
以上代码修改过程中从注释可以看出有两个地方编译器有特别之处,第一个在代码注释中已经解释,而第二个贴别解释一下,因为本人也很困惑。
其中((*p_str)&0xff) == p_cn_lib->index[0]这一条,p_str按照定义类型是“constchar*”,对其取值应该是char类型,而实际取值后是一个4字节数值。可能所使用的gcc中char为4字节的类型,使用printf("[xxxxx] *p_str =%x.
",*p_str);语句串口打印居然在字符值前面添加了0xffffff--。所以才有了((*p_str)&0xff)的处理。此处问题折腾了半个下午才找到原因,一方面对gcc使用不多,不是很熟悉,另一方面可能是自己编程方式有问题。
",*p_str);语句串口打印居然在字符值前面添加了0xffffff--。所以才有了((*p_str)&0xff)的处理。此处问题折腾了半个下午才找到原因,一方面对gcc使用不多,不是很熟悉,另一方面可能是自己编程方式有问题。
4、 显示代码添加:
在OLED显示驱动中添加OLED_DrawString16(8,4,"你好",1);语句,并修改BUILD.gn文件添加字库代码文件,编译生成bin文件。
三、编译测试
编译测试不多说了,下载后按RESET按键重启,OLED显示内容如下图:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
wi-fi
+关注
关注
15文章
2379浏览量
128899 -
HarmonyOS
+关注
关注
80文章
2146浏览量
35576 -
HiSpark
+关注
关注
1文章
156浏览量
7688
发布评论请先 登录
相关推荐
热点推荐
浅谈Wi-Fi 6E与Wi-Fi 7的关键器件——BAW滤波器新技术
,美国联邦通信委员会(FCC)投票通过将6GHz频谱划为免许可频段供Wi-Fi使用,这标志着Wi-Fi正式进入“三频”时代——除Wi-Fi 6及前代技术使用的2.4GHz和5GHz频段
发表于 09-19 18:29
•1320次阅读
LitePoint Wi-Fi测试软件减轻客户设计负担
自Wi-Fi 7于一年多前获得Wi-Fi联盟认证以来,作为最新一代通信技术,Wi-Fi正逐步成为用户实现无所不在无线连接的新选择。随着每一代Wi-Fi信号复杂性的提升,建议将硬件测试纳
Texas Instruments CC335x SimpleLink™双频Wi-Fi® 6配套IC数据手册
) 和Wi-Fi 5 (802.11ac)。这些CC335x是Texas Instruments的第10代连接组合芯片。因此,CC335x基于成熟的技术设计而成。这些器件非常适合配备运行TCP/IP的Linux或
有没有什么修复方法可以确保 AP 模式下的 Wi-Fi 和 BLE 连接同时正常工作?
我正在使用 CYBSYSKIT DEV 01 套件。我尝试在 AP 模式下打开 Wi-Fi 并宣传 BLE。我可以宣传 SoftAP 和 BLE。但是,我无法从中央设备连接到 BLE。它可以立即连接并断开连接。有没有什么修复方法可以确保 AP 模式下的
发表于 07-17 06:13
Wi-Fi 8:开启极高可靠性 (UHR) 连接的新纪元——1
Wi-Fi Alliance 所发布的统计资料显示(如图1所示),截至2024年,Wi-Fi 所贡献的:
• 经济产值为 4.3万亿美元
• 带有Wi-Fi功能的设备年度出货为41亿台
发表于 06-13 11:09
Wi-Fi HaLow如何突破传统Wi-Fi性能瓶颈?
!传统Wi-Fi的痛点高频段衰减快:5GHz信号穿墙后衰减超80%,地下室、仓库成盲区;大带宽高耗电:设备需持续处理高速数据流,智能门锁电池1个月耗尽;信道拥堵:
基于 Wi-Fi 的定位服务
以下捕获使用 location_wifi_get 函数请求 Wi-Fi 定位服务。该事件的总功耗为 125.85mC,日志显示精确度为 30.0m。
Got location:
method
发表于 04-17 15:16
nRF Cloud Wi-Fi 定位服务
、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通过利用 nRF Cloud 的优化定位算法,基于 Nordic SoC 和 模组的产品可在定位用例
发表于 04-17 15:07
Wi-Fi 定位服务
Wi-Fi 是一种著名的无线网络技术,用于设备的局域网和互联网接入。Wi-Fi 通过 Wi-Fi 网络为家庭、办公室和学校等环境提供便捷的无线互联网接入服务。
Wi-Fi 定位是一种
发表于 04-17 15:01
2.4GHz+5GHz双频低功耗 Wi-Fi 6协同IC -nRF7002
开发人员能够充分发挥Wi-Fi 6的潜力,包括更高的数据传输速率、更大的容量和更高的能效,以及Nordic一流的LTE-M/NB-IoT和BluetoothLE解决方案,从而简化开发过程并加快产品上市
发表于 02-26 14:54
Wi-Fi 7 与频率控制的关系
和 5 GHz 频段,这些频段设备拨号进入信道的干扰最小。 联网设备数量的爆炸式增长已使容量不堪重负。根据 Wi-Fi 联盟的数据,预计仅在 2024 年,启用 Wi-Fi 的设备就将达到 41 亿
华为海思正式进入Wi-Fi FEM赛道?
产品和技术交流。
2017年是国产Wi-Fi FEM元年,锐迪科(RDA)是中国大陆第一家推出和量产Wi-Fi5 FEM的公司,也是第一家导入H公司的Wi-Fi FEM厂商。
也是在这一年,我频繁地跟H
发表于 12-11 17:42
摩尔斯微电子发布Wi-Fi HaLow评估套件,加速物联网开发
近日,全球领先的Wi-Fi HaLow解决方案提供商摩尔斯微电子正式推出一款开创性的评估套件——MM6108-EKH05。这款完全整合的开发平台,旨在推动各行业物联网解决方案的快速发展

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】基于HiSpark Wi-Fi IoT套件_5-OLED中文显示
评论