當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]上篇分享了事件驅(qū)動(dòng)型的菜單框架,也實(shí)現(xiàn)了一個(gè)基本的小項(xiàng)目。但是怎么看怎么都覺得界面不爽,單純顯示文字的方式實(shí)在是太單調(diào)了,如果想要顯示顏色豐富的圖片,MCU資源受限又很難直接在程序中直接定義圖片大數(shù)組。于是,這次選擇在SD卡中放圖片,通過Fatfs去讀取SD卡中的圖片來進(jìn)行顯示……

上次我們分享了事件驅(qū)動(dòng)型的菜單框架,也實(shí)現(xiàn)了一個(gè)基本的小項(xiàng)目,如下:

基于事件型表驅(qū)動(dòng)法菜單框架之小熊派簡易氣體探測(cè)器實(shí)戰(zhàn)項(xiàng)目開發(fā)(上)

但是怎么看怎么都覺得界面不爽,單純顯示文字的方式實(shí)在是太單調(diào)了,如果想要顯示顏色豐富的圖片,MCU資源受限又很難直接在程序中直接定義圖片大數(shù)組。

于是,我選擇在SD卡中放圖片,通過Fatfs去讀取SD卡中的圖片來進(jìn)行顯示,圖片都是我自己在阿里圖庫上找的開源素材,然后用PS自己P的:

廢話不多說,來看看實(shí)際效果吧!演示視頻如下:

這樣看起來效果就舒服一點(diǎn)啦。

1、新增功能項(xiàng)

本節(jié)分享的內(nèi)容相較于上篇文章修改/增加了如下功能:

底層配置

  • 修改LCD寄存器,提升LCD刷屏速度
  • 增加Fatfs、SD卡讀寫功能

應(yīng)用邏輯

  • 增加模擬長按開機(jī)識(shí)別
  • 增加開機(jī)LOGO以及其它UI的顯示
  • 增加菜單(閾值設(shè)置、設(shè)置、調(diào)試模式、儀器信息)

1.1、關(guān)于底層配置

1.1.1、提升屏刷新速度

由于要刷圖,所以只能想辦法盡量提升屏的刷新速度,于是在LCD手冊(cè)里有這么一個(gè)寄存器,可以提升屏的刷新速度:

在LCD驅(qū)動(dòng)初始化代碼里,這個(gè)寄存器默認(rèn)配置的是60Hz,也就是0x0F這個(gè)值

/*?Frame?Rate?Control?in?Normal?Mode?*/
LCD_Write_Cmd(0xC6);
//?LCD_Write_Data(0x0F);?//60HZ
LCD_Write_Data(0x01);??//111Hz?提升屏的刷新速度

本來設(shè)置為0x00為119Hz,但是設(shè)置完LCD就黑屏了,改為0x01就不會(huì),目前沒找到具體原因,將就著用吧。

1.1.2、增加Fatfs、SD卡讀寫功能


之前也分享了配置方法,詳情可以看以下文章:

基于小熊派SD卡+Fatfs+移植開源iniparse解析庫并使用

1.2、關(guān)于應(yīng)用邏輯

1.2.1、增加模擬長按開機(jī)識(shí)別

由于開機(jī)前需要加載整幅圖片,會(huì)存在刷新慢的問題,我們可以先關(guān)掉LCD背光,然后等圖刷完了再開背光,這樣看到就是一張完整的圖,這個(gè)過程可以用長按一個(gè)按鍵開機(jī)的方式來代替,代碼實(shí)現(xiàn)如下:

void?PowerOn(void)
{
????static?uint32_t?power_press_count?=?0;
????HAL_Delay(500);
????while(1)
????{
????????if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,?KEY1_Pin)?==?0)
????????{
????????????power_press_count?++;
??????
????????????if(power_press_count?>=?100)
????????????{
????????????????//開指示燈
????????????????HAL_GPIO_WritePin(GPIOC,?LED_Pin,?GPIO_PIN_SET);
????????????????while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,?KEY1_Pin)?==?0)
????????????????{
????????????????????HAL_Delay(10);
????????????????}
????????????????break;
????????????}
????????}
????????else
????????{
????????????power_press_count?=?0;
????????}

????????HAL_Delay(10);
????}
}

然后在顯示開機(jī)LOGO前調(diào)用即可,顯示開機(jī)LOGO調(diào)用完畢后打開背光顯示。

1.2.2、增加開機(jī)LOGO以及其它UI的顯示

圖片資源采用的是24位bmp圖,這些圖片都存放在SD卡根目錄下的LOGO文件夾的子文件夾中:

(1)開機(jī)LOGO


(2)主頁面UI

(3)檢測(cè)頁面動(dòng)畫LOGO

顯示接口移植了硬石科技提供的bsp_bmp.c,他們用的是320*480的RGB屏,小熊派用的是240*240的屏,根據(jù)現(xiàn)有的屏我做了一些修改:

uint8_t?pColorData[960];?????/*?一行真彩色數(shù)據(jù)緩存?320?*?3?=?960?*/
//uint8_t?pColorData[720];?????/*?一行真彩色數(shù)據(jù)緩存?240?*?3?=?720?*/

顯示bmp函數(shù):

