本数码相框例程用STM32F407的图像实验为模板,调用TUTCH读点函数,将屏幕分成3个区域,左边的做上一张切换,右的做下一张切换.中间的做暂停,自动播放切换按钮.
本实验将实现如下功能:开机的时候先检测字库,然后检测SD卡是否存在,如果SD卡存在,则开始查找SD卡根目录下的PICTURE文件夹,如果找到则显示该文件夹下面的图片文件(支持bmp、jpg、jpeg或gif格式),循环显示,通过按KEY0和KEY2可以快速浏览下一张和上一张,KEY_UP按键用于暂停/继续播放,DS1用于指示当前是否处于暂停状态。如果未找到PICTURE文件夹/任何图片文件,则提示错误。同样我们也是用DS0来指示程序正在运行。
注意:
1,该实验须自备SD卡一个,并在SD卡根目录新建:PICTURE文件夹,并放入一些图片(BMP/JPG/JPEG/GIF)。
2,如果有些jpg/jpeg格式不能显示的话,用XP自带的画图工具打开,再保存一下,一般就可以显示了。
3,JPEG/JPG/BMP图片,程序会根据LCD分辨率自动缩放,以适应LCD,而GIF则必须小于屏幕分辨率才可以显示。
int main(void)
{
u8 res;
DIR picdir; //图片目录
FILINFO picfileinfo;//文件信息
u8 *fn; //长文件名
u8 *pname; //带路径的文件名
u16 totpicnum; //图片文件总数
u16 curindex; //图片当前索引
u8 key; //键值
u8 Touch_key;
u8 pause=0; //暂停标记
u16 t;
u16 temp;
u16 *picindextbl; //图片索引表
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
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); //初始化内部内存池
my_mem_init(SRAMCCM); //初始化CCM内存池
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);
}
// 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"); //得到总有效文件数
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,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); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,picindextbl); //释放内存
}
全部资料51hei下载地址:
智能相框.rar
(9.02 MB, 下载次数: 59)
|