//**********************************************************************************************
//* 文 件 名 : font.c
//*
//* 文件描述 : 英文+汉字显示, 汉字字库从SD卡文件中读取
//*
//* 作 者 : knight
//* 版 本 : V0.01
//* 编 译 器 : IAR EWARM 5.30
//* 日 期 : 2009-10-18
//* 所需支持代码: tft, sd_mmc_spi, partition, fat16
//**********************************************************************************************
#include "font.h"
#include "chardot.h"
_Font Font;
_Page Page;
u8 isHZKOpened=False;
/**********************************************************************
* 函数 ShowOneHZ --- 显示一个汉字
* 输入参数 X,Y --- 汉字左上角坐标
* CnASCII_H,CnASCII_L --- 汉字的ASCII
* isTransparent ---背景是否透明
* 输出参数 无
* 返回值 True,False
**********************************************************************/
u8
ShowOneHZ(s16 X,s16 Y,u8 CnASCII_H,u8 CnASCII_L,u8 isTransparent)
{
s32 Offset;
u16 i,j;
u16 ByteOfHZ,Cnt;
u8 HZBuf[72];
//USART_SendBuffer(USART1,"----OpenFile(Font.Name)\r\n",MaxBufLen);
if (isHZKOpened==False)
{
if ( !OpenFile(Font.Name) )
{
return False;
}
isHZKOpened=True;
}
ByteOfHZ=(Font.Width * Font.Height)/8;
if ( (CnASCII_H > 0xA0) && (CnASCII_H > 0xA0) )
{
///USART_SendBuffer(USART1,"----Fat16_Seek_File(Offset)\r\n",MaxBufLen);
Offset = ByteOfHZ * ( (CnASCII_H - 0xA1)*94 + (CnASCII_L - 0xA1) );
Fat16_Seek_File(FileData, &Offset, FAT16_SEEK_SET);
///USART_SendBuffer(USART1,"----Fat16_Read_File(HZBuf,ByteOfHZ)\r\n",MaxBufLen);
Cnt=Fat16_Read_File(FileData, HZBuf, ByteOfHZ);
if (Cnt!=ByteOfHZ)
{
return False;
}
///USART_SendBuffer(USART1,"----Print HZ\r\n",MaxBufLen);
SetWindowRange(0,0,TFTScreenWidth,TFTScreenHeight);
SetWindowRange(X,Y,Font.Width,Font.Height);
tftWriteCmd(0x22);
for (i=0;i {
for (j=0;j {
if ( ( HZBuf[i] & (0x80>>j) ) != 0 )
{
tftWriteData16(Font.FColor.H,Font.FColor.L);
}
else
{
if(!isTransparent)
{
tftWriteData16(Font.BColor.H,Font.BColor.L);
}
else
{;}
}
}
}
}
return True;
}
/**********************************************************************
* 函数 tftShowStr --- 显示字符串
* 输入参数 Row,Col --- 起始 行和列
* str --- 需要显示的字符串
* isTransparent ---背景是否透明
* 输出参数 无
* 返回值 实际显示的字符串个数
**********************************************************************/
u8
tftShowStr(u8 Row,u8 Col, u8* str,u16 buflen,u8 isTransparent)
{
u8 Cnt=0;
u8 i,j;
s16 pX,pY;
u8 CnASCII_H,CnASCII_L;
isHZKOpened=False;
if (!OpenDir("/FONT")) return 0;
pX=Col * Page.ColWidth + Page.XOffset;
pY=Row * Page.RowHeight + Page.YOffset;
while( (*str!=0 || buflen {
if (*str > 0xA0)
{
///====================================
/// 显示汉字、字符等全角字符
///====================================
CnASCII_H=*str;
str++;
Cnt++;
if (*str>0xA0)
{
if (!isTransparent)
{
SetWindowRange(0,0,TFTScreenWidth,TFTScreenHeight);
SetWindowRange(pX,pY,Page.ColWidth,Page.RowHeight);
ClrTFT( Font.BColor.H, Font.BColor.L, (Page.ColWidth * Page.RowHeight) );
}
CnASCII_L=*str;
ShowOneHZ(pX,pY,CnASCII_H,CnASCII_L,isTransparent);
str++;
Cnt++;
pX+=Page.ColWidth;
if ( pX > (TFTScreenWidth - Font.Width) )
{
pX = Page.XOffset;
pY += Page.RowHeight;
}
}
}
else
{
///====================================
/// 显示数字、字母、符号等半角字符
///====================================
if (!isTransparent)
{
SetWindowRange(0,0,TFTScreenWidth,TFTScreenHeight);
SetWindowRange(pX,pY,(Page.ColWidth+1)/2,Page.RowHeight);
ClrTFT( Font.BColor.H, Font.BColor.L, ((Page.ColWidth+1)/2*Page.RowHeight) );
}
SetWindowRange(pX,pY,8,16);
tftWriteCmd(0x22);
for (i=0;i {
CnASCII_L=CharDot[((*str)-0x20)*16 + i];
for(j=0;j {
if ( ( CnASCII_L & (0x80>>j) ) != 0 )
{
tftWriteData16(Font.FColor.H,Font.FColor.L);
}
else
{
if(!isTransparent)
{
tftWriteData16(Font.BColor.H,Font.BColor.L);
}
else
{;}
}
}
}
str++;
Cnt++;
pX+= (Page.ColWidth+1) / 2;
if ( pX > (TFTScreenWidth - (Font.Width+1)/2) )
{
pX = Page.XOffset;
pY += Page.RowHeight;
}
}
}
CloseFile();
isHZKOpened=False;
return Cnt;
}
/**********************************************************************
* 函数 Font_Test --- 测试汉字
* 输入参数 无
* 输出参数 无
* 返回值 无
**********************************************************************/
void
Font_Test(void)
{
BufCopy_8(Font.Name,"HZK16",6);
Font.Width=16;
Font.Height=16;
Font.FColor.H=0xf8;
Font.FColor.L=0x00;
Font.BColor.H=0x00;
Font.BColor.L=0x00;
Page.XOffset=4;
Page.YOffset=1;
Page.RowHeight=17;
Page.ColWidth=16;
tftShowStr(0,2,
"我是一只小小小小(So small)鸟,想要飞呀飞却飞也飞不高,我寻寻觅觅寻寻觅觅一个温暖的怀抱,这样的要求算不算太高",
MaxBufLen,
False);
}