打印
[菜农助学交流]

菜鸟学习M0第二十贴——SD+FATFS+LCM

[复制链接]
7799|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lixiaoxu2meng 于 2011-11-26 15:07 编辑

自从上次上传笔记到现在已经已经有两个多月了,承蒙大家的关照也拿了不少奖励了,心里越发觉得比较惭愧,前一段本想抽出点时间弄弄SD卡,但是每次都是初始化不成功,就卡在这里了,真的打击我的信心啊,在网上也问网友了,但是我的就是初始化不成功,程序换了不下六 七个版本,就是不行,前天本打算抽出了多点时间搞,我把卡托换了(之前也检查过),又换了张4G的SD卡,弄上,烧写程序,奇迹出现了,终于初始化通过了,连续有烧写了以前几个版本的程序,都好用,心里既高兴又郁闷啊,不管怎地终于出来了
   介绍一下实现的功能:主要就是读写SD卡然后通过LCM显示出来,然后美化一下具体如下:                       
        1.有四个菜单,分别为日历(用到了RTC 模块和DS18B20模块)
        2.电子书模块,将TXT文党放在了SD卡里,然后每按一次健就读出来一部分并显示
        3.游戏:暂时未开发
        4.音乐暂时也没开发
无图图真相:lol 下面上图:

12.JPG (4.1 MB )

12.JPG

13.JPG (4.29 MB )

13.JPG

14.JPG (4.21 MB )

14.JPG

15.JPG (4.16 MB )

15.JPG

16.JPG (4.11 MB )

16.JPG

17.JPG (4.28 MB )

17.JPG

18.JPG (4.05 MB )

18.JPG

20.JPG (4.15 MB )

20.JPG

21.JPG (4.23 MB )

21.JPG

22.JPG (4.19 MB )

22.JPG

23.JPG (4.06 MB )

23.JPG
评分
参与人数 3威望 +12 收起 理由
Swallow_0322 + 1
Ryanhsiung + 1
hotpower + 10

相关帖子

