今天來設計一個項目:嵌入式智能娛樂影音系統 軟體:vmwave虛擬機 ubuntu18.0系統 SecureCRT串口終端 tftpd64 硬體:基於ARM Cortex-A53晶元的6818開發板,4寸電容屏 rs232串口線 usb轉串口線 電源線 網線 一、搭建項目框架 建一個文件夾proje ...
今天來設計一個項目:嵌入式智能娛樂影音系統
軟體:vmwave虛擬機 ubuntu18.0系統 SecureCRT串口終端 tftpd64
硬體:基於ARM Cortex-A53晶元的6818開發板,4寸電容屏 rs232串口線 usb轉串口線 電源線 網線
一、搭建項目框架
建一個文件夾project,存放多個.c文件負責各個模塊功能的實現,創建一個.h文件,把所有用到的庫函數放進去。創建一個project_set.c文件,存放lcd、觸摸屏等各個模塊都需用到的函數
本系統包含5個功能模塊:游戲、音樂播放器、電子相冊、語音識別、視頻播放器
二、設計界面
用PS或畫圖工具設計界面如圖所示
解析度800*480,beijing.bmpbmp
6個圖標功能分別為:關機、音樂播放器、視頻播放器、游戲、電子相冊 、語音識別
三、代碼設計
設計思路:主函數寫一個while迴圈判斷觸摸按下的位置,根據按下的圖標執行對應的功能函數
3.1 每個功能模塊都要用到觸摸和lcd顯示函數,將初始化函數寫在project_set.c中
1、圖片顯示函數
2、LCD、觸摸屏初始化函數
3、關機函數
4、讀取觸摸屏坐標函數
3.2 申請一個結構體,存放各種參數,放在.h文件,同時在每個函數聲明此結構體是外部變數
typedef struct Pro_Inf
{
int lcd;//lcd文件描述符
int * mmap_star; //lcd 記憶體映射描述符
int ts;//觸摸屏文件描述符
int x;//觸摸點x坐標
int y;觸摸點y坐標
struct input_event touch;//觸摸按壓值
}P_I;
3.3 主函數
1、初始化lcd、觸摸屏
2、迴圈判斷屏幕是否按下,根據按下位置執行對應函數
3、結束函數
win10系統打開畫圖,打開主界面,勾上標尺和網格線,根據圖標第一個像素點和最後一個像素點的x、y軸坐標寫進觸摸位置判斷語句
(圖片像素大小根據電容屏解析度選擇,4寸800*480,7寸1024*600,或者800*480的圖片放在7寸電容屏上可以比例轉換,x=touch.value*800/1024;y=touch.value*480/600;)
int main()
{
Init_Pro();
/*觸摸屏按鈕控制*/
while(1)
{
Get_Touch_Inf();
if(xxx.touch.type == EV_KEY && xxx.touch.code == BTN_TOUCH && xxx.touch.value == 0)
{
if(xxx.x>644 && xxx.x<720 && xxx.y>300 && xxx.y<400) Picture_Player();//圖片
if(xxx.x>43 && xxx.x<121 && xxx.y>300 && xxx.y<400) Music_Player();//音悅台
if(xxx.x>460 && xxx.x<550 && xxx.y>300 && xxx.y<400) Game();//游戲
if(xxx.x>233 && xxx.x<323 && xxx.y>300 && xxx.y<400) Video_Player(); //影音
if (xxx.x > 330 && xxx.x < 457 && xxx.y>150 && xxx.y < 300) Sound(); //語音
if(xxx.x>46 && xxx.x<120 && xxx.y>10 && xxx.y<96) break;
}
}
End_Pro();
return 0;
}
3.4 模塊功能函數
1、功能圖標界面顯示
音樂播放器
實現按下圖標跳到相應的界面:按下音悅台圖標後,主函數執行Music_Player()函數用Display_Pic("/IOT/my/mp3.bmp", 0, 0);顯示播放器的主界面圖
while(1)迴圈判斷觸摸狀態
按下退出圖標後 break 跳出迴圈,return 0 返回主函數
#include "project.h"
extern P_I xxx;
int Music_Player()
{
printf("啟動音樂播放器!\n");
int t = 1;
while (t)
{
Display_Pic("/IOT/my/mp3.bmp", 0, 0);
Get_Touch_Inf();
if (xxx.touch.type == EV_KEY && xxx.touch.code == BTN_TOUCH && xxx.touch.value == 0)
{
if (xxx.x > 674 && xxx.x < 727 && xxx.y>42 && xxx.y < 91)//退出按鈕
{
Display_Pic("/IOT/my/beijing.bmp", 0, 0);
t = 0;
}
if (xxx.x > 326 && xxx.x < 461 && xxx.y>337 && xxx.y < 461)//播放按鈕
{
printf("播放音樂\n");
}
if (xxx.x > 621 && xxx.x < 693 && xxx.y>371 && xxx.y < 427)//暫停按鈕
{
printf("暫停音樂\n");
}
if (xxx.x > 326 && xxx.x < 461 && xxx.y>337 && xxx.y < 461)//繼續按鈕
{
printf("繼續播放音樂\n");
}
if (xxx.x > 110 && xxx.x < 186 && xxx.y>365 && xxx.y < 429)//停止按鈕
{
printf("關閉音樂\n");
}
}
}
return 0;
}
視頻播放器界面,游戲界面,電子相冊界面,語音識別仿照音樂播放器
2、功能代碼實現
以電子相冊、語音識別為例
電子相冊:
選幾張圖片,將位置放在指針數組裡
char*pic[5]={ "/IOT/my/b.bmp","/IOT/my/k.bmp","/IOT/my/l.bmp","/IOT/my/lq.bmp","/IOT/my/pathname.bmp" };
設計3個圖標,用於左翻,右翻和退出
#include "project.h"
extern P_I xxx;
char *pic[5] = { "/IOT/my/b.bmp","/IOT/my/k.bmp","/IOT/my/l.bmp","/IOT/my/lq.bmp","/IOT/my/pathname.bmp" };
int Picture_Player()
{
printf("啟動電子相冊!\n");
Display_Pic("/IOT/my/youxi.bmp", 0, 0);
int t = 1;
int i = 0;
while (t)
{
Display_Pic("/IOT/my/jiantou.bmp", 0, 182);
Display_Pic("/IOT/my/jiantou1.bmp", 699, 182);
Display_Pic("/IOT/my/tuichu.bmp", 719, 0);
Get_Touch_Inf();
if (xxx.touch.value == 0) continue;
if (xxx.touch.type == EV_KEY && xxx.touch.code == BTN_TOUCH && xxx.touch.value > 0)
{
if (xxx.x > 719 && xxx.y>0 && xxx.y < 80)
{
Display_Pic("/IOT/my/beijing.bmp", 0, 0);
t = 0;
}
if (xxx.x > 0 && xxx.x < 100 && xxx.y>180 && xxx.y < 260)
{
i++;
if (i >=4) i = 4;
Display_Pic(pic[i], 0, 0);
}
if (xxx.x > 699 && xxx.y > 180 && xxx.y < 260)
{
i--;
if (i <= 0) i = 0;
Display_Pic(pic[i], 0, 0);
}
}
}
return 0;
}
語音識別:
設計三個麥克風圖標
按下圖標後,創建一個線程,迴圈顯示3個麥克風圖標
按鍵離開後,返回主界面
#include "project.h"
extern P_I xxx;
void * Pic_Go(void * arg)
{
while (1)
{
usleep(50000);
Display_Pic("/IOT/my/1.bmp", 350, 178);
usleep(50000);
Display_Pic("/IOT/my/2.bmp", 350, 178);
usleep(50000);
Display_Pic("/IOT/my/3.bmp", 350, 178);
}
return NULL;
}
int Sound()
{
printf("啟動語音識別!\n");
pthread_t go_id;
while (1)
{
Get_Touch_Inf();
if (xxx.touch.type == EV_KEY && xxx.touch.code == BTN_TOUCH && xxx.touch.value == 0)//
{
pthread_cancel(go_id);
Display_Pic("/IOT/my/beijing.bmp", 0, 0);
break;
}
if (xxx.touch.type == EV_KEY && xxx.touch.code == BTN_TOUCH && xxx.touch.value > 0)
{
pthread_create(&go_id, NULL, Pic_Go, NULL);
mask = 1;
}
}
return 0;
}
音樂播放器、視頻播放器和游戲留到下一階段,有興趣可以關註我,定期更新乾貨