我发现我存的目录名称是小写字母,可是在显示屏显示出来的却是大写字符!!!!综合实验的源程序的电子书部分也是如此,比如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;
}
}
}
|