沙发
lixiaoxu2meng|  楼主 | 2011-11-26 07:55 | 只看该作者
由于本工程还未完善上贴一部分待以后完善了再继续更新

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2011 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "includes.h"         //包含所需的头文件
/*************************************************************************************
** Function name:       main
** Descriptions:                     
** input parameters:    无
** output parameters:   无
** Returned value:      无
*************************************************************************************/
FATFS fs;
FIL file;
FRESULT res;       
uint8_t RW_Buf[6][40];
S_DRVRTC_TIME_DATA_T   Curren_Time;
int32_t AD_Value;
UINT rr;
int main (void)
{
    uint8_t funselect= 1,i;
    Set_System();                                                        //封装一些初始化模块
        if(DrvGPIO_GetBit(E_GPA, 13)== 0)                  //检测SD卡是否插入
          printf("SD卡已插入\n");
        else printf("SD卡未插入\n");
           while(SD_Init()!=0)                                                //等待SD卡初始化完成
        {
         DrvSYS_Delay(600000);
         printf("等待SD卡初始化\n");
        }
    printf("初始化成功\n");          
    res = f_mount(0, &fs);                                        //注册工作区
    if(res == FR_OK)                                                 //如果注册工作区成功
    {
          res = f_open(&file, "li.txt", FA_OPEN_EXISTING | FA_READ); //打开文件
      switch(res)
      {
       case FR_OK:                                                        //如果"li.txt"存在,关闭文件
          printf("文件存在\n");
          f_close(&file);
       break;
       case FR_NO_FILESYSTEM:                                //如果文件系统不存在,格式化SD          
              printf("文件系统不存在\n");
              res = f_mkfs(0 , 0, _MAX_SS);
              printf("%d",res);
       case FR_NO_FILE:                                                //如果"LI.txt"不存在,创建该文件并写入初值
          printf("文件不存在\n");
          if(f_open(&file, "li.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK)
          {
               f_printf(&file, "%s\n", "李晓旭文本文档");
               f_close(&file);
          }
       break;
       default: break;
       }  
       f_mount(0, 0);                                                 //关闭工作区
     }
           
     res = f_mount(0, &fs);
     /*f_open(&file, "li.txt", FA_OPEN_ALWAYS | FA_WRITE);//打开文件li.txt  
     f_lseek(&file, f_size(&file)); //将指针移到文件末尾
     f_printf(&file, "%s\n", "李晓旭文本文档...");
         f_close(&file);//关闭文件li.txt  */


        /*if(f_open(&file, "book1.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK)
         {
            f_printf(&file, "%s","内容");
         }
         f_close(&file);*/

     f_mount(0, 0);//关闭工作区         



         while(1)
         {
       if(ShowPage == 0)
       {
             switch(funselect)
                 {
                  case 1:WriteStringToLCM(1,0,"->");
                      break;
                  case 2:WriteStringToLCM(2,0,"->");
                     break;
                  case 3:WriteStringToLCM(3,0,"->");
                     break;
                  case 4:WriteStringToLCM(4,0,"->");
                     break;
                  default:break;
                 }
                    WriteStringToLCM(1,1,"1.日历");
             WriteStringToLCM(2,1,"2.小说");
             WriteStringToLCM(3,1,"3.游戏");
             WriteStringToLCM(4,1,"4.音乐");

                 while(ShowPage == 0)
                 {
          KeyCode = GetKey();
              switch(KeyCode)
              {
               case KEY1_DOWN_USER:       
               {
                     if(funselect<4) funselect++;
                         else funselect= 1;
                    WriteStringToLCM(1,0,"  ");//清选择表头
                    WriteStringToLCM(2,0,"  ");
                    WriteStringToLCM(3,0,"  ");
                    WriteStringToLCM(4,0,"  ");
                    switch(funselect)
                    {
                     case 1:WriteStringToLCM(1,0,"->");
                     break;
                     case 2:WriteStringToLCM(2,0,"->");
                     break;
                     case 3:WriteStringToLCM(3,0,"->");
                     break;
                     case 4:WriteStringToLCM(4,0,"->");
                     break;
                     default:break;
                     }
               }  
               break;
               case KEY2_DOWN_USER:       
               {
                switch(funselect)
                    {
                      case 1:ShowPage = DatePage; break;
                      case 2:ShowPage = BookPage;break;
                      case 3:ShowPage = GamePage;break;
                      case 4:ShowPage = MusicPage; break;
                      default:break;
                    }
               }
                break;
                default:break;
               }
                 }
       }
       if(ShowPage == DatePage)
       {
         DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time);         //读取当前时间
         value = read_temp();//读取当前温度
             value = value/10;
             WriteCommandToLCM(0x01);        //清屏指令
         delay_ms(10);
                WriteStringToLCM(1,0,"星期    晴    C");
             WriteStringToLCM(2,0,"    年  月  日");
             WriteStringToLCM(3,0,"    时  分  秒");
            //WriteStringToLCM(4,0,&RW_Buf[3][0]);
             switch(Curren_Time.u32cDayOfWeek)
             {
               case 0:WriteStringToLCM(1,2,"日");break;
               case 1:WriteStringToLCM(1,2,"一");break;
               case 2:WriteStringToLCM(1,2,"二");break;
               case 3:WriteStringToLCM(1,2,"三");break;
               case 4:WriteStringToLCM(1,2,"四");break;
               case 5:WriteStringToLCM(1,2,"五");break;
               case 6:WriteStringToLCM(1,2,"六");break;
               default:break;
              }
             while(ShowPage == DatePage)
             {
               DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time);         //读取当前时间
               value = read_temp();//读取当前温度
               value = value/10;
               if(value >100)
               value = 99;
               WriteValueToLCM(1,5,"%1f",value);
               //WriteValueToLCM(4,0,"%2f",value);
               WriteValueToLCM(2,0,"%2d",Curren_Time.u32Year);
               WriteValueToLCM(2,3,"%2d",Curren_Time.u32cMonth);
               WriteValueToLCM(2,5,"%2d",Curren_Time.u32cDay);
               WriteValueToLCM(3,1,"%2d",Curren_Time.u32cHour);
               WriteValueToLCM(3,3,"%2d",Curren_Time.u32cMinute);
               WriteValueToLCM(3,5,"%2d",Curren_Time.u32cSecond);
               KeyCode = GetKey();
               switch(KeyCode)
               {
                case KEY1_DOWN_USER:       
                {            
                          ShowPage = 0;
                          funselect = 1;
                      WriteCommandToLCM(0x01);        //清屏指令
              delay_ms(10);
                        }  
                break;
                case KEY2_DOWN_USER:       
                {}
                break;
               default:break;
              }
            }/*while(ShowPage == DatePage)*/
      }/*if(ShowPage == DatePage)*/
      if(ShowPage == BookPage)
       {
             WriteCommandToLCM(0x01);        //清屏指令
         delay_ms(10);
             WriteStringToLCM(1,2,"电子书");
                 WriteStringToLCM(2,2,"人生.txt");
                 WriteStringToLCM(3,3,"作者—路遥");
                 f_mount(0, &fs);                                        //注册工作区//注册工作区
                 f_open(&file, "book1.txt", FA_OPEN_EXISTING | FA_READ);//打开电子书记事本
                 while(ShowPage == BookPage)
                 {
                   KeyCode = GetKey();
               switch(KeyCode)
               {
                case KEY1_DOWN_USER:       
                {  
                          f_close(&file);//关闭电子书记事本  
                          f_mount(0, 0);//关闭工作区                
                          ShowPage = 0;
                          funselect = 2;
                      WriteCommandToLCM(0x01);        //清屏指令
              delay_ms(10);
                        }  
                break;
                case KEY2_DOWN_USER:       
                {
                          WriteCommandToLCM(0x01);        //清屏指令
              delay_ms(10);
                          for(i=1;i<=4;i++)//
                          {
                           f_read(&file,&RW_Buf[i][0],16,&rr);
                           printf("%s\n",&RW_Buf[i][0]);
                           WriteStringToLCM(i,0,&RW_Buf[i][0]);       
                          }
                          
                        }
                break;
               default:break;
              }

                 } /*while(ShowPage == BookPage)*/
           }/*if(ShowPage == BookPage)*/
      if(ShowPage == GamePage)
       {
             WriteCommandToLCM(0x01);        //清屏指令
         delay_ms(10);
             WriteStringToLCM(1,3,"游戏");
                 WriteStringToLCM(2,0,"->1.贪吃蛇");
                 WriteStringToLCM(3,1,"1.俄罗斯方块");
                 while(ShowPage == GamePage)
                 {
                   KeyCode = GetKey();
               switch(KeyCode)
               {
                case KEY1_DOWN_USER:       
                {                  
                          ShowPage = 0;
                          funselect = 3;
                      WriteCommandToLCM(0x01);        //清屏指令
              delay_ms(10);
                        }  
                break;
                case KEY2_DOWN_USER:       
                {}
                break;
               default:break;
              }

                 } /*while(ShowPage == MusicPage)*/
           }/*if(ShowPage == MusicPage)*/
      if(ShowPage == MusicPage)
       {
             WriteCommandToLCM(0x01);        //清屏指令
         delay_ms(10);
             WriteStringToLCM(1,3,"音乐");
                 while(ShowPage == MusicPage)
                 {
                   KeyCode = GetKey();
               switch(KeyCode)
               {
                case KEY1_DOWN_USER:       
                {                  
                          ShowPage = 0;
                          funselect = 4;
                      WriteCommandToLCM(0x01);        //清屏指令
              delay_ms(10);
                        }  
                break;
                case KEY2_DOWN_USER:       
                {}
                break;
               default:break;
              }

                 } /*while(ShowPage == MusicPage)*/
           }/*if(ShowPage == MusicPage)*/

    }/*while*/
}/*main*/

