[mw_shl_code=c,true]/**
*****************************************************************************
* 汉字显示
*
* (C) Copyright 2000-2020, ***
* All Rights Reserved
*****************************************************************************
*
* @File : GBKtest.c
* @By : Sam Chan
* @Version : V1.0
* @Date : 2014 / 09 / 23
*
*****************************************************************************
* Update
* @Version : V1.*
* @By : ***
* @Date : 20** / ** / **
* @Brief : ***
*
*****************************************************************************
**/
#include "gbktest.h"
#include "ff.h"
#include "oled.h"
/******************************************************************************
文件系统路径定义
******************************************************************************/
const u8 *GBK_FontPath[FatPath][FontSize] =
{
/* SD卡路径 */
{
"0:/SYSTEM/FONT/GBK12.FON",
"0:/SYSTEM/FONT/GBK16.FON",
"0:/SYSTEM/FONT/GBK24.FON",
"0:/SYSTEM/FONT/GBK32.FON",
},
/* flash路径 */
{
"1:/SYSTEM/FONT/GBK12.FON",
"1:/SYSTEM/FONT/GBK16.FON",
"1:/SYSTEM/FONT/GBK24.FON",
"1:/SYSTEM/FONT/GBK32.FON",
},
};
static u8 GBK_Buffer[128]; //一个汉字数据大小
/**
*****************************************************************************
* @Name : 读取字库中汉字的数据
*
* @Brief : none
*
* @Input : *GBK: 输入的汉字
* path: 字库路径
* Size: 汉字大小
*
* @Output : GBK_OutBuf: 数据输出缓存
*
* @Return : none
*****************************************************************************
**/
static void Get_GBKData(const u8 *GBK, u8 path, u8 Size, u8 *GBK_OutBuf)
{
FIL filefont; //文件指针
UINT brf; //读取变量
FRESULT res; //函数操作应答
unsigned char g_size=0;
unsigned char GBKH,GBKL;
unsigned char csize=0;
unsigned long foffset=0; //汉字首地址
csize = (Size/8 + ((Size%8)?1:0)) * Size; //得到一个字符占用集的字节大小
GBKH = *GBK; //高8位
GBKL = *(++GBK); //低8位
if(GBKL < 0x7f) foffset = ((GBKH - 0x81) * 190 + GBKL - 0x40) * csize;//(Size * 2);
if(GBKL > 0x80) foffset = ((GBKH - 0x81) * 190 + GBKL - 0x41) * csize;//(Size * 2);
switch(Size)
{
case 12:
g_size = GBK12;
break;
case 16:
g_size = GBK16;
break;
case 24:
g_size = GBK24;
break;
case 32:
g_size = GBK32;
break;
default:
break;
}
res = f_open(&filefont, (const TCHAR*)GBK_FontPath[path][g_size], FA_READ); //只读
if(res != FR_OK) //打开失败
{
printf("The GBK Open File Res:%d\r\n", (u8)res);
f_close(&filefont); //关闭文件
return; //结束访问
}
else
{
res = f_lseek(&filefont, foffset); //偏移指针
res = f_read(&filefont, GBK_OutBuf, csize, &brf); //读取数据
res = f_close(&filefont); //关闭文件
}
}
/**
*****************************************************************************
* @Name : 指定位置显示一个中文字符
*
* @Brief : none
*
* @Input : (x, y): 起点坐标
* width: 宽度
* height: 高度
* *GBK: 要显示中文字符
* size: 字体大小
* mode: 显示模式。0: 不叠加显示;1: 叠加显示。
*
* @Output : none
*
* @Return : none
*****************************************************************************
**/
/*
解码模式
+------------>
|
|
\|/
*/
void Draw_GBK(u16 x, u16 y, u16 width, u16 height, u8 *GBK, u8 size, u8 mode)
{
static u8 *GBKBUF;
u8 GBKtemp=0;
u8 csize=0;
u16 i=0,j=0;
u16 x0=x;
GBKBUF = GBK_Buffer;
if((*GBK == 0) || (x > 127) || (y > 63) || \
((size != 12) && (size != 16) && (size != 24) && (size != 32)))
{
return;
}
csize = (size/8 + ((size%8)?1:0)) * size; //得到一个字符占用集的字节大小
Get_GBKData(GBK, SDPath, size, GBKBUF); //读取数据
for(i = 0;i < csize;i++)
{
GBKtemp = GBKBUF; //得到汉字点阵数据
for(j = 0;j < 8;j++)
{
if(GBKtemp & 0x80) OLED_DrawPoint(x, y, mode); //LCD_FastDrawPoint(x, y, lcd_dev._lcdobj.textcol);
else if(mode == 0) OLED_DrawPoint(x, y, !mode); //LCD_FastDrawPoint(x, y, lcd_dev._lcdobj.backcol);
GBKtemp <<= 1;
x++;
if(x - x0 == size) //显示完一行了
{
x = x0; //恢复x坐标
y++; //显示下一行
break;
}
} //end for j
} //end for i
}
/**
*****************************************************************************
* @Name : 指定位置显示一个中文字符串
*
* @Brief : none
*
* @Input : (x, y): 起点坐标
* width: 宽度
* height: 高度
* *str: 要显示中文字符
* size: 字体大小
* mode: 显示模式。0: 不叠加显示;1: 叠加显示。
*
* @Output : none
*
* @Return : none
*****************************************************************************
**/
void Show_GBKString(u16 x, u16 y, u16 width, u16 height, u8 *str, u8 size, u8 mode)
{
u8 x0=x;
while(*str != '\0') //直到遇到结束符
{
if((x + size) > width) //换行
{
x = x0;
y += size;
}
if((y + size) > height) break; //越界,返回
Draw_GBK(x, y, width, height, str, size, mode); //显示这个汉字
str += 2;
x += size; //偏移到下一个汉字
}
}
[/mw_shl_code]
|