本文來(lái)源電子發(fā)燒友社區(qū),作者:徐以鋒, 帖子地址:https://bbs.elecfans.com/jishu_2012060_1_1.html
上一篇報(bào)告已經(jīng)過(guò)去一個(gè)月了,主要是公司項(xiàng)目太急,耽擱太長(zhǎng)時(shí)間。上一次的報(bào)告主要主要介紹了HI3861的IIC操作,控制OLED顯示英文“hello world”,當(dāng)時(shí)調(diào)試的時(shí)候其實(shí)是想顯示中文的,但是因?yàn)樵菼AR開(kāi)發(fā)環(huán)境下的中文顯示程序移植到鴻蒙里面后居然一堆錯(cuò)誤,編譯器差異文中對(duì)應(yīng)細(xì)節(jié)會(huì)詳述,所以只顯示了英文。
上一篇報(bào)告已經(jīng)過(guò)去一個(gè)月了,主要是公司項(xiàng)目太急,耽擱太長(zhǎng)時(shí)間。上一次的報(bào)告主要主要介紹了HI3861的IIC操作,控制OLED顯示英文“hello world”,當(dāng)時(shí)調(diào)試的時(shí)候其實(shí)是想顯示中文的,但是因?yàn)樵菼AR開(kāi)發(fā)環(huán)境下的中文顯示程序移植到鴻蒙里面后居然一堆錯(cuò)誤,編譯器差異文中對(duì)應(yīng)細(xì)節(jié)會(huì)詳述,所以只顯示了英文。
那之后總歸覺(jué)得OLED怎么也得能顯示中文吧,所以本篇主要介紹怎么在OLED上顯示中文,當(dāng)然是基于上次報(bào)告的代碼,最終代碼會(huì)在文末附件里。主要內(nèi)容有如下幾點(diǎn):
1、 漢字取模
2、 代碼編寫(xiě)修改
3、 燒錄測(cè)試
一、漢字取模
上次報(bào)告已經(jīng)介紹過(guò),套件使用的OLED顯示cache如下圖所示,顯示點(diǎn)陣對(duì)應(yīng)cache每個(gè)字節(jié)的順序是從左到右從上倒下,而顯示的每個(gè)字節(jié)的bit是高位在下。

通過(guò)顯存與點(diǎn)陣對(duì)應(yīng)關(guān)系,那漢字取模要遵循字節(jié)從左到右從上到下,字節(jié)內(nèi)為縱向8點(diǎn)(一個(gè)字節(jié)位數(shù))下高位取模方式,使用的取模軟件是“LcmZimoLCD字模提取工具軟件”,報(bào)告后邊會(huì)在附件中體現(xiàn)。因此,最終軟件設(shè)置界面設(shè)置內(nèi)容如下圖所示:

設(shè)置完成后點(diǎn)擊“參數(shù)確認(rèn)“并在下方文字框中輸入”你好“并點(diǎn)擊輸入字串進(jìn)入下一界面,下一界面如下圖所示:

