日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]請(qǐng)留意變量數(shù)據(jù)類型的范圍!

國(guó)慶中秋這些天沒(méi)有回汕頭,一直留在深圳家里,據(jù)說(shuō)深圳回汕頭300公里的路,老爸國(guó)慶中秋當(dāng)天早上10點(diǎn)回去,開了20個(gè)小時(shí)才到家,也就是第二天才到,于是我就選擇不回去了,白天帶家人出去吃吃玩玩,晚上就在給客戶開發(fā)和調(diào)試一款手持儀器,順便把之前報(bào)考的MBA國(guó)際商務(wù)課老師布置的作業(yè)寫完了;這個(gè)國(guó)慶中秋可謂過(guò)得相當(dāng)充實(shí),一點(diǎn)都沒(méi)有浪費(fèi)!簡(jiǎn)直棒!下面這幅圖來(lái)自國(guó)慶中秋當(dāng)前,顯示8小時(shí),但是大部分朋友都開了16個(gè)小時(shí)以上,國(guó)慶中秋在高速上度過(guò)。

回到正題,客戶委托我開發(fā)的這款手持儀器屏幕采用的是和小熊派一樣的240*240分辨率的TFT顯示屏,鑒于職業(yè)道德操守與雙方協(xié)定的保密制度,這里我就不說(shuō)具體是什么東西了,但是技術(shù)其實(shí)都是通用的,我們直接用小熊派來(lái)模擬這個(gè)過(guò)程就行了。

LCD屏驅(qū)動(dòng)也是現(xiàn)成的,這里我直接搬了世偉兄(公眾號(hào)mculover666)的代碼,關(guān)于怎么編寫ST7789的驅(qū)動(dòng),世偉兄在之前的一篇文章里也寫得很詳細(xì),包括怎么配置STM32CubeMX,移植他的代碼的流程等等全套保姆式服務(wù),不得不佩服啊哈哈,鏈接如下:

STM32Cube-17 | 使用硬件SPI驅(qū)動(dòng)TFT-LCD(ST7789)

這里注意到,世偉兄沒(méi)有在這個(gè)驅(qū)動(dòng)里實(shí)現(xiàn)中文字模的顯示,客戶的儀器上面是要有中文顯示的,于是根據(jù)客戶的要求,我移植了之前開發(fā)積累下來(lái)的顯示中文字模的代碼:

void?LCD_ShowChinese(uint16_t?x,uint16_t?y,uint8_t?*s,uint16_t?fc,uint16_t?bc,uint8_t?sizey,uint8_t?mode);

這個(gè)函數(shù)用于顯示漢字串,原型如下:

/**********************************************************/
//顯示漢字
/******************************************************************************
??????函數(shù)說(shuō)明:顯示漢字串
??????入口數(shù)據(jù):x,y顯示坐標(biāo)
????????????????*s?要顯示的漢字串
????????????????fc?字的顏色
????????????????bc?字的背景色
????????????????sizey?字號(hào)?可選?16?24?32
????????????????mode:??0非疊加模式??1疊加模式
??????返回值:??無(wú)
******************************************************************************/
void?LCD_ShowChinese(uint16_t?x,uint16_t?y,uint8_t?*s,uint16_t?fc,uint16_t?bc,uint8_t?sizey,uint8_t?mode)
{
?while(*s!=0)
?{
??if(sizey==12)?LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
??else?if(sizey==16)?LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
??else?if(sizey==24)?LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
??else?if(sizey==32)?LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
??else?if(sizey==48)?LCD_ShowChinese48x48(x,y,s,fc,bc,sizey,mode);
??else?if(sizey==64)?LCD_ShowChinese64x64(x,y,s,fc,bc,sizey,mode);
??else?return;
??s+=2;
??x+=sizey;
?}
}

這樣,通過(guò)傳入字號(hào)參數(shù),我們可以靈活根據(jù)項(xiàng)目需求配置顯示不同字號(hào)的中文字體,這里我配置了12、16、24、32、48、64規(guī)格的字體,以顯示單個(gè)12*12字號(hào)為例,詳細(xì)函數(shù)實(shí)現(xiàn)如下:

