本文來源電子發燒友社區,作者:徐以鋒, 帖子地址: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字節數值??赡芩褂玫膅cc中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
+關注
關注
14文章
2162瀏覽量
124789 -
HarmonyOS
+關注
關注
79文章
1980瀏覽量
30395 -
HiSpark
+關注
關注
1文章
156瀏覽量
6943
發布評論請先 登錄
相關推薦
Wi-Fi 8要來了!未來Wi-Fi技術演進方向揭秘
產品銷售中,雖然Wi-Fi 7產品的銷量份額快速從年初的個位數百分比增長至14%,但Wi-Fi 6產品的銷量份額依然穩定在60%左右。如果從存量設備來看,那么Wi-Fi 7路由器的占比將遠遠小于這個數。 ? 智能手機等終端設備已
華為海思正式進入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。這款完全整合的開發平臺,旨在推動各行業物聯網解決方案的快速發展
Wi-Fi 7與Wi-Fi 6E有什么區別
也許很多人還在考慮是否要將使用的Wi-Fi設備升級到Wi-Fi 6或Wi-Fi 6E,而這些標準的繼任者卻已經開始“登堂入室”了。Wi-Fi 7是新一代
未來的Wi-Fi路由器
廠家加入開始殺價,Wi-Fi FEM由于廠家眾多,價格一降再降,直接殺到成本價以下,DC-DC電源芯片也好不到哪里去,供應商的上市年度報和季度報也是不堪入眼。 除了跟著主芯片從Wi-Fi4升級到Wi-Fi5,再從
DA16200 超低功耗 Wi-Fi 模塊開發套件 Pro數據手冊
電子發燒友網站提供《DA16200 超低功耗 Wi-Fi 模塊開發套件 Pro數據手冊.rar》資料免費下載
發表于 05-30 17:53
?1次下載
DA16200 超低功耗 Wi-Fi 模塊開發套件數據手冊
電子發燒友網站提供《DA16200 超低功耗 Wi-Fi 模塊開發套件數據手冊.rar》資料免費下載
發表于 05-30 17:13
?0次下載
驗證物聯網Wi-Fi HaLow用例的MM6108-EKH08開發套件來啦
驗證物聯網Wi-Fi HaLow用例的MM6108-EKH08開發套件來啦 MM6108-EKH08開發套件專為驗證物聯網Wi-Fi HaLow用例而設計。該
Wi-Fi HaLow和傳統Wi-Fi的區別
Wi-Fi HaLow和傳統Wi-Fi的區別? Wi-Fi是一種無線網絡技術,可以連接到互聯網或局域網,為用戶提供無線上網的便利。隨著科技的發展和互聯網的普及,Wi-Fi也在不斷演進和
康普攜手Wi-Fi聯盟,RUCKUS Wi-Fi 7系列接入點成Wi-Fi
康普高級副總裁兼網絡、智能蜂窩和安全解決方案總裁Bart Giordano對此表示: “我們非常榮幸能與Wi-Fi Alliance形成長期合作伙伴關系,將我們的RUCKUS Wi-Fi 7 接入點平臺作為Wi-Fi CERT
評論