本數(shù)碼相框例程用STM32F407的圖像實驗為模板,調(diào)用TUTCH讀點函數(shù),將屏幕分成3個區(qū)域,左邊的做上一張切換,右的做下一張切換.中間的做暫停,自動播放切換按鈕.
本實驗將實現(xiàn)如下功能:開機的時候先檢測字庫,然后檢測SD卡是否存在,如果SD卡存在,則開始查找SD卡根目錄下的PICTURE文件夾,如果找到則顯示該文件夾下面的圖片文件(支持bmp、jpg、jpeg或gif格式),循環(huán)顯示,通過按KEY0和KEY2可以快速瀏覽下一張和上一張,KEY_UP按鍵用于暫停/繼續(xù)播放,DS1用于指示當前是否處于暫停狀態(tài)。如果未找到PICTURE文件夾/任何圖片文件,則提示錯誤。同樣我們也是用DS0來指示程序正在運行。
注意:
1,該實驗須自備SD卡一個,并在SD卡根目錄新建:PICTURE文件夾,并放入一些圖片(BMP/JPG/JPEG/GIF)。
2,如果有些jpg/jpeg格式不能顯示的話,用XP自帶的畫圖工具打開,再保存一下,一般就可以顯示了。
3,JPEG/JPG/BMP圖片,程序會根據(jù)LCD分辨率自動縮放,以適應LCD,而GIF則必須小于屏幕分辨率才可以顯示。
int main(void)
{
u8 res;
DIR picdir; //圖片目錄
FILINFO picfileinfo;//文件信息
u8 *fn; //長文件名
u8 *pname; //帶路徑的文件名
u16 totpicnum; //圖片文件總數(shù)
u16 curindex; //圖片當前索引
u8 key; //鍵值
u8 Touch_key;
u8 pause=0; //暫停標記
u16 t;
u16 temp;
u16 *picindextbl; //圖片索引表
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
delay_init(168); //初始化延時函數(shù)
uart_init(115200); //初始化串口波特率為115200
LED_Init(); //初始化LED
usmart_dev.init(84); //初始化USMART
LCD_Init(); //LCD初始化
tp_dev.init(); //初始化觸摸屏
KEY_Init(); //按鍵初始化
W25QXX_Init(); //初始化W25Q128
my_mem_init(SRAMIN); //初始化內(nèi)部內(nèi)存池
my_mem_init(SRAMCCM); //初始化CCM內(nèi)存池
exfuns_init(); //為fatfs相關(guān)變量申請內(nèi)存
f_mount(fs[0],"0:",1); //掛載SD卡
f_mount(fs[1],"1:",1); //掛載FLASH.
POINT_COLOR=RED;
while(font_init()) //檢查字庫
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除顯示
delay_ms(200);
}
// TP_Scan(0);
// Show_Str(30,50,200,16,"初始化成功",16,0);
// while(1){
// Touch_key=Touch_Scan();
// if(Touch_key==1){
// LCD_Fill(30,50,240,66,WHITE);//清除顯示
// Show_Str(30,50,200,16,"屏幕上方",16,0);
// }
// if(Touch_key==2){
// LCD_Fill(30,50,240,66,WHITE);//清除顯示
// Show_Str(30,100,200,16,"屏幕下方",16,0);
// }
while(1){
key=KEY_Scan(0); //掃描按鍵
Touch_key=Touch_Scan();//觸屏按鍵
Show_Str(30,50,200,16,"小組成員:",16,0);
Show_Str(30+15,50+30,200,16,"你好,你好,你好",16,0);
Show_Str(30,50+200,200,16,"點擊按鍵或屏幕進入圖片顯示",12,0);
if((key==KEY1_PRES)||Touch_key==1||(key==KEY0_PRES)||Touch_key==2){
LCD_Fill(0,0,320,480,WHITE);
break;
}
}
while(f_opendir(&picdir,"0:/PICTURE"))//打開圖片文件夾
{
Show_Str(30,170,240,16,"PICTURE文件夾錯誤!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除顯示
delay_ms(200);
}
totpicnum=pic_get_tnum("0:/PICTURE"); //得到總有效文件數(shù)
while(totpicnum==NULL)//圖片文件為0
{
Show_Str(30,170,240,16,"沒有圖片文件!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除顯示
delay_ms(200);
}
picfileinfo.lfsize=_MAX_LFN*2+1; //長文件名最大長度
picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize); //為長文件緩存區(qū)分配內(nèi)存
pname=mymalloc(SRAMIN,picfileinfo.lfsize); //為帶路徑的文件名分配內(nèi)存
picindextbl=mymalloc(SRAMIN,2*totpicnum); //申請2*totpicnum個字節(jié)的內(nèi)存,用于存放圖片索引
while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//內(nèi)存分配出錯
{
Show_Str(30,170,240,16,"內(nèi)存分配失敗!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除顯示
delay_ms(200);
}
//記錄索引
res=f_opendir(&picdir,"0:/PICTURE"); //打開目錄
if(res==FR_OK)
{
curindex=0;//當前索引為0
while(1)//全部查詢一遍
{
temp=picdir.index; //記錄當前index
res=f_readdir(&picdir,&picfileinfo); //讀取目錄下的一個文件
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //錯誤了/到末尾了,退出
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//取高四位,看看是不是圖片文件
{
picindextbl[curindex]=temp;//記錄索引
curindex++;
}
}
}
Show_Str(30,80,240,16,"開始顯示...",16,0);
delay_ms(1000);
piclib_init(); //初始化畫圖
curindex=0; //從0開始顯示
res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); //打開目錄
while(res==FR_OK)//打開成功
{
dir_sdi(&picdir,picindextbl[curindex]); //改變當前目錄索引
res=f_readdir(&picdir,&picfileinfo); //讀取目錄下的一個文件
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //錯誤了/到末尾了,退出
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
strcpy((char*)pname,"0:/PICTURE/"); //復制路徑(目錄)
strcat((char*)pname,(const char*)fn); //將文件名接在后面
LCD_Clear(BLACK);
ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//顯示圖片
// Show_Str(2,2,240,16,pname,16,1); //顯示圖片名字
t=0;
autoplay=0;
while(1)
{
Touch_key=Touch_Scan();//觸屏按鍵
key=KEY_Scan(0); //掃描按鍵
// if(t>250)key=1; //模擬一次按下KEY0
if(Touch_key==2){play_flag=!play_flag;
if(play_flag)
// Show_Str(30,170+50,240,16,"播放",16,0);
Show_Str(120,10,240,16,"播放",16,0);
// else Show_Str(30, +50,240,16,"暫停",16,0);
else Show_Str(120,10,240,16,"暫停",16,0);
}
if((t>250)&&play_flag==1){ autoplay=1; //模擬一次按下KEY0
LCD_ShowxNum(1,1,play_flag,8,16,0);
}
if((t%20)==0)LED0=!LED0;//LED0閃爍,提示程序正在運行.
if((key==KEY1_PRES)||Touch_key==1) //上一張
{
// play_flag=0;
if(curindex)curindex--;
else curindex=totpicnum-1;
break;
}else if((key==KEY0_PRES)||(Touch_key==3)||(autoplay==1))//下一張
{
curindex++;
if(curindex>=totpicnum)curindex=0;//到末尾的時候,自動從頭開始
t=0;
break;
}else if(key==WKUP_PRES||Touch_key==2)
{
pause=!pause;
LED1=!pause; //暫停的時候LED1亮.
}
// if(pause==0)t++;
if((t%20)==0)LED0=!LED0;//LED0閃爍,提示程序正在運行.
{t++;
delay_ms(20);
}
}
res=0;
}
myfree(SRAMIN,picfileinfo.lfname); //釋放內(nèi)存
myfree(SRAMIN,pname); //釋放內(nèi)存
myfree(SRAMIN,picindextbl); //釋放內(nèi)存
}
全部資料51hei下載地址:
智能相框.rar
(9.02 MB, 下載次數(shù): 59)
2018-12-8 01:05 上傳
點擊文件名下載附件
|