五、案例使用
5.1 读取GBK字库文件(LCD汉字显示)
产品开发中,如果设备带有LCD显示屏,一般会显示各种文字提示,或者机器操作说明,显示中文需要字库,为了方便字模的提取,可以将字库文件制作好之后放到SD NAND上,通过文件系统打开字库文件,读取字模进行显示。

下面贴出文件系统读取字模的核心代码:
/*
函数功能: 显示GBK字库数据
          u32 x  范围0~319
          u32 y  范围0~479
          u32 size  数据的宽度(必须是8的倍数)  是正方形
          u8 *p  中文
说明: 取模横向坐标必须保证是8的倍数
*/

void ILI9341_DisplayGBKData(u32 x,u32 y,u32 size,u8 *p)
{
                FIL fp;
                UINT br;
                u8 L,H;
          u32 Addr;
          u16 font_size=size/8*size; //字体占用的点阵码字节大小
          u8 *buff=NULL;
                H=*p;
                L=*(p+1);
                if(L<0x7f)L=L-0x40;
                else L=L-0x41;
                H=H-0x81;
                Addr=(190*H+L)*font_size; //中文在字库里的偏移量
                buff=malloc(font_size);   //使用的堆空间
                if(buff==NULL)return;

                switch(size)
                {
                        case 16:
                                if(f_open(&fp,"0:/font/gbk16.DZK",FA_READ)!=FR_OK)
                {
                      printf("f_open error.\r\n");
                }
                                f_lseek(&fp,Addr);
                                f_read(&fp,buff,font_size,&br);
                                f_close(&fp);

                                break;
                        case 24:
                f_open(&fp,"0:/font/gbk24.DZK",FA_READ);
                                f_lseek(&fp,Addr);
                                f_read(&fp,buff,font_size,&br);
                                f_close(&fp);
                                break;
                        case 32:
                               
                                break;
                }
                //显示中文
                ILI9341_DisplayData(x,y,size,size,buff);
               
                //释放空间
                free(buff);
}

这是读取字模,显示的效果:

1673321873904603.png

5.2 读取MP3文件播放(开机音乐)

这个例子是演示文件系统的目录扫描函数使用方式,读取指定目录下的MP3文件进行播放。


u8 PlayerMP3(const char *path);
FATFS FatFs;
int main()
{
        LED_Init();
        BEEP_Init();
        KeyInit();
  USARTx_Init(USART1,72,115200);


  SDCardDeviceInit(); //初始化SD卡

//  res=f_mkfs("0:",FM_ANY,0,work,sizeof work);
//  if(res)printf("格式化失败!\n");
//  else printf("格式化成功!\n");
  f_mount(&FatFs, "0:", 0);   //注册工作区

  PlayerMP3("0:/MP3");

        while(1)
        {
    DelayMs(100);
    LED0=!LED0;
        }
}


/*
函数功能: 扫描目录mp3播放
0表示成功 1表示失败
*/
u8 PlayerMP3(const char *path)
{
    DIR dir;
    FRESULT res;
    FILINFO fno; //存放读取的文件信息
    char *abs_path=NULL;  

    /*1. 打开目录*/   
    res=f_opendir(&dir,path);
    if(res!=FR_OK)return res;

    /*2. 循环读取目录*/
     while(1)
     {
        res=f_readdir(&dir,&fno);
        if(fno.fname[0] == 0 || res!=0)break;
        printf("文件名称: %s,文件大小: %ld 字节\r\n",fno.fname,fno.fsize);

        /*过滤目录*/
        if(strstr(fno.fname,".mp3"))
        {
            //申请存放文件名称的长度
            abs_path=malloc(strlen(path)+strlen(fno.fname)+1);
            if(abs_path==NULL)break;

            strcpy(abs_path,path);
            strcat(abs_path,"/");
            strcat(abs_path,fno.fname);

            printf("abs_path=%s\n",abs_path);
            VS1053_MP3(0,0,abs_path);     
            free(abs_path);
        }
    }

    /*3. 关闭目录*/
    f_closedir(&dir);
    return 0;
}