#if USB_SPIFLASH_CH==1
/**
* 函数功能: 从串行Flash读取GBK码
* 输入参数: pBuffer:数据保存地址
* gbk :汉字字符低字节码
* font:字体选择
* 可选值:FONT_16 :16号字体
* FONT_24 :24号字体
* 返 回 值: uint8_t: 0:读取失败,1:读取成功
* 说 明:无
*/
static uint8_t GetGBKCode_SPIFLASH(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
{
uint32_t pos;
uint8_t high8bit,low8bit;
static uint8_t startflag=1;
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
if(startflag)
{
MX_SPIFlash_Init();
startflag=0;
}
high8bit=*pstr;
low8bit=*(pstr+1);
if(font==USB_FONT_16)
{
// 16*16大小的汉字 其字模 占用16*16/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
SPI_FLASH_BufferRead(pBuffer,GBK_HZ1616_ADDR+pos,32);
}
else
{
// 24*24大小的汉字 其字模 占用24*24/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
SPI_FLASH_BufferRead(pBuffer,GBK_HZ2424_ADDR+pos,72);
}
if((pBuffer[0]==0xFF)&&(pBuffer[1]==0xFF))
{
return 0;
}
return 1;
}
#else
/**
* 函数功能: 从SD卡读取GBK码
* 输入参数: pBuffer:数据保存地址
* gbk :汉字字符低字节码
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: uint8_t: 0:读取失败,1:读取成功
* 说 明:使用该函数之前确保已运行了f_mount(&fs,"0:",1);程序。
*/
static uint8_t GetGBKCode_SD(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
{
uint32_t pos;
uint8_t high8bit,low8bit;
FRESULT f_res;
UINT f_num;
high8bit=*pstr;
low8bit=*(pstr+1);
if(font==USB_FONT_16)
{
// 16*16大小的汉字 其字模 占用16*16/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
f_res=f_open(&file_ch,"0:/GBK_HZ1616.FON",FA_OPEN_EXISTING|FA_READ);
}
else
{
// 24*24大小的汉字 其字模 占用24*24/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
f_res=f_open(&file_ch,"0:/GBK_HZ2424.FON",FA_OPEN_EXISTING|FA_READ);
}
if(f_res == FR_OK )
{
f_lseek (&file_ch, pos); //指针偏移
if(font==USB_FONT_16)
{
f_res=f_read(&file_ch,pBuffer,32,&f_num);
}
else
{
f_res=f_read(&file_ch,pBuffer,72,&f_num);
}
f_close(&file_ch);
return 1;
}
else
return 0;
}
#endif
/**
* 函数功能: 在 LCD 显示器上显示一个中文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispCHAR_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
uint8_t ucTemp, ucPage, ucColumn;
uint8_t gbk_buffer[72];
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
if(font==USB_FONT_16)
{
LCD_OpenWindow(usX,usY,16,16);
LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_16);
#else
GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_16);
#endif
for(ucPage=0;ucPage<32;ucPage++)
{
ucTemp=gbk_buffer[ucPage];
for(ucColumn=0;ucColumn<8;ucColumn++)
{
if(ucTemp&0x01)
LCD_WRITE_DATA(usColor_Foreground);
else
LCD_WRITE_DATA(usColor_Background);
ucTemp >>= 1;
}
}
}
else
{
LCD_OpenWindow(usX,usY,24,24);
LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_24);
#else
GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_24);
#endif
for(ucPage=0;ucPage<72;ucPage++)
{
ucTemp=gbk_buffer[ucPage];
for(ucColumn=0;ucColumn<8;ucColumn++)
{
if(ucTemp&0x01)
LCD_WRITE_DATA(usColor_Foreground);
else
LCD_WRITE_DATA(usColor_Background);
ucTemp >>= 1;
}
}
}
}
/**
* 函数功能: 在 LCD 显示器上显示一串中文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispString_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
while(*pstr != '\0')
{
if(font==USB_FONT_16)
{
if((usX+16)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr+=2;
usX+=16;
}
else
{
if((usX+24)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr+=2;
usX+=24;
}
}
}
/**
* 函数功能: 在 LCD 显示器上显示一串中英文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispString_EN_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
while(*pstr != '\0')
{
if(*pstr<=0x7f)
{
if(font==USB_FONT_16)
{
if((usX+8)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr++;
usX+=8;
}
else
{
if((usX+12)>LCD_DEFAULT_WIDTH)
{
usX=0;
usY+=24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr++;
usX+=12;
}
}
else
{
if(font==USB_FONT_16)
{
if((usX+16)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr+=2;
usX+=16;
}
else
{
if((usX+24)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr+=2;
usX+=24;
}
}
}
}