日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于HiSpark WiFi IoT OLED移植到鴻蒙

鴻蒙系統(tǒng)HarmonyOS ? 來源:CSDN 博主 ? 作者:銀塵_ ? 2021-01-28 11:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

效果圖

大家好,我是Gray,是一名默默無聞的嵌入式軟件工程師,比較喜歡鉆研新技術(shù),一直關(guān)注鴻蒙,由于錯過最佳申請板子的時間,現(xiàn)在手頭沒有開發(fā)板,申請的還沒有下文,現(xiàn)在借用別人的,下班回來搞搞,希望官方有多的板子能送我一套3861~~,今天就給大家分享一下我的在移植OLED到鴻蒙,其實也不叫移植,已經(jīng)有大佬們移植好了,我只是修改一些函數(shù),讓它用起來更加的方便,更加符合我們程序猿的使用風(fēng)格,今天的主要內(nèi)容就是讓OLED能通過Printf那樣輸出字符串,支持中英混合的那種,先看效果圖:

可以是這種姿勢:

ssd1306_Print(0,0,"哈嘍鴻蒙", White);

o4YBAGASL0mALx5sAAE1EIa8N3o873.png

這種姿勢:

ssd1306_Print(0,0,"哈嘍Harmony", White);

20201101212613564.png#

甚至還可以這么搞:

sprintf(buff,"溫度 %d C",20);
ssd1306_Print(0,32,buff, White);

pIYBAGASL1qATw_HAAInhVzociA542.png

這樣用不比下面的這樣的香嗎??????

		OLED_ShowCHinese(0,0,0);
		OLED_ShowCHinese(16,0,1);
		OLED_ShowCHinese(32,0,2);
		OLED_ShowCHinese(48,0,3);
		OLED_ShowCHinese(64,0,4);
		OLED_ShowCHinese(80,0,5);
		OLED_ShowCHinese(96,0,6); //顯示 空氣質(zhì)量檢測儀

		OLED_ShowString(0,2,"T:");
    	OLED_ShowNum(16,2,temperature,2,16);//顯示溫度值
		OLED_ShowCHinese(32,2,8);//顯示溫度符號
		OLED_ShowString(56,2,"R:");
		OLED_ShowChar(88,2,'%');//顯示溫度符號
		OLED_ShowNum(72,2,humidity,2,16);

傳統(tǒng)的這種一個字一條語句,你還得算某個字體有沒有越位,或者位置是不是有間隔了。。。這樣浪費多少時間,怎么能容忍這樣的事情發(fā)生呢?堅決不能容忍?。。。〗酉聛砜纯丛趺磁蓗~

移植教程

聲明:跟著本教程操作默認你已經(jīng)搭建好環(huán)境,環(huán)境搭建可移步:

傳送

移植教程已經(jīng)有了,我是參照潤和許老師的教程修改的,移植教程請移步:

[傳送]

教程是把代碼下載到根目錄,并運行,但是我們做項目都是把外設(shè)模塊統(tǒng)一放在app下執(zhí)行,所以我的移植是這樣的:

1.把代碼下載并上傳到 linux服務(wù)器,我的是虛擬機,直接通過共享文件夾上傳到虛擬機桌面,然后敲命令

unzip harmonyos-ssd1306-master.zip -d /home/harmony/harmony/code/code-1.0/applications/sample/wifi-iot/app/

解壓到app文件夾:

o4YBAGASL3GAEw19AAI7Bb7rdO0898.png

然后修改app目錄下的BUILD.gn ,添加"harmonyos-ssd1306:app", 注意分號

然后編譯,下載即可。

如何顯示中文

我們都知道,oled顯示都是ascii碼,那中文是用什么碼來顯示呢?這里普及一下漢字編碼知識:

中文漢字:

字節(jié)數(shù) : 2;編碼:GB2312

字節(jié)數(shù) : 2;編碼:GBK

字節(jié)數(shù) : 2;編碼:GB18030

字節(jié)數(shù) : 1;編碼:ISO-8859-1

字節(jié)數(shù) : 3;編碼:UTF-8

字節(jié)數(shù) : 4;編碼:UTF-16

字節(jié)數(shù) : 2;編碼:UTF-16BE

字節(jié)數(shù) : 2;編碼:UTF-16LE