由圖中可以看出漢字取模已經(jīng)完成,并直接生成C語(yǔ)言代碼。形式如下:
- // ------------------漢字字模的數(shù)據(jù)結(jié)構(gòu)定義------------------------ //
- typedef struct typFNT_GB16 // 漢字字模數(shù)據(jù)結(jié)構(gòu)
- {
- signed char Index[2]; // 漢字內(nèi)碼索引
- char Msk[32]; // 點(diǎn)陣碼數(shù)據(jù)
- };
- /////////////////////////////////////////////////////////////////////////
- // 漢字字模表 //
- // 漢字庫(kù): 宋體16.dot 縱向取模下高位,數(shù)據(jù)排列:從左到右從上到下 //
- /////////////////////////////////////////////////////////////////////////
- struct typFNT_GB16 code GB_16[] = // 數(shù)據(jù)表
- {
- "你",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
- };
- // 漢字表:
- // 你好
此處生成的代碼需要做進(jìn)一步修改方可使用鴻蒙系統(tǒng)使用的GCC編譯器,具體修改內(nèi)容會(huì)在代碼修改中做詳述。
二、代碼編寫(xiě)與修改
代碼修改主要有如下幾點(diǎn)。
1、 單個(gè)漢字字符機(jī)構(gòu)體修改:
修改漢字取模軟件生成的代碼,能夠通過(guò)鴻蒙交叉編譯器,其中結(jié)構(gòu)體 struct typFNT_GB16 內(nèi)的signed char Index[2]; 索引值由2更改為3,因?yàn)閱蝹€(gè)漢字在雙引號(hào)內(nèi)時(shí)還需要一個(gè)字節(jié)存儲(chǔ)字符串結(jié)束字符“”。最終更改后的結(jié)構(gòu)體如下:
- struct typFNT_GB16 // 漢字字模數(shù)據(jù)結(jié)構(gòu)
- {
- unsigned charindex[3]; // 漢字內(nèi)碼索引
- charmask[32]; // 點(diǎn)陣碼數(shù)據(jù)
- };
2、 漢字碼表:
查看上文中生成的漢字碼表struct typFNT_GB16 code GB_16[],可以看出字模軟件將所有數(shù)據(jù)都以字節(jié)數(shù)組的方式存放的,這種存放方式在IAR中可以直接編譯通過(guò),也就是IAR會(huì)將字符數(shù)組映射到struct typFNT_GB16內(nèi)容中,而鴻蒙使用的GCC編譯器不支持此類(lèi)操作,所以上次報(bào)告未能實(shí)現(xiàn)中文顯示。根據(jù)編譯器報(bào)錯(cuò)提示,需要將生成的漢字碼表更改為如下:
- 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、 顯示函數(shù)添加中文顯示代碼:
需要在OLED驅(qū)動(dòng)中添加漢字處理部分,本報(bào)告依據(jù)上一個(gè)報(bào)告主要是修改OLED_DrawString16函數(shù)。其中有幾個(gè)需要特別注意的在代碼中有注釋。修改后代碼如下:
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 != '')
- {
- // 判斷當(dāng)前字節(jié)是不是漢字字符,
- // 漢字編碼用兩個(gè)字節(jié)表示一個(gè)漢字,并且起始自己大余0x7f
- // 本來(lái)使用(*p_str)<0X80,但是編譯器編譯有Warning提示
- // 提示為此條指令永遠(yuǎn)為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);
- // 此處多一個(gè)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;
- }
以上代碼修改過(guò)程中從注釋可以看出有兩個(gè)地方編譯器有特別之處,第一個(gè)在代碼注釋中已經(jīng)解釋?zhuān)诙€(gè)貼別解釋一下,因?yàn)楸救艘埠芾Щ蟆?/font>
其中((*p_str)&0xff) == p_cn_lib->index[0]這一條,p_str按照定義類(lèi)型是“constchar*”,對(duì)其取值應(yīng)該是char類(lèi)型,而實(shí)際取值后是一個(gè)4字節(jié)數(shù)值。可能所使用的gcc中char為4字節(jié)的類(lèi)型,使用printf("[xxxxx] *p_str =%x.
",*p_str);語(yǔ)句串口打印居然在字符值前面添加了0xffffff--。所以才有了((*p_str)&0xff)的處理。此處問(wèn)題折騰了半個(gè)下午才找到原因,一方面對(duì)gcc使用不多,不是很熟悉,另一方面可能是自己編程方式有問(wèn)題。
",*p_str);語(yǔ)句串口打印居然在字符值前面添加了0xffffff--。所以才有了((*p_str)&0xff)的處理。此處問(wèn)題折騰了半個(gè)下午才找到原因,一方面對(duì)gcc使用不多,不是很熟悉,另一方面可能是自己編程方式有問(wèn)題。
4、 顯示代碼添加:
在OLED顯示驅(qū)動(dòng)中添加OLED_DrawString16(8,4,"你好",1);語(yǔ)句,并修改BUILD.gn文件添加字庫(kù)代碼文件,編譯生成bin文件。
三、編譯測(cè)試
編譯測(cè)試不多說(shuō)了,下載后按RESET按鍵重啟,OLED顯示內(nèi)容如下圖:

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
wi-fi
+關(guān)注
關(guān)注
14文章
2227瀏覽量
126456 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
2053瀏覽量
32136 -
HiSpark
+關(guān)注
關(guān)注
1文章
156瀏覽量
7308
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
Wi-Fi 8要來(lái)了!未來(lái)Wi-Fi技術(shù)演進(jìn)方向揭秘
產(chǎn)品銷(xiāo)售中,雖然Wi-Fi 7產(chǎn)品的銷(xiāo)量份額快速?gòu)哪瓿醯膫€(gè)位數(shù)百分比增長(zhǎng)至14%,但Wi-Fi 6產(chǎn)品的銷(xiāo)量份額依然穩(wěn)定在60%左右。如果從存量設(shè)備來(lái)看,那么Wi-Fi 7路由器的占比將遠(yuǎn)遠(yuǎn)小于這個(gè)數(shù)。 ? 智能手機(jī)等終端設(shè)備已

Wi-Fi HaLow如何突破傳統(tǒng)Wi-Fi性能瓶頸?
!傳統(tǒng)Wi-Fi的痛點(diǎn)高頻段衰減快:5GHz信號(hào)穿墻后衰減超80%,地下室、倉(cāng)庫(kù)成盲區(qū);大帶寬高耗電:設(shè)備需持續(xù)處理高速數(shù)據(jù)流,智能門(mén)鎖電池1個(gè)月耗盡;信道擁堵:

