[菜农助学交流] 菜鸟学习M0第二十贴——SD+FATFS+LCM

[复制链接]
8705|29
 楼主| lixiaoxu2meng 发表于 2011-11-26 07:52 | 显示全部楼层 |阅读模式
本帖最后由 lixiaoxu2meng 于 2011-11-26 15:07 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 3威望 +12 收起 理由
Swallow_0322 + 1
Ryanhsiung + 1
hotpower + 10

查看全部评分

 楼主| lixiaoxu2meng 发表于 2011-11-26 07:55 | 显示全部楼层
由于本工程还未完善上贴一部分待以后完善了再继续更新

  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2011 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "includes.h"         //包含所需的头文件
  7. /*************************************************************************************
  8. ** Function name:       main
  9. ** Descriptions:                     
  10. ** input parameters:    无
  11. ** output parameters:   无
  12. ** Returned value:      无
  13. *************************************************************************************/
  14. FATFS fs;
  15. FIL file;
  16. FRESULT res;       
  17. uint8_t RW_Buf[6][40];
  18. S_DRVRTC_TIME_DATA_T   Curren_Time;
  19. int32_t AD_Value;
  20. UINT rr;
  21. int main (void)
  22. {
  23.     uint8_t funselect= 1,i;
  24.     Set_System();                                                        //封装一些初始化模块
  25.         if(DrvGPIO_GetBit(E_GPA, 13)== 0)                  //检测SD卡是否插入
  26.           printf("SD卡已插入\n");
  27.         else printf("SD卡未插入\n");
  28.            while(SD_Init()!=0)                                                //等待SD卡初始化完成
  29.         {
  30.          DrvSYS_Delay(600000);
  31.          printf("等待SD卡初始化\n");
  32.         }
  33.     printf("初始化成功\n");          
  34.     res = f_mount(0, &fs);                                        //注册工作区
  35.     if(res == FR_OK)                                                 //如果注册工作区成功
  36.     {
  37.           res = f_open(&file, "li.txt", FA_OPEN_EXISTING | FA_READ); //打开文件
  38.       switch(res)
  39.       {
  40.        case FR_OK:                                                        //如果"li.txt"存在,关闭文件
  41.           printf("文件存在\n");
  42.           f_close(&file);
  43.        break;
  44.        case FR_NO_FILESYSTEM:                                //如果文件系统不存在,格式化SD          
  45.               printf("文件系统不存在\n");
  46.               res = f_mkfs(0 , 0, _MAX_SS);
  47.               printf("%d",res);
  48.        case FR_NO_FILE:                                                //如果"LI.txt"不存在,创建该文件并写入初值
  49.           printf("文件不存在\n");
  50.           if(f_open(&file, "li.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK)
  51.           {
  52.                f_printf(&file, "%s\n", "李晓旭文本文档");
  53.                f_close(&file);
  54.           }
  55.        break;
  56.        default: break;
  57.        }  
  58.        f_mount(0, 0);                                                 //关闭工作区
  59.      }
  60.            
  61.      res = f_mount(0, &fs);
  62.      /*f_open(&file, "li.txt", FA_OPEN_ALWAYS | FA_WRITE);//打开文件li.txt  
  63.      f_lseek(&file, f_size(&file)); //将指针移到文件末尾
  64.      f_printf(&file, "%s\n", "李晓旭文本文档...");
  65.          f_close(&file);//关闭文件li.txt  */


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

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



  72.          while(1)
  73.          {
  74.        if(ShowPage == 0)
  75.        {
  76.              switch(funselect)
  77.                  {
  78.                   case 1:WriteStringToLCM(1,0,"->");
  79.                       break;
  80.                   case 2:WriteStringToLCM(2,0,"->");
  81.                      break;
  82.                   case 3:WriteStringToLCM(3,0,"->");
  83.                      break;
  84.                   case 4:WriteStringToLCM(4,0,"->");
  85.                      break;
  86.                   default:break;
  87.                  }
  88.                     WriteStringToLCM(1,1,"1.日历");
  89.              WriteStringToLCM(2,1,"2.小说");
  90.              WriteStringToLCM(3,1,"3.游戏");
  91.              WriteStringToLCM(4,1,"4.音乐");

  92.                  while(ShowPage == 0)
  93.                  {
  94.           KeyCode = GetKey();
  95.               switch(KeyCode)
  96.               {
  97.                case KEY1_DOWN_USER:       
  98.                {
  99.                      if(funselect<4) funselect++;
  100.                          else funselect= 1;
  101.                     WriteStringToLCM(1,0,"  ");//清选择表头
  102.                     WriteStringToLCM(2,0,"  ");
  103.                     WriteStringToLCM(3,0,"  ");
  104.                     WriteStringToLCM(4,0,"  ");
  105.                     switch(funselect)
  106.                     {
  107.                      case 1:WriteStringToLCM(1,0,"->");
  108.                      break;
  109.                      case 2:WriteStringToLCM(2,0,"->");
  110.                      break;
  111.                      case 3:WriteStringToLCM(3,0,"->");
  112.                      break;
  113.                      case 4:WriteStringToLCM(4,0,"->");
  114.                      break;
  115.                      default:break;
  116.                      }
  117.                }  
  118.                break;
  119.                case KEY2_DOWN_USER:       
  120.                {
  121.                 switch(funselect)
  122.                     {
  123.                       case 1:ShowPage = DatePage; break;
  124.                       case 2:ShowPage = BookPage;break;
  125.                       case 3:ShowPage = GamePage;break;
  126.                       case 4:ShowPage = MusicPage; break;
  127.                       default:break;
  128.                     }
  129.                }
  130.                 break;
  131.                 default:break;
  132.                }
  133.                  }
  134.        }
  135.        if(ShowPage == DatePage)
  136.        {
  137.          DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time);         //读取当前时间
  138.          value = read_temp();//读取当前温度
  139.              value = value/10;
  140.              WriteCommandToLCM(0x01);        //清屏指令
  141.          delay_ms(10);
  142.                 WriteStringToLCM(1,0,"星期    晴    C");
  143.              WriteStringToLCM(2,0,"    年  月  日");
  144.              WriteStringToLCM(3,0,"    时  分  秒");
  145.             //WriteStringToLCM(4,0,&RW_Buf[3][0]);
  146.              switch(Curren_Time.u32cDayOfWeek)
  147.              {
  148.                case 0:WriteStringToLCM(1,2,"日");break;
  149.                case 1:WriteStringToLCM(1,2,"一");break;
  150.                case 2:WriteStringToLCM(1,2,"二");break;
  151.                case 3:WriteStringToLCM(1,2,"三");break;
  152.                case 4:WriteStringToLCM(1,2,"四");break;
  153.                case 5:WriteStringToLCM(1,2,"五");break;
  154.                case 6:WriteStringToLCM(1,2,"六");break;
  155.                default:break;
  156.               }
  157.              while(ShowPage == DatePage)
  158.              {
  159.                DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time);         //读取当前时间
  160.                value = read_temp();//读取当前温度
  161.                value = value/10;
  162.                if(value >100)
  163.                value = 99;
  164.                WriteValueToLCM(1,5,"%1f",value);
  165.                //WriteValueToLCM(4,0,"%2f",value);
  166.                WriteValueToLCM(2,0,"%2d",Curren_Time.u32Year);
  167.                WriteValueToLCM(2,3,"%2d",Curren_Time.u32cMonth);
  168.                WriteValueToLCM(2,5,"%2d",Curren_Time.u32cDay);
  169.                WriteValueToLCM(3,1,"%2d",Curren_Time.u32cHour);
  170.                WriteValueToLCM(3,3,"%2d",Curren_Time.u32cMinute);
  171.                WriteValueToLCM(3,5,"%2d",Curren_Time.u32cSecond);
  172.                KeyCode = GetKey();
  173.                switch(KeyCode)
  174.                {
  175.                 case KEY1_DOWN_USER:       
  176.                 {            
  177.                           ShowPage = 0;
  178.                           funselect = 1;
  179.                       WriteCommandToLCM(0x01);        //清屏指令
  180.               delay_ms(10);
  181.                         }  
  182.                 break;
  183.                 case KEY2_DOWN_USER:       
  184.                 {}
  185.                 break;
  186.                default:break;
  187.               }
  188.             }/*while(ShowPage == DatePage)*/
  189.       }/*if(ShowPage == DatePage)*/
  190.       if(ShowPage == BookPage)
  191.        {
  192.              WriteCommandToLCM(0x01);        //清屏指令
  193.          delay_ms(10);
  194.              WriteStringToLCM(1,2,"电子书");
  195.                  WriteStringToLCM(2,2,"人生.txt");
  196.                  WriteStringToLCM(3,3,"作者—路遥");
  197.                  f_mount(0, &fs);                                        //注册工作区//注册工作区
  198.                  f_open(&file, "book1.txt", FA_OPEN_EXISTING | FA_READ);//打开电子书记事本
  199.                  while(ShowPage == BookPage)
  200.                  {
  201.                    KeyCode = GetKey();
  202.                switch(KeyCode)
  203.                {
  204.                 case KEY1_DOWN_USER:       
  205.                 {  
  206.                           f_close(&file);//关闭电子书记事本  
  207.                           f_mount(0, 0);//关闭工作区                
  208.                           ShowPage = 0;
  209.                           funselect = 2;
  210.                       WriteCommandToLCM(0x01);        //清屏指令
  211.               delay_ms(10);
  212.                         }  
  213.                 break;
  214.                 case KEY2_DOWN_USER:       
  215.                 {
  216.                           WriteCommandToLCM(0x01);        //清屏指令
  217.               delay_ms(10);
  218.                           for(i=1;i<=4;i++)//
  219.                           {
  220.                            f_read(&file,&RW_Buf[i][0],16,&rr);
  221.                            printf("%s\n",&RW_Buf[i][0]);
  222.                            WriteStringToLCM(i,0,&RW_Buf[i][0]);       
  223.                           }
  224.                           
  225.                         }
  226.                 break;
  227.                default:break;
  228.               }

  229.                  } /*while(ShowPage == BookPage)*/
  230.            }/*if(ShowPage == BookPage)*/
  231.       if(ShowPage == GamePage)
  232.        {
  233.              WriteCommandToLCM(0x01);        //清屏指令
  234.          delay_ms(10);
  235.              WriteStringToLCM(1,3,"游戏");
  236.                  WriteStringToLCM(2,0,"->1.贪吃蛇");
  237.                  WriteStringToLCM(3,1,"1.俄罗斯方块");
  238.                  while(ShowPage == GamePage)
  239.                  {
  240.                    KeyCode = GetKey();
  241.                switch(KeyCode)
  242.                {
  243.                 case KEY1_DOWN_USER:       
  244.                 {                  
  245.                           ShowPage = 0;
  246.                           funselect = 3;
  247.                       WriteCommandToLCM(0x01);        //清屏指令
  248.               delay_ms(10);
  249.                         }  
  250.                 break;
  251.                 case KEY2_DOWN_USER:       
  252.                 {}
  253.                 break;
  254.                default:break;
  255.               }

  256.                  } /*while(ShowPage == MusicPage)*/
  257.            }/*if(ShowPage == MusicPage)*/
  258.       if(ShowPage == MusicPage)
  259.        {
  260.              WriteCommandToLCM(0x01);        //清屏指令
  261.          delay_ms(10);
  262.              WriteStringToLCM(1,3,"音乐");
  263.                  while(ShowPage == MusicPage)
  264.                  {
  265.                    KeyCode = GetKey();
  266.                switch(KeyCode)
  267.                {
  268.                 case KEY1_DOWN_USER:       
  269.                 {                  
  270.                           ShowPage = 0;
  271.                           funselect = 4;
  272.                       WriteCommandToLCM(0x01);        //清屏指令
  273.               delay_ms(10);
  274.                         }  
  275.                 break;
  276.                 case KEY2_DOWN_USER:       
  277.                 {}
  278.                 break;
  279.                default:break;
  280.               }

  281.                  } /*while(ShowPage == MusicPage)*/
  282.            }/*if(ShowPage == MusicPage)*/

  283.     }/*while*/
  284. }/*main*/