1、美國人首先對其英文字符進行了編碼,也就是最早的ascii碼,用一個字節(jié)的低7位來表示英文的128個字符,高1位統(tǒng)一為0;

2、后來歐洲人發(fā)現(xiàn)尼瑪你這128位哪夠用,比如我高貴的法國人字母上面的還有注音符,這個怎么區(qū)分,得,把高1位編進來吧,這樣歐洲普遍使用一個全字節(jié)進行編碼,最多可表示256位。歐美人就是喜歡直來直去,字符少,編碼用得位數(shù)少; 3、但是即使位數(shù)少,不同國家地區(qū)用不同的字符編碼,雖然0–127表示的符號是一樣的,但是128–255這一段的解釋完全亂套了,即使2進制完全一樣,表示的字符完全不一樣,比如135在法語,希伯來語,俄語編碼中完全是不同的符號; 4、更麻煩的是,尼瑪這電腦高科技傳到中國后,中國人發(fā)現(xiàn)我們有10萬多個漢字,你們歐美這256字塞牙縫都不夠。于是就發(fā)明了GB2312這些漢字編碼,典型的用2個字節(jié)來表示絕大部分的常用漢字,最多可以表示65536個漢字字符,這樣就不難理解有些漢字你在新華字典里查得到,但是電腦上如果不處理一下你是顯示不出來的了吧。

5、這下各用各的字符集編碼,這世界咋統(tǒng)一?俄國人發(fā)封email給中國人,兩邊字符集編碼不同,尼瑪顯示都是亂碼啊。為了統(tǒng)一,于是就發(fā)明了unicode,將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,現(xiàn)在unicode可以容納100多萬個符號,每個符號的編碼都不一樣,這下可統(tǒng)一了,所有語言都可以互通,一個網(wǎng)頁頁面里可以同時顯示各國文字。

6、然而,unicode雖然統(tǒng)一了全世界字符的二進制編碼,但沒有規(guī)定如何存儲啊,親。x86和amd體系結(jié)構(gòu)的電腦小端序和大端序都分不清,別提計算機如何識別到底是unicode還是acsii了。如果Unicode統(tǒng)一規(guī)定,每個符號用三個或四個字節(jié)表示,那么每個英文字母前都必然有二到三個字節(jié)是0,文本文件的大小會因此大出二三倍,這對于存儲來說是極大的浪費。這樣導(dǎo)致一個后果:出現(xiàn)了Unicode的多種存儲方式。 7、互聯(lián)網(wǎng)的興起,網(wǎng)頁上要顯示各種字符,必須統(tǒng)一啊,親。utf-8就是Unicode最重要的實現(xiàn)方式之一。另外還有utf-16、utf-32等。UTF-8不是固定字長編碼的,而是一種變長的編碼方式。它可以使用1~4個字節(jié)表示一個符號,根據(jù)不同的符號而變化字節(jié)長度。這是種比較巧妙的設(shè)計,如果一個字節(jié)的第一位是0,則這個字節(jié)單獨就是一個字符;如果第一位是1,則連續(xù)有多少個1,就表示當(dāng)前字符占用多少個字節(jié)。

8、注意unicode的字符編碼和utf-8的存儲編碼表示是不同的,例如"嚴"字的Unicode碼是4E25,UTF-8編碼是E4B8A5,這個7里面解釋了的,UTF-8編碼不僅考慮了編碼,還考慮了存儲,E4B8A5是在存儲識別編碼的基礎(chǔ)上塞進了4E25。

9、UTF-8 使用一至四個字節(jié)為每個字符編碼。128 個 ASCII 字符(Unicode 范圍由 U+0000 至 U+007F)只需一個字節(jié),帶有變音符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及馬爾代夫語(Unicode 范圍由 U+0080 至 U+07FF)需要二個字節(jié),其他基本多文種平面(BMP)中的字符(CJK屬于此類-Qieqie注)使用三個字節(jié),其他 Unicode 輔助平面的字符使用四字節(jié)編碼。

所以。。我們可以看看在鴻蒙系統(tǒng)上使用的是什么編碼格式的,先寫個demo驗證一下

void test(void)
{
    uint8_t i = 0;
   
    char *ch = "鴻蒙";
    
    //uint32_t byte;

    printf("len is %d\r\n",strlen(ch));

    for (i = 0; i < strlen(ch); i++)
    {
        printf("code is %x \n", *(ch +i));
    }
}  

