找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3130|回复: 2
打印 上一主题 下一主题
收起左侧

原创基于STM32F407数码相框源码与资料

[复制链接]
跳转到指定楼层
楼主
本数码相框例程用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, 下载次数: 58)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1027750 发表于 2022-5-21 00:53 来自手机 | 只看该作者
我想问一下,芯片连接超时该怎么解决
回复

使用道具 举报

板凳
ID:880136 发表于 2022-5-22 20:53 | 只看该作者
这些代码不是正点原子的吗?,怎么变成原创了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表