OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9399|回复: 1

关于SD卡目录 大小写的问题

[复制链接]

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
发表于 2012-2-16 16:06:03 | 显示全部楼层 |阅读模式

我发现我存的目录名称是小写字母,可是在显示屏显示出来的却是大写字符!!!!综合实验的源程序的电子书部分也是如此,比如readme.txt  在TFT上显示就是README.TXT了........我换过两张SD卡都是这样。
还有我的程序显示不了中文的目录名称,可是却能显示txt文档里面的中文......还有浏览目录时,只能浏览文件夹和.TXT .FON,可是.JPG却不行.........请高手帮看看,下面付上重点程序Show_Str()直接用原子源代码

//打开文件
//aa:所要到开文件夹的开始簇
void opencon(DWORD aa)
{
 FileInfoStruct *file;
 u16 i;
 file=&F_Info[0];filenum=0;txtnum=0;
 Get_File_Info(aa,file,T_FILE,&filenum); //找出文件夹个数
 Get_File_Info(aa,file,T_TXT|T_JPG|T_FON,&txtnum);   //找出.txt.jpg.fon个数
 totalnum=filenum+txtnum;
 if(totalnum>8) totalnum=8; //最多只能显示8个
 for(shownum=1;shownum<filenum+1;shownum++) //提取filenum个文件夹信息
  {
   file=&F_Info[shownum-1];
   Get_File_Info(aa,file,T_FILE,&shownum);
  }
 for(;shownum<totalnum+1;shownum++) //提取txtnum个.txt .jpg.fon信息
  {
   i++;
   file=&F_Info[shownum-1];
   Get_File_Info(aa,file,T_TXT|T_JPG|T_FON|T_BMP,&i);
  }
 for(shownum=0;shownum<totalnum;shownum++)  //显示目录
  {
   Show_Str(90,20+32*shownum,F_Info[shownum].F_Name,16,0);      //显示中文时候出错 乱码
   printf("%s\n",F_Info[shownum].F_Name);             
   if(shownum<filenum) Show_Str(40,20+32*shownum,"文件:",16,0);
   else Show_Str(40,20+32*shownum,"文档:",16,0);
  }
}

#define FSIZE 16

void read_txt(FileInfoStruct *file)
{              
    u16 pointpos=0;   //指针位置      
    u16 x=0,y=0;
    u8 *p=0;            //指向txt文件
    u8 temp[2]={0,0};   //换扇区使用
    u8 bHz=0;           //字符或者中文     
  
         if((file->F_Type&(T_LRC|T_TXT|T_C|T_H))==0)return;//不是TXT类型的文件
         F_Open(file);//打开文件  

         LCD_Clear(WHITE);//清屏
         POINT_COLOR=DARKBLUE;//深蓝色字体               
         F_Read(file,fat_buffer);//读取数据      
         p=fat_buffer; //指向txt数据首地址          
         while(*p!=0)//数据未结束
         {        
          if(!bHz)
          {
           if(*p>0x80)bHz=1;//中文字符
           else             //ASCII字符
           {     
                        if(x>(240-FSIZE/2)){y+=FSIZE;x=0;}//一行已满,换行 
            if(y>(320-FSIZE))break;//越界返回     
            if(*p==13)//换行符号
            {        
                y+=FSIZE;
                  x=0;
                p++;pointpos++;//跳过
            } 
            else LCD_ShowChar(x,y,*p,FSIZE,1);
             p++;pointpos++;
            x+=FSIZE/2; //字符,为全字的一半
           }
          }else
          {    
              bHz=0;//清除汉字标志
              if(x>(240-FSIZE)){y+=FSIZE;x=0;}//换行
           if(y>(320-FSIZE))break;//越界返回 
           //临界处理  
           if(pointpos==511)//保存上一扇区的最后一个字节,退出       
           {
               temp[0]=*p; //记录最后的字节               
               break;      //此扇区数据已经读完
           }
           if(temp[0])//上一次没有显示完
           {                        
               temp[1]=*p;//取第二扇区的第一个字节
              
               Show_Font(x,y,temp,16,1); //显示这个汉字,空心显示 
               p++;pointpos++;//偏移一个字节
               temp[0]=0;     //清除标记
           }else Show_Font(x,y,p,16,1); //显示这个汉字,空心显示     
          
           p+=2;pointpos+=2;     //指针偏移
           x+=FSIZE;      //下一个汉字偏移
          }
          if(pointpos>511)break;
         }  
     pointpos=0;//清除指针计数器             
    while(1)          //打开txt文档后等待key0键退出浏览文档(暂时无翻页功能)
     {
       if(KEY0==0)      
        {
         while(KEY0==0);
         LCD_Clear(WHITE);
         opencon(Fat_Dir_Cluster); //打开上层目录(父目录)在CopyDirentruyItem修改
         return;
        }
    }  



int main(void)

    u8 i;
 Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化    
 LCD_Init();   //初始化液晶   
 LED_Init();         //LED初始化
 KEY_Init();
 SPI_Flash_Init(); //SPI FLASH初始化 
  RTC_Init(); 

 OINT_COLOR=RED;
 if(SD_Init())  LCD_ShowString(60,20,"SD  ERROR");
 else LCD_ShowString(60,20,"SD OK!!");
 if(FAT_Init()) LCD_ShowString(60,40,"FAT  ERROR");
 else LCD_ShowString(60,40,"FAT OK!!");
    if(Font_Init()) LCD_ShowString(60,60,"FONT  ERROR");
 else LCD_ShowString(60,60,"FONT OK!!");
 delay_ms(500);delay_ms(500);
 LCD_Clear(WHITE);
  
 opencon(FirstDirClust); //打开根目录
 while(1)
 {
  if(KEY0==0) //光标进行 目标选择
     {
   while(KEY0==0);
   LCD_Fill(5,20+(keynum-1)*32,38,52+keynum*32,WHITE);
   if(keynum==totalnum)  keynum=0;
   LCD_ShowString(7,20+32*keynum,"->");
   keynum++;
  }
  if(KEY1==0)   //打开选择的目标
    {
     while(KEY1==0);
  LCD_Clear(WHITE);
  
  if(F_Info[keynum-1].F_Attr!=0x20)  //打开文件夹
     opencon(F_Info[keynum-1].F_StartCluster);
  else
     {
      read_txt(&F_Info[keynum-1]);    //打开txt文档
     }
  keynum=0;   //光标从头开始
    }
     delay_ms(10);
  i++;
  if(i>=40)
   {
  LED0=!LED0;
  i=0;
   }
 }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-16 17:01:38 | 显示全部楼层
回复【楼主位】bluebird23:
---------------------------------
是fat文件系统的问题.短文件名就是大写的!电脑有另外一套处理方法,fatfs也有.不过我们的文件系统没做处理,所以你看到文件名字符数小于等于8个的都是大写.
中文目录名是可以的,具体参考我们的代码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 22:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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