輸出

len is 6
code is ffffffe9 
code is ffffffb8 
code is ffffffbf 
code is ffffffe8 
code is ffffff92 
code is ffffff99 

整理一下就是 e9b8bf 和 e89299 兩個漢字6字節(jié),一個就3字節(jié),證明編碼使用UTF-8來的

OK,確定了編碼之后,該如何進行下一步?我們使用的ssd1306是不包含字庫的,所以需要自己生成字庫,那么通常的辦法是把需要的字體生成字庫數(shù)組,然后再通過索引找到這個字再顯示出來,我這個也是這樣的思路,只不過換了個方法來找字體,那就是通過編碼來找。

我們可以先把漢字轉(zhuǎn)成utf-8編碼,比如“鴻蒙”的編碼就是 0xe9b8bf 0xe89299

轉(zhuǎn)換的網(wǎng)站是這個

轉(zhuǎn)換UTF-8

在里面生成UTF-8編碼,然后記住

在代碼里創(chuàng)建一個結(jié)構(gòu)體:

typedef struct 
{
  unsigned int Index;   //漢字編碼UTF-8
  unsigned char Msk[32]; //字模
}typFNT_GB16;

然后創(chuàng)建結(jié)構(gòu)體數(shù)組:

typFNT_GB16 CN16_Msk[2] = {  
{
    0xE9B8BF,
    {       
        0x00,0x80,0x40,0x1F,0x84,0x44,0x44,0x04,0x24,0x44,0xC4,0x47,0x5C,0x48,0x40,0x00,
        0x10,0x20,0x7C,0x44,0x64,0x54,0x44,0x4C,0x40,0x7E,0x02,0x02,0x7A,0x02,0x0A,0x04,/*"鴻",0*/
    }
},

{
    0xE89299,
    {
        0x08,0xFF,0x08,0x7F,0x40,0x8F,0x00,0x7F,0x06,0x3B,0x04,0x19,0x62,0x0C,0x72,0x01,
        0x20,0xFE,0x20,0xFE,0x02,0xE4,0x00,0xFC,0x00,0x08,0xB0,0xC0,0xA0,0x98,0x86,0x00,/*"蒙",1*/
    }
},
};

字模生成使用PCtoLCD 配置是 陰碼,順向,行列式,16進制。

顯示中文代碼

上面的準備工作做好之后,接下來就是編寫顯示的函數(shù)了,一開始想直接用代碼自帶的字庫數(shù)組,無奈,這個代碼的作者是使用u16類型來編碼的,所以無法適配我們u8類型,所以還是得自己編寫,那么實現(xiàn)的代碼如下:

void ssd1306_Print(uint8_t x, uint8_t y, char *s, SSD1306_COLOR color)
{
	unsigned char i,k,length;
	uint32_t Index = 0;
    uint8_t b;
	length = strlen(s);//取字符串總長
	for(k=0; k 127){//大于127,為漢字,UTF-8是3個字節(jié)    
         	Index = ((uint8_t)(*(s+k)) << 16) | ((uint8_t)(*(s+k+1)) << 8) | (uint8_t)((s+k+2));
            //取漢字的編碼
			//printf("byte is %x  \r\n", Index );	
            for(i=0;i

核心也是畫點函數(shù),根據(jù)字節(jié)來確定是否點亮那個位置,

適配英文字符

為了適配英文,原生字庫沒有帶有8x16大小的英文字符數(shù)組,最接近的也是7x10,所以我寫了一個8x16顯示字符的函數(shù):

char ssd1306_DrawChar_u8(char ch, SSD1306_COLOR color) {
    uint32_t i, j;
    uint8_t b;
    // Check if character is valid
    if (ch < 32 || ch > 126)
        return 0;
    // Check remaining space on current line
    if (SSD1306_WIDTH < (SSD1306.CurrentX + 8) ||
        SSD1306_HEIGHT < (SSD1306.CurrentY + 16))
    {
        // Not enough space on current line
        return 0;
    }
    // Use the font to write
    for(i = 0; i < 16; i++) {    //
        b = Font8x16[(ch - 32) * 16 + i]; 
        for(j = 0; j < 8; j++) {
            
            if((b << j) & 0x80)  {
                ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR) color);
            } else {
                ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR)!color);
            }            
        }
    }
    // The current space is now taken
    SSD1306.CurrentX += 8;

    // Return written char for validation
    return ch;
}