/******************************************************************************
??????函數(shù)說(shuō)明:顯示單個(gè)12x12漢字
??????入口數(shù)據(jù):x,y顯示坐標(biāo)
????????????????*s?要顯示的漢字
????????????????fc?字的顏色
????????????????bc?字的背景色
????????????????sizey?字號(hào)
????????????????mode:??0非疊加模式??1疊加模式
??????返回值:??無(wú)
******************************************************************************/
void?LCD_ShowChinese12x12(uint16_t?x,uint16_t?y,uint8_t?*s,uint16_t?fc,uint16_t?bc,uint8_t?sizey,uint8_t?mode)
{
?uint8_t?i,j,m=0;
?uint16_t?k;
?uint16_t?HZnum;//漢字?jǐn)?shù)目
?uint16_t?TypefaceNum;//一個(gè)字符所占字節(jié)大小
?uint16_t?x0=x;
?TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
??????????????????????????
?HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);?//統(tǒng)計(jì)漢字?jǐn)?shù)目
?for(k=0;k?{
??if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
??{??
???LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
???for(i=0;i???{
????for(j=0;j<8;j++)
????{?
?????if(!mode)//非疊加方式
?????{
??????if(tfont12[k].Msk[i]&(0x01<fc);
??????else?LCD_Write_Data(bc);
??????m++;
??????if(m%sizey==0)
??????{
???????m=0;
???????break;
??????}
?????}
?????else//疊加方式
?????{
??????if(tfont12[k].Msk[i]&(0x01<fc);//畫一個(gè)點(diǎn)
??????x++;
??????if((x-x0)==sizey)
??????{
???????x=x0;
???????y++;
???????break;
??????}
?????}
????}
???}
??}???????
??continue;??//查找到對(duì)應(yīng)點(diǎn)陣字庫(kù)立即退出,防止多個(gè)漢字重復(fù)取模帶來(lái)影響
?}
}?

這個(gè)函數(shù)其實(shí)就是從軟件生成的字模表里將對(duì)應(yīng)漢字的字庫(kù)找出來(lái),所謂的字模表是由一個(gè)定義好的結(jié)構(gòu)體組成,結(jié)構(gòu)體中有兩個(gè)分量,第一個(gè)是要顯示的漢字,第二個(gè)是該漢字的字庫(kù),該函數(shù)就是將對(duì)應(yīng)漢字的字庫(kù)數(shù)據(jù)一個(gè)字節(jié)一個(gè)字節(jié)取出來(lái)然后發(fā)送到LCD顯示屏上實(shí)現(xiàn)刷屏,由于加上了顏色分量,所以我們看到直觀的就是以某個(gè)顏色分量體現(xiàn)的字體顯示,12*12的字模表的數(shù)據(jù)結(jié)構(gòu)定義如下:

typedef?struct?
{
?unsigned char Index[2];?//漢字內(nèi)碼索引
?unsigned?char?Msk[24];??//?點(diǎn)陣碼數(shù)據(jù)
}typFNT_GB12;?

這個(gè)點(diǎn)陣碼數(shù)據(jù)又是怎么生成的呢?以生成黑體字為例,打開PCtoLCD2002軟件,設(shè)置字模生成參數(shù):

然后我們將生成的復(fù)制到字模表對(duì)應(yīng)的數(shù)組里就可以啦:

typedef?struct?
{
?unsigned?char?Index[2];?
?unsigned?char?Msk[24];
}typFNT_GB12;?

const?typFNT_GB12?tfont12[]={
//中(0)?景(1)?園(2)?電(3)?子(4)
"中",0x60,0x00,0x20,0x00,0x20,0x00,0xFE,0x07,0x22,0x04,0x22,0x04,0xFE,0x07,0x22,0x04,
0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,/*"中",0*/
?
"景",0xFC,0x03,0x04,0x02,0xFC,0x03,0xFC,0x03,0x20,0x00,0xFE,0x07,0xF8,0x03,0x04,0x02,
0xF8,0x01,0x58,0x03,0x66,0x04,0x00,0x00,/*"景",1*/
?
"園",0x00,0x00,0xFE,0x07,0xF2,0x05,0x02,0x04,0xFA,0x05,0x52,0x04,0x52,0x04,0x52,0x07,
0x8A,0x05,0x02,0x04,0xFE,0x07,0x00,0x00,/*"園",2*/

"電",0x20,0x00,0x20,0x00,0xFE,0x03,0x22,0x02,0x22,0x02,0xFE,0x03,0x22,0x02,0xFE,0x03,
0x22,0x00,0x20,0x04,0xE0,0x07,0x00,0x00,/*"電",3*/

"子",0x00,0x00,0xFC,0x03,0x80,0x01,0x60,0x00,0x20,0x00,0xFE,0x07,0x20,0x00,0x20,0x00,
0x20,0x00,0x20,0x00,0x30,0x00,0x00,0x00,/*"子",4*/
};

Msk中的24代表一個(gè)字對(duì)應(yīng)字庫(kù)需要占用24個(gè)字節(jié)的內(nèi)存,在main函數(shù)中編寫顯示字符串"中景園電子"的代碼,如下所示:

下載到小熊派開發(fā)板上,以下就是我們最后看到生成的效果,

這簡(jiǎn)直太小了,不刺激,于是照葫蘆畫瓢,依次編寫了16*16、24*24、32*32、48*48、64*64這些常用的中文字庫(kù),一起顯示看看效果如何,結(jié)果如下:

咦,怎么感覺(jué)前三個(gè)12*12、24*24、32*32這些都沒(méi)問(wèn)題,48*48、64*64顯示就亂了呢???What???(黑人問(wèn)號(hào)?)

仔細(xì)對(duì)比48*48、64*64兩個(gè)函數(shù),寫法和找字模的方法與前幾個(gè)都是一樣的,只是字模表做了更改,但原理都是一樣的啊!實(shí)在看不出問(wèn)題出在哪?于是請(qǐng)教了正念兄(微信公眾號(hào):嵌入式大雜燴)號(hào)主,正念兄也動(dòng)手做了下實(shí)驗(yàn),而他那邊顯示是對(duì)的,只是顯示的函數(shù)的編寫方法和我的不一樣,但是原理是一樣的。

經(jīng)過(guò)我們的討論結(jié)果,以及正念兄在他那邊隨便拿了一個(gè)TFT屏測(cè)試的結(jié)果后,我恍然大悟,可能是數(shù)據(jù)類型的問(wèn)題!到底是哪個(gè)數(shù)據(jù)類型導(dǎo)致顯示錯(cuò)亂了呢?我們來(lái)單獨(dú)看看顯示48*48中文的函數(shù):

/******************************************************************************
??????函數(shù)說(shuō)明:顯示單個(gè)48x48漢字
??????入口數(shù)據(jù):x,y顯示坐標(biāo)
????????????????*s?要顯示的漢字
????????????????fc?字的顏色
????????????????bc?字的背景色
????????????????sizey?字號(hào)
????????????????mode:??0非疊加模式??1疊加模式
??????返回值:??無(wú)
******************************************************************************/
void?LCD_ShowChinese48x48(uint16_t?x,uint16_t?y,uint8_t?*s,uint16_t?fc,uint16_t?bc,uint8_t?sizey,uint8_t?mode)
{
?uint8_t?i,j,m=0;
?uint16_t?k;
?uint16_t?HZnum;//漢字?jǐn)?shù)目
?uint16_t?TypefaceNum;//一個(gè)字符所占字節(jié)大小
?uint16_t?x0=x;
?TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
?printf("TypefaceNum:%d\n",TypefaceNum);
?HZnum=sizeof(tfont48)/sizeof(typFNT_GB48);?//統(tǒng)計(jì)漢字?jǐn)?shù)目
?for(k=0;k?{
??if?((tfont48[k].Index[0]==*(s))&&(tfont48[k].Index[1]==*(s+1)))
??{??
???LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
???for(i=0;i???{
????for(j=0;j<8;j++)
????{?
?????if(!mode)//非疊加方式
?????{
??????if(tfont48[k].Msk[i]&(0x01<fc);
??????else?LCD_Write_Data(bc);
??????m++;
??????if(m%sizey==0)
??????{
???????m=0;
???????break;
??????}
?????}
?????else//疊加方式
?????{
??????if(tfont48[k].Msk[i]&(0x01<fc);//畫一個(gè)點(diǎn)
??????x++;
??????if((x-x0)==sizey)
??????{
???????x=x0;
???????y++;
???????break;
??????}
?????}
????}
???}
??}???????
??continue;??//查找到對(duì)應(yīng)點(diǎn)陣字庫(kù)立即退出,防止多個(gè)漢字重復(fù)取模帶來(lái)影響
?}
}

經(jīng)過(guò)一段時(shí)間單步調(diào)試后,我開始懷疑i變量的數(shù)據(jù)類型(uint8_t)越界了,結(jié)果通過(guò)printf一打,還真的是這樣:

然后我把48*48以及64*64這兩個(gè)中文顯示函數(shù)里的uint8_t統(tǒng)一修改為uint16_t后,顯示正常了:

我相信有不少朋友也遇到過(guò)我遇到的這個(gè)坑,做嵌入式(指Linux端)的我們平常都是很豪邁的用int、short、long這樣的類型,然而MCU上由于資源緊張,沒(méi)辦法那么豪邁,于是定義合適的數(shù)據(jù)類型就顯得尤為重要了,不得不說(shuō),基礎(chǔ)還是很重要的,留一張表,再次碰到類似這樣的問(wèn)題希望能夠立馬在腦海中反應(yīng)過(guò)來(lái)。

本節(jié)代碼已同步到碼云的代碼倉(cāng)庫(kù)中:

獲取方法如下:

1、新建一個(gè)文件夾

2、使用git clone遠(yuǎn)程獲取小熊派所有案例代碼

我還將之前做的一些項(xiàng)目以及練習(xí)例程在近期內(nèi)全部上傳完畢,與大家一起分享交流:

公眾號(hào)粉絲福利時(shí)刻

這里我給大家申請(qǐng)到了福利,本公眾號(hào)讀者購(gòu)買小熊派開發(fā)板可享受9折優(yōu)惠,有需要購(gòu)買小熊派以及騰訊物聯(lián)網(wǎng)開發(fā)板的朋友,淘寶搜索即可,跟客服說(shuō)你是公眾號(hào):嵌入式云IOT技術(shù)圈?的粉絲,立享9折優(yōu)惠!

往期精彩

TencentOS tiny RTOS快速入門

移植uc/OS-III最新版到小熊派開發(fā)板(STM32L431)

TOS的AT模組框架

C/C++函數(shù)指針與指針函數(shù)

STM32硬核DIY機(jī)械鍵盤|藍(lán)牙USB雙模|燈控

覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