dong_abc 发表于 2011-11-26 10:09 | 显示全部楼层
相当给力~
plc_avr 发表于 2011-11-26 10:36 | 显示全部楼层
非常不错,顶!
watch186 发表于 2011-11-26 11:06 | 显示全部楼层
太猛啊……LZ
tendence 发表于 2011-11-26 11:34 | 显示全部楼层
这个得理解好久啊
goodboy3021 发表于 2011-11-26 12:37 | 显示全部楼层
2# lixiaoxu2meng

很不错啊,菜农老师在微博上都推荐啦,期待后续功能。。。
 楼主| lixiaoxu2meng 发表于 2011-11-26 12:41 | 显示全部楼层
3# dong_abc
相互学习
 楼主| lixiaoxu2meng 发表于 2011-11-26 12:42 | 显示全部楼层
4# plc_avr
还得向烈火前辈学习:loveliness:
 楼主| lixiaoxu2meng 发表于 2011-11-26 12:42 | 显示全部楼层
5# watch186
:handshake 共同学习共同进步
 楼主| lixiaoxu2meng 发表于 2011-11-26 12:43 | 显示全部楼层
6# tendence
你的进步挺快的
 楼主| lixiaoxu2meng 发表于 2011-11-26 12:43 | 显示全部楼层
7# goodboy3021
呵呵 3Q
Ryanhsiung 发表于 2011-11-26 12:48 | 显示全部楼层
相当给力!!
tendence 发表于 2011-11-26 13:12 | 显示全部楼层
11# lixiaoxu2meng
哈哈哈。。。
谢谢夸奖,你是我的目标。
 楼主| lixiaoxu2meng 发表于 2011-11-26 13:50 | 显示全部楼层
13# Ryanhsiung
呵呵 谢谢夸奖还得多学习
 楼主| lixiaoxu2meng 发表于 2011-11-26 13:52 | 显示全部楼层
本帖最后由 lixiaoxu2meng 于 2011-11-26 15:00 编辑

14# tendence
还是别以我当目标了  应该学习烈火前辈和三心前辈 为目标 当然论坛里还有很多很厉害的人 我也需要向他们学习
tendence 发表于 2011-11-26 16:42 | 显示全部楼层
你谦虚了
hotpower 发表于 2011-11-26 19:00 | 显示全部楼层
非常好,只是没有带文件系统的压缩包让大家一起玩玩~~~
 楼主| lixiaoxu2meng 发表于 2011-11-26 19:12 | 显示全部楼层
18# hotpower
工程没有优化 有点乱 还有部分功能没有实现 例如时间 修改设置等

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| lixiaoxu2meng 发表于 2011-11-26 19:12 | 显示全部楼层
本帖最后由 lixiaoxu2meng 于 2011-11-26 19:16 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

0

主题

1679

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部