/**
??*?函數(shù)功能:?顯示bmp圖片,?24位真彩色
??*?輸入?yún)?shù):?x:顯示圖片左上角x軸坐標(biāo)
??*???????????y:顯示圖片左上角y軸坐標(biāo)
??*???????????pic_name:顯示圖片文件名稱
??*?返?回?值:?無
??*?說????明:圖片寬度和高度根據(jù)圖片大小而定
??*/
void?Lcd_show_bmp(uint16_t?x,?uint16_t?y,char?*pic_name)
{
?uint16_t?i,?j,?k;
?int?width,?height,?l_width;
??
?BMP_FileHeader?FileHeader;
?BMP_InfoHeader?InfoHeader;
??
/*-------------------------------------------------------------------------------------------------------*/
?f_res=f_open(&file,pic_name,?FA_OPEN_EXISTING|FA_READ);?
?if(f_res?==?FR_OK)
?{
??BMP_DEBUG_PRINTF("Open?file?success\r\n");

??/*?讀取文件頭信息??兩個(gè)字節(jié)*/?????????
??f_res=f_read(&file,&FileHeader,sizeof(BMP_FileHeader),&f_num);?????
????
??/*?判斷是不是bmp文件?"BM"*/
??if(FileHeader.bfType!=0x4d42)
??{
???BMP_DEBUG_PRINTF("file?is?not?.bmp?file!\r\n");
???return;
??}
??else
??{
???BMP_DEBUG_PRINTF("Ok?this?is?.bmp?file\r\n");?
??}
??/*?讀取BMP文件頭信息*/??????
??showBmpHeader(&FileHeader);
???
??/*?讀取位圖信息頭信息?*/
??f_res=f_read(&file,&InfoHeader,sizeof(BMP_InfoHeader),&f_num);??????
??showBmpInforHeader(&InfoHeader);
?}????
?else
?{
??BMP_DEBUG_PRINTF("file?open?fail!\r\n");
??return;
?}??
/*-------------------------------------------------------------------------------------------------------*/
?width??=?InfoHeader.biWidth;
?height?=?InfoHeader.biHeight;?
??
?/*?計(jì)算位圖的實(shí)際寬度并確保它為32的倍數(shù)?*/
?l_width?=?WIDTHBYTES(width*?InfoHeader.biBitCount);
??
?if((l_width>960)||(InfoHeader.biBitCount!=24))
?{
??BMP_DEBUG_PRINTF("\n?SORRY,?PIC?IS?TOO?BIG?(X<=320?and?bit!=16)\n");
??return;
??}
??f_lseek(&file,FileHeader.bfOffBits);
???
??if(InfoHeader.biBitCount?==?24)
??{
????for(i=0;i????{
??????/*?開一個(gè)圖片大小的窗口*/
??????LCD_OpenWindow(x,?y+height-i-1,?width,?1);
???LCD_Write_Cmd(0x2C);
??????/*?讀取一行bmp的數(shù)據(jù)到數(shù)組pColorData里面?*/
??????f_read(&file,pColorData,l_width,&f_num);??????
??????for(j=0;j??????{????????
????????k?=?j*3;??????????????????//一行中第K個(gè)像素的起點(diǎn)????????
????????//LCD_WRITE_DATA(RGB24TORGB16(pColorData[k+2],pColorData[k+1],pColorData[k]));?//寫入LCD-GRAM
????????//這里調(diào)用的是寫一次寫兩個(gè)字節(jié)的函數(shù)
????????LCD_Write_2Byte(RGB24TORGB16(pColorData[k+2],pColorData[k+1],pColorData[k]));
??????}
????}
??}
?f_close(&file);????
}

修改完后在如果需要圖片顯示則調(diào)用如下接口:

#define?START_LOGO?"0:/UI/start_logo/start_logo.bmp"

//最開始的時(shí)候調(diào)用掛載,只掛載一次就好了
//在串行FLASH掛載文件系統(tǒng),文件系統(tǒng)掛載時(shí)會(huì)對(duì)串行FLASH初始化
f_res?=?f_mount(&fs,?(TCHAR?const*)SDPath,?1);
if(f_res?==?FR_OK)
??printf("》SD卡文件系統(tǒng)掛載成功\n");


//以后只需要調(diào)用顯示即可
Lcd_show_bmp(0,0,START_LOGO);

注意:圖片的路徑是SD卡下存放的路徑,一定要選對(duì)。

1.2.2、增加菜單(閾值設(shè)置、設(shè)置、調(diào)試模式、儀器信息)

在主頁面長按右鍵進(jìn)入菜單:

此時(shí)按左鍵可以切換選項(xiàng),短按右鍵進(jìn)入某一菜單項(xiàng),長按右鍵退出回到主頁面,這里只實(shí)現(xiàn)了儀器信息,其它項(xiàng)目還沒有實(shí)現(xiàn),但要添加也非常簡單,期待后期分享。

菜單的實(shí)現(xiàn)也很簡單,菜單項(xiàng)切換的邏輯和主頁面的切換邏輯是一樣的:

其余功能:后續(xù)還可以做報(bào)警記錄存儲(chǔ)、數(shù)據(jù)上傳到OneNet或者華為云等平臺(tái)、參數(shù)設(shè)置等等,總之這個(gè)項(xiàng)目可拓展性非常強(qiáng),這些功能將在本項(xiàng)目開發(fā)的下一章節(jié)持續(xù)進(jìn)行拓展并分享,歡迎及時(shí)關(guān)注我的碼云倉庫與微信公眾號(hào)文章更新。

本節(jié)代碼已同步到碼云的代碼倉庫中:

獲取方法如下:

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

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

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

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

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

往期精彩

STM32系統(tǒng)bootloader應(yīng)用

【C進(jìn)階】拿著"sizeof這些用法和坑"去吹牛吧!

基于事件型表驅(qū)動(dòng)法菜單框架之小熊派簡易氣體探測(cè)器實(shí)戰(zhàn)項(xiàng)目開發(fā)(上)

上海出差之行--領(lǐng)略外灘美景、RT-Thread總部之旅、嵌友面基、返程記錄

覺得本次分享的文章對(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)立場,如有問題,請(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)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