字库学习

易木雨字库生成器

软件界面

链接: [link](https://mp.cs字库学习_第1张图片

使用说明
①、编码选择 编码选择是首先确定用户需要哪种字库,常见的编码有英文的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;
        }
           
    }
}

你可能感兴趣的:(STM32)