软件界面
使用说明
①、编码选择 编码选择是首先确定用户需要哪种字库,常见的编码有英文的ASCII,中文GB2312,GBK,GB2312繁体,台湾BIG5编码,日文的Shift_JIS,韩文的HANGUL等,还有法文,德文、罗马文等常见的拉丁文字。
②、字体设置 字体设置是用户对于外观的需求,可以提现产品的个性,不同的编码对于的字体会有不同的显示,如中文常用宋体、仿宋、黑体、雅黑,也可以用比较个性的字体如各种手写字体等等。
③、位置大小 由于应用不同,所需的单个字符大小也会有相应的区别,这里就是根据需求确定单个字符的大小,比如1616,2424等等。设置完大小后,则需要根据大小调整字体的大小及横向、纵向偏移位置。使得显示的字符能完整的显示在预览窗内,并且有合适的留白空间。
④、字库格式 软件支持4种字库格式,分别是DZK(同BIN)、C、ASM、BDF(文泉驿),其中C和ASM适用于嵌入到程序中进行编译,DZK则用于Flash或者EEPROM的烧录。BDF则用于Linux系统的字符显示。
⑤、扫描模式 扫描模式共支持8种横向,8种纵向,再加上高位在前及低位在前选项,组合共32种扫描模式,可以满足几乎全部的扫描模式需求。
⑥、其他选项 本选项主要根据汉字的特殊需求,当选项为GB2312和GBK编码时,会出现小字库及去除预留两个选项,小字库为创建个别汉字时适用,去除预留则再GB2312编码时适用,用于减少字库所占空间。
⑦、创建字库 根据前面的各种选项创建指定的字库文件。
注意:第二步中选择字体大小以适应字模空间。
字库取模方式 纵向取模方式二,高位在前,低位在后,实现程序如下:
也可以说是 纵向_先上下后左右,高位在前
或者 逐行式,顺向(高位在前) 字符显示程序如下
//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
u8 temp,t,t1;
u16 y0=y;
u8 dzk[72];
u8 csize=(size/8+((size%8)?1:0))*(size);// 得到1个字符对应的点阵集所占的字节数
if(size!=12&&size!=16&&size!=24)return; //不支持的size
Get_HzMat(font,dzk,size); // 得到相应大小的点阵数据
for(t=0;t<csize;t++)
{
temp=dzk[t]; //得到点阵数据
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}
做小字库 :
易木雨既能做大字库,也能做小字库,只需勾上小字库,勾上C,就可以
保持取模方式不变,纵向_先上下后左右,高位在前
C显示方法如下 :
typedef struct
{
unsigned char Index[2];
char Msk[32];
}typFNT_GBK16;
// -- 自定义汉字字库
typFNT_GBK16 hz16[] = {
"欢",0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,
}
/*************************************************************************************************************
* @fn LCD_ShowStr
*
* @brief 显示一个字符串(可以是中文也可以是英文)
*
* @param x,y - x,y坐标.
* @param fc - 前景色,字体颜色.
* @param bc - 背景色 .
* @param *s - 要显示的汉字
*
* @return none
*/
void LCD_ShowStr(unsigned int x, unsigned int y, unsigned int fc, unsigned int bc, unsigned char *s)
{
unsigned char i,j;
unsigned short k;
unsigned int HZnum;
unsigned char tempchar;
unsigned char bufch[16];
unsigned char tempi;
HZnum=sizeof(hz16)/sizeof(typFNT_GBK16);
while(*s)
{
if((*s) >= 128) //如果是中文
{
for (k=0;k<HZnum;k++)
{
if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
{
Lcd_SetRegion(x,y,x+16-1,y+16-1);
for(i=0;i<16*2;i++)
{
for(j=0;j<8;j++)
{
if(hz16[k].Msk[i]&(0X80>>j))
{
LCD_WriteData_16Bit(fc);
}
else
{
if (fc!=bc) LCD_WriteData_16Bit(bc);
}
}
}
}
}
s += 2;
x += 16;
}
else if((*s) >= 32) //英文
{
tempchar = *s ;
memcpy(bufch,ziku_ASCII8X16[(tempchar-32)],16);
Lcd_SetRegion(x,y,x+8-1,y+16-1);
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
if(bufch[i]&(0x80>>j))
{
LCD_WriteData_16Bit(fc);
}
else
{
if (fc!=bc) LCD_WriteData_16Bit(bc);
}
}
}
s += 1;
x += 8;
}
else
{
if( *s == '\n') //换行
{
x = 0;
y += 16;
}
s += 1;
}
}
}