這個函數(shù)是對應(yīng)8x16大小的ascii碼,如果想換其他的大小的請自己修改。舉一反三

如果想使用原生字庫,只需把ssd1306_DrawChar_u8(*(s+k), color); 改成ssd1306_DrawChar((s+k),(字體), color);

就可以了,不過中英文混搭輸出還是字體大小對應(yīng)得上比較好。

驗證

? 編寫好代碼之后就是驗證階段了,驗證結(jié)果也就是開頭的效果圖,還別說寫好這樣的代碼以后用起來是很方便的。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OLED
    +關(guān)注

    關(guān)注

    121

    文章

    6375

    瀏覽量

    234369
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    70147
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    嘗試將oreboot移植visionfive上,請問如何能將其刷內(nèi)存上?

    我在嘗試將oreboot移植visionfive上,請問如何能將其刷內(nèi)存上?可以使用secondboot來替換uboot嘛?大小有限制的嘛?
    發(fā)表于 02-06 06:13

    尋求 IOT-MKC3568-Main-v1.1 (基于 EVB1-V10) 開發(fā)板的移植幫助.

    各位社區(qū)前輩、開發(fā)者們,大家好! 我正在嘗試為一款明控創(chuàng)能 IOT-MKC3568-Main-v1.1 的開發(fā)板移植 Ubuntu/Debian 系統(tǒng)。該板無任何官方資料 ,逆向分析顯示其硬件
    發(fā)表于 01-11 22:51

    Stduio使用wifi模塊出錯如何處理?

    外設(shè)為潘多拉IOT開發(fā)板,使用Stduio配置了wifi框架,但是代碼里在配置wifi模式時,沒有找到wlan0這個設(shè)備,wifi整個功能也用不了,請問應(yīng)該如何處理。使用正點原子資料包
    發(fā)表于 10-10 08:18

    STM32標(biāo)準庫在Keil5移植rtthread nano后無法顯示oled內(nèi)容是怎么回事?

    單獨把OLED_Update()函數(shù)獨立出來就無法執(zhí)行,屏幕黑屏怎么回事呢? 或者有沒有大佬有在Keil5 STM32標(biāo)準庫上移植rtthread系統(tǒng)又使用到oled屏幕顯示的
    發(fā)表于 09-22 08:28

    AP6181移植STM32H723,wifi庫初始化錯誤怎么解決?

    wifi_image_0.1.rbl,OTA庫采用了libota_noalgo_0.1.2_stm32l4_gcc.a. 已經(jīng)成功移植了FAL、SFUD、easyflash、filesystem,sdio驅(qū)動使用了art-pi
    發(fā)表于 09-18 08:20

    開源鴻蒙MNN AI應(yīng)用開發(fā)與MNN移植經(jīng)驗

    本期內(nèi)容由AI Model SIG提供,介紹了在開源鴻蒙中,利用MNN開源框架開發(fā)AI應(yīng)用以及基于MNN源碼編譯與Har包封裝的方法。
    的頭像 發(fā)表于 09-04 11:31 ?5056次閱讀
    開源<b class='flag-5'>鴻蒙</b>MNN AI應(yīng)用開發(fā)與MNN<b class='flag-5'>移植</b>經(jīng)驗

    NB-IoT無線模組咨詢

    我們公司是做外貿(mào)的, 目前想配NB-IoT無線模組在設(shè)備上, 由于對NB-IoT無線模組不熟悉, 想咨詢關(guān)于移遠,利爾達等無線模組(對應(yīng)Band 3/8/20)的事情, 請問有無公司或大神能咨詢下
    發(fā)表于 09-01 23:42

    恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植

    本篇還是以移植RT-Thread NanoMCUXpresso IDE為主,移植的代碼可以在nxpic.org.cn論壇搜索
    的頭像 發(fā)表于 08-21 09:49 ?6985次閱讀
    恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano<b class='flag-5'>移植</b>

    【RA-Eco-RA6M4開發(fā)板評測】2、I2C外設(shè)驅(qū)動OLED屏幕和移植u8g2

    ://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/ u8g2移植簡述 在SeeedStudio官方的使用手中,在Arduino平臺上使用u8g2圖形庫來驅(qū)動OLED
    發(fā)表于 07-23 13:51

    2025年WiFi技術(shù)白皮書:全球物聯(lián)網(wǎng)無線通信的關(guān)鍵創(chuàng)新

    隨著物聯(lián)網(wǎng)(IoT)的快速發(fā)展,無線通信技術(shù)正成為推動全球數(shù)字化轉(zhuǎn)型的重要引擎。作為物聯(lián)網(wǎng)連接的核心技術(shù)之一,WiFi 近年來經(jīng)歷了從 WiFi 6
    的頭像 發(fā)表于 07-08 11:26 ?2565次閱讀

    機智云配網(wǎng)教程第三期:單片機代碼移植實戰(zhàn)

    :stm32f103c8t6,WiFi模塊:ESP-01s,下載器:ST-LINK2.軟件:keil5的工程文件模板,mcu代碼包代碼資源:未移植移植后(注:本文是基于stm32標(biāo)
    的頭像 發(fā)表于 07-01 17:32 ?2205次閱讀
    機智云配網(wǎng)教程第三期:單片機代碼<b class='flag-5'>移植</b>實戰(zhàn)

    從“開發(fā)者孤島”“生態(tài)星河”:開鴻Bot如何重構(gòu)開源鴻蒙開發(fā)體驗

    在中國操作系統(tǒng)發(fā)展史上,“開發(fā)者”似乎從來都是一個邊緣角色。他們是開源社區(qū)中最活躍的群體,卻也是最常被忽視的那群人。具體開源鴻蒙社區(qū),其生態(tài)構(gòu)建初期,諸多開發(fā)者曾坦言,“鴻蒙很好,但不知道從哪下手
    的頭像 發(fā)表于 06-10 17:12 ?1868次閱讀
    從“開發(fā)者孤島”<b class='flag-5'>到</b>“生態(tài)星河”:開鴻Bot如何重構(gòu)開源<b class='flag-5'>鴻蒙</b>開發(fā)體驗

    浩辰CAD看圖王:攜手鴻蒙,CAD技術(shù)創(chuàng)新驅(qū)動企業(yè)數(shù)字化轉(zhuǎn)型

    日前,浩辰CAD看圖王等國產(chǎn)工業(yè)軟件正式完成了對鴻蒙電腦、鴻蒙手機、鴻蒙平板等多終端設(shè)備的全面適配,結(jié)合鴻蒙的多端互通、協(xié)同能力,為用戶帶來全新體驗。深度適配
    的頭像 發(fā)表于 05-30 12:50 ?1232次閱讀
    浩辰CAD看圖王:攜手<b class='flag-5'>鴻蒙</b>,CAD技術(shù)創(chuàng)新驅(qū)動企業(yè)數(shù)字化轉(zhuǎn)型

    CAN轉(zhuǎn)WiFi#三格電子#CAN轉(zhuǎn)WiFi

    WIFI
    三格電子科技
    發(fā)布于 :2025年05月19日 11:38:37

    鴻蒙操作系統(tǒng)首登電腦端,華為開啟鴻蒙辦公新時代

    從2021年鴻蒙電腦原型機開始,華為歷時五年打磨,正式推出搭載鴻蒙操作系統(tǒng)的鴻蒙電腦,使華為“1+8+N”全場景生態(tài)更加完善。從鴻蒙手機、鴻蒙
    發(fā)表于 05-08 14:20 ?6249次閱讀
    <b class='flag-5'>鴻蒙</b>操作系統(tǒng)首登電腦端,華為開啟<b class='flag-5'>鴻蒙</b>辦公新時代
    谷城县| 石家庄市| 南昌县| 鞍山市| 达州市| 准格尔旗| 南木林县| 文登市| 梁河县| 普兰店市| 南靖县| 太湖县| 泸州市| 抚顺县| 宁德市| 普洱| 永顺县| 阜新| 宕昌县| 阳高县| 泗阳县| 吴川市| 铁岭市| 兴安县| 桐柏县| 平阴县| 泰兴市| 兴业县| 鄂托克旗| 凯里市| 泰宁县| 保靖县| 南充市| 西乡县| 莆田市| 西平县| 大城县| 清苑县| 奉贤区| 盘山县| 桂阳县|