使用特权

评论回复
板凳
dong_abc| | 2011-11-26 10:09 | 只看该作者
相当给力~

使用特权

评论回复
地板
plc_avr| | 2011-11-26 10:36 | 只看该作者
非常不错,顶!

使用特权

评论回复
5
watch186| | 2011-11-26 11:06 | 只看该作者
太猛啊……LZ

使用特权

评论回复
6
tendence| | 2011-11-26 11:34 | 只看该作者
这个得理解好久啊

使用特权

评论回复
7
goodboy3021| | 2011-11-26 12:37 | 只看该作者
2# lixiaoxu2meng

很不错啊,菜农老师在微博上都推荐啦,期待后续功能。。。

使用特权

评论回复
8
lixiaoxu2meng|  楼主 | 2011-11-26 12:41 | 只看该作者
3# dong_abc
相互学习

使用特权

评论回复
9
lixiaoxu2meng|  楼主 | 2011-11-26 12:42 | 只看该作者
4# plc_avr
还得向烈火前辈学习:loveliness:

使用特权

评论回复
10
lixiaoxu2meng|  楼主 | 2011-11-26 12:42 | 只看该作者
5# watch186
:handshake 共同学习共同进步

使用特权

评论回复
11
lixiaoxu2meng|  楼主 | 2011-11-26 12:43 | 只看该作者
6# tendence
你的进步挺快的

使用特权

评论回复
12
lixiaoxu2meng|  楼主 | 2011-11-26 12:43 | 只看该作者
7# goodboy3021
呵呵 3Q

使用特权

评论回复
13
Ryanhsiung| | 2011-11-26 12:48 | 只看该作者
相当给力!!

使用特权

评论回复
14
tendence| | 2011-11-26 13:12 | 只看该作者
11# lixiaoxu2meng
哈哈哈。。。
谢谢夸奖,你是我的目标。

使用特权

评论回复
15
lixiaoxu2meng|  楼主 | 2011-11-26 13:50 | 只看该作者
13# Ryanhsiung
呵呵 谢谢夸奖还得多学习

使用特权

评论回复
16
lixiaoxu2meng|  楼主 | 2011-11-26 13:52 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-26 15:00 编辑

14# tendence
还是别以我当目标了  应该学习烈火前辈和三心前辈 为目标 当然论坛里还有很多很厉害的人 我也需要向他们学习

使用特权

评论回复
17
tendence| | 2011-11-26 16:42 | 只看该作者
你谦虚了

使用特权

评论回复
18
hotpower| | 2011-11-26 19:00 | 只看该作者
非常好,只是没有带文件系统的压缩包让大家一起玩玩~~~

使用特权

评论回复
19
lixiaoxu2meng|  楼主 | 2011-11-26 19:12 | 只看该作者
18# hotpower
工程没有优化 有点乱 还有部分功能没有实现 例如时间 修改设置等

LI-SD-FATFS-1.rar

2.6 MB

使用特权

评论回复
20
lixiaoxu2meng|  楼主 | 2011-11-26 19:12 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-26 19:16 编辑

希望大家拍砖  本工程部分驱动移植于网友 在这里表示感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

粉丝