基于 Wi-Fi 的定位服務(wù)
以下捕獲使用 location_wifi_get 函數(shù)請(qǐng)求 Wi-Fi 定位服務(wù)。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。
Got location:
method
發(fā)表于 04-17 15:16
nRF Cloud Wi-Fi 定位服務(wù)
、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過(guò)利用 nRF Cloud 的優(yōu)化定位算法,基于 Nordic SoC 和 模組的產(chǎn)品可在定位用例
發(fā)表于 04-17 15:07
Wi-Fi 定位服務(wù)
Wi-Fi 是一種著名的無(wú)線網(wǎng)絡(luò)技術(shù),用于設(shè)備的局域網(wǎng)和互聯(lián)網(wǎng)接入。Wi-Fi 通過(guò) Wi-Fi 網(wǎng)絡(luò)為家庭、辦公室和學(xué)校等環(huán)境提供便捷的無(wú)線互聯(lián)網(wǎng)接入服務(wù)。
Wi-Fi 定位是一種
發(fā)表于 04-17 15:01
Wi-Fi 7 與頻率控制的關(guān)系
和 5 GHz 頻段,這些頻段設(shè)備撥號(hào)進(jìn)入信道的干擾最小。 聯(lián)網(wǎng)設(shè)備數(shù)量的爆炸式增長(zhǎng)已使容量不堪重負(fù)。根據(jù) Wi-Fi 聯(lián)盟的數(shù)據(jù),預(yù)計(jì)僅在 2024 年,啟用 Wi-Fi 的設(shè)備就將達(dá)到 41 億

華為海思正式進(jìn)入Wi-Fi FEM賽道?
產(chǎn)品和技術(shù)交流。
2017年是國(guó)產(chǎn)Wi-Fi FEM元年,銳迪科(RDA)是中國(guó)大陸第一家推出和量產(chǎn)Wi-Fi5 FEM的公司,也是第一家導(dǎo)入H公司的Wi-Fi FEM廠商。
也是在這一年,我頻繁地跟H
發(fā)表于 12-11 17:42
摩爾斯微電子發(fā)布Wi-Fi HaLow評(píng)估套件,加速物聯(lián)網(wǎng)開(kāi)發(fā)
近日,全球領(lǐng)先的Wi-Fi HaLow解決方案提供商摩爾斯微電子正式推出一款開(kāi)創(chuàng)性的評(píng)估套件——MM6108-EKH05。這款完全整合的開(kāi)發(fā)平臺(tái),旨在推動(dòng)各行業(yè)物聯(lián)網(wǎng)解決方案的快速發(fā)展
從Wi-Fi 4到Wi-Fi 7:網(wǎng)速飆升40倍的無(wú)線革命
Wi-Fi 4首次引入MIMO和40 MHz頻寬,是基礎(chǔ)的高效無(wú)線網(wǎng)絡(luò)標(biāo)準(zhǔn)。 ? Wi-Fi 5 Wi-Fi 5擁有更高的數(shù)據(jù)速率,專(zhuān)注于

Wi-Fi 7有哪些底層技術(shù)優(yōu)勢(shì)
您在多個(gè)Wi-Fi行業(yè)活動(dòng)中代表LitePoint。Wi-Fi 7帶來(lái)了哪些新穎且有趣的特點(diǎn)?
Wi-Fi 7與Wi-Fi 6E有什么區(qū)別
也許很多人還在考慮是否要將使用的Wi-Fi設(shè)備升級(jí)到Wi-Fi 6或Wi-Fi 6E,而這些標(biāo)準(zhǔn)的繼任者卻已經(jīng)開(kāi)始“登堂入室”了。Wi-Fi 7是新一代
最典型的3家Wi-Fi Halow芯片企業(yè)
Wi-Fi Halow是Wi-Fi聯(lián)盟推出的專(zhuān)門(mén)面向物聯(lián)網(wǎng)市場(chǎng)的標(biāo)準(zhǔn)。

IR900 Wi-Fi聯(lián)網(wǎng)的配置過(guò)程
, 通過(guò)SSID掃描可以查看;輸入密碼,點(diǎn)擊保存;
在SSID掃描頁(yè)面中查看是否連接成功, 如果沒(méi)有請(qǐng)檢查認(rèn)證方式、加密方式、密碼是否輸入正確;
Wi-Fi掃描顯示“已連接”,進(jìn)入“快速向?qū)?新建WAN
發(fā)表于 07-25 06:09
如何記住ESP8266中的Wi-Fi憑據(jù)?
您好,我正在與ESP8266合作,在公司進(jìn)行一個(gè)項(xiàng)目。在成功智能配置后,我無(wú)法記住 Wi-Fi 憑據(jù)。ESP8266軟件版本如下:
在GMR
AT版本:1.2.0.0(Jul 1, 2016 20
發(fā)表于 07-15 07:07
評(píng)論