读取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);
}
这是读取字模,显示的效果:
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;
}
产品开发中,如果设备带有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);
}
这是读取字模,显示的效果:
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;
}