基于stm32的TFTLCD屏圖片顯示
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "usmart.h"
- #include "malloc.h"
- #include "sdio_sdcard.h"
- #include "w25qxx.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "text.h"
- #include "piclib.h"
- #include "string.h"
- #include "math.h"
-
- //得到path路徑下,目標文件的總個數
- //path:路徑
- //返回值:總有效文件數
- u16 pic_get_tnum(u8 *path)
- {
- u8 res;
- u16 rval=0;
- DIR tdir; //臨時目錄
- FILINFO tfileinfo; //臨時文件信息
- u8 *fn;
- res=f_opendir(&tdir,(const TCHAR*)path); //打開目錄
- tfileinfo.lfsize=_MAX_LFN*2+1; //長文件名最大長度
- tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);//為長文件緩存區分配內存
- if(res==FR_OK&&tfileinfo.lfname!=NULL)
- {
- while(1)//查詢總的有效文件數
- {
- res=f_readdir(&tdir,&tfileinfo); //讀取目錄下的一個文件
- if(res!=FR_OK||tfileinfo.fname[0]==0)break; //錯誤了/到末尾了,退出
- fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
- res=f_typetell(fn);
- if((res&0XF0)==0X50)//取高四位,看看是不是圖片文件
- {
- rval++;//有效文件數增加1
- }
- }
- }
- return rval;
- }
- int main(void)
- {
- u8 res;
- DIR picdir; //圖片目錄
- FILINFO picfileinfo;//文件信息
- u8 *fn; //長文件名
- u8 *pname; //帶路徑的文件名
- u16 totpicnum; //圖片文件總數
- u16 curindex; //圖片當前索引
- u8 key; //鍵值
- u8 pause=0; //暫停標記
- u8 t;
- u16 temp;
- u16 *picindextbl; //圖片索引表
-
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為115200
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- W25QXX_Init(); //初始化W25Q128
- my_mem_init(SRAMIN); //初始化內部內存池
- exfuns_init(); //為fatfs相關變量申請內存
- 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);
- }
- Show_Str(30,50,200,16,"ELITE STM32F1開發板",16,0);
- Show_Str(30,70,200,16,"圖片顯示程序",16,0);
- Show_Str(30,90,200,16,"KEY0:NEXT KEY1:PREV",16,0);
- Show_Str(30,110,200,16,"KEY_UP:PAUSE",16,0);
- Show_Str(30,130,200,16,"正點原子@ALIENTEK",16,0);
- Show_Str(30,150,200,16,"2015年1月20日",16,0);
- 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"); //得到總有效文件數
- 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); //為長文件緩存區分配內存
- pname=mymalloc(SRAMIN,picfileinfo.lfsize); //為帶路徑的文件名分配內存
- picindextbl=mymalloc(SRAMIN,2*totpicnum); //申請2*totpicnum個字節的內存,用于存放圖片索引
- while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//內存分配出錯
- {
- Show_Str(30,170,240,16,"內存分配失敗!",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,170,240,16,"開始顯示...",16,0);
- delay_ms(1500);
- 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;
- while(1)
- {
- key=KEY_Scan(0); //掃描按鍵
- if(t>250)key=1; //模擬一次按下KEY0
- if((t%20)==0)LED0=!LED0;//LED0閃爍,提示程序正在運行.
- if(key==KEY1_PRES) //上一張
- {
- if(curindex)curindex--;
- else curindex=totpicnum-1;
- break;
- }else if(key==KEY0_PRES)//下一張
- {
- curindex++;
- if(curindex>=totpicnum)curindex=0;//到末尾的時候,自動從頭開始
- break;
- }else if(key==WKUP_PRES)
- {
- pause=!pause;
- LED1=!pause; //暫停的時候LED1亮.
- }
- if(pause==0)t++;
- delay_ms(10);
- }
- res=0;
- }
- myfree(SRAMIN,picfileinfo.lfname); //釋放內存
- myfree(SRAMIN,pname); //釋放內存
- myfree(SRAMIN,picindextbl); //釋放內存
- }
復制代碼
下載:
實驗38 圖片顯示實驗.rar
(1.65 MB, 下載次數: 280)
2018-10-23 17:39 上傳
點擊文件名下載附件
|