“【教程】中英文显示取模设置”的版本间的差异

来自LCD wiki
跳转至: 导航搜索
单个英文字符取模
Lin讨论 | 贡献
单个英文字符取模
第79行: 第79行:
  
 
:函数定义如下:
 
:函数定义如下:
 +
{{code|1=
 +
static void LCD_Show_0806_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
 +
{
 +
    u8 temp;
 +
    u8 pos,t;
 +
    u16 colortemp=POINT_COLOR;       
 +
    num=num-' ';//得到偏移后的值
 +
    LCD_SetWindows(x,y,x+6-1,y+8-1);//设置单个文字显示窗口
 +
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
 +
    {
 +
        for(pos=0;pos<8;pos++)
 +
{
 +
    temp = asc2_0806[num][pos];//调用0806字体,需要自己取模定义
 +
    for(t=0;t<6;t++)
 +
            {               
 +
        if(temp&0x80)
 +
        {
 +
    Lcd_WriteData_16Bit(fc);
 +
}
 +
else
 +
{
 +
    Lcd_WriteData_16Bit(bc);
 +
}
 +
temp<<=1;
 +
    }
 +
 +
}
 +
    }
 +
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
 +
    {
 +
for(pos=0;pos<8;pos++)
 +
{
 +
    temp = asc2_0806[num][pos];//调用0806字体,需要自己取模定义
 +
    for(t=0;t<6;t++)
 +
            { 
 +
POINT_COLOR=fc;             
 +
if(temp&0x80)
 +
{
 +
    LCD_DrawPoint(x+t,y+pos);//画一个点   
 +
}
 +
temp<<=1;
 +
    }
 +
}
 +
    }
 +
    POINT_COLOR=colortemp;
 +
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏     
 +
<nowiki>}</nowiki>
 +
}}
  
 
*'''6x12字体取模说明'''
 
*'''6x12字体取模说明'''
 
:尺寸设置如下图所示:
 
:尺寸设置如下图所示:
 +
  
 
:函数定义如下:
 
:函数定义如下:
 +
{{code|1=
 +
static void LCD_Show_1206_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
 +
{
 +
    u8 temp;
 +
    u8 pos,t;
 +
    u16 colortemp=POINT_COLOR;       
 +
    num=num-' ';//得到偏移后的值
 +
    LCD_SetWindows(x,y,x+6-1,y+12-1);//设置单个文字显示窗口
 +
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
 +
    {
 +
        for(pos=0;pos<12;pos++)
 +
{
 +
    temp = asc2_1206[num][pos];//调用1206字体,需要自己取模定义
 +
    for(t=0;t<6;t++)
 +
            {               
 +
if(temp&0x80)
 +
{
 +
    Lcd_WriteData_16Bit(fc);
 +
}
 +
else
 +
{
 +
    Lcd_WriteData_16Bit(bc);
 +
}
 +
temp<<=1;
 +
    }
 +
 +
}
 +
    }
 +
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
 +
    {
 +
for(pos=0;pos<12;pos++)
 +
{
 +
    temp = asc2_1206[num][pos];//调用1206字体,需要自己取模定义
 +
    for(t=0;t<6;t++)
 +
    { 
 +
POINT_COLOR=fc;             
 +
if(temp&0x80)
 +
{
 +
    LCD_DrawPoint(x+t,y+pos);//画一个点   
 +
}
 +
temp<<=1;
 +
    }
 +
}
 +
    }
 +
    POINT_COLOR=colortemp;
 +
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏         
 +
<nowiki>}</nowiki>
 +
}}
  
 
*'''8x16字体取模说明'''
 
*'''8x16字体取模说明'''
第89行: 第186行:
  
 
:函数定义如下:
 
:函数定义如下:
 +
{{code|1=
 +
static void LCD_Show_1608_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
 +
{
 +
    u8 temp;
 +
    u8 pos,t;
 +
    u16 colortemp=POINT_COLOR;       
 +
    num=num-' ';//得到偏移后的值
 +
    LCD_SetWindows(x,y,x+8-1,y+16-1);//设置单个文字显示窗口
 +
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
 +
    {
 +
for(pos=0;pos<16;pos++)
 +
{
 +
    temp = asc2_1608[num][pos];//调用1608字体,需要自己取模定义
 +
    for(t=0;t<8;t++)
 +
            {               
 +
if(temp&0x80)
 +
        {
 +
    Lcd_WriteData_16Bit(fc);
 +
}
 +
else
 +
{
 +
    Lcd_WriteData_16Bit(bc);
 +
}
 +
temp<<=1;
 +
    }
 +
}
 +
    }
 +
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
 +
    {
 +
for(pos=0;pos<16;pos++)
 +
{
 +
    temp = asc2_1608[num][pos];//调用1608字体,需要自己取模定义
 +
    for(t=0;t<8;t++)
 +
    { 
 +
POINT_COLOR=fc;             
 +
if(temp&0x80)
 +
{
 +
    LCD_DrawPoint(x+t,y+pos);//画一个点   
 +
}
 +
temp<<=1;
 +
    }
 +
}
 +
    }
 +
    POINT_COLOR=colortemp;
 +
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏         
 +
<nowiki>}</nowiki>
 +
}}
  
 
*'''12x24字体取模说明'''
 
*'''12x24字体取模说明'''
第94行: 第238行:
  
 
:函数定义如下:
 
:函数定义如下:
 +
{{code|1=
 +
static void LCD_Show_2412_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
 +
{
 +
    u16 temp;
 +
    u8 pos,t;
 +
    u16 colortemp=POINT_COLOR;       
 +
    num=num-' ';//得到偏移后的值
 +
    LCD_SetWindows(x,y,x+12-1,y+24-1);//设置单个文字显示窗口
 +
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
 +
    {
 +
for(pos=0;pos<24;pos++)
 +
{
 +
    temp = (asc2_2412[num][pos*2]<<8)<nowiki>|</nowiki>asc2_2412[num][pos*2+1];//调用2412字体,需要自己取模定义
 +
    for(t=0;t<12;t++)
 +
    {               
 +
        if(temp&0x8000)
 +
{
 +
    Lcd_WriteData_16Bit(fc);
 +
}
 +
else
 +
{
 +
    Lcd_WriteData_16Bit(bc);
 +
}
 +
temp<<=1;
 +
    }
 +
}
 +
    }
 +
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
 +
    {
 +
for(pos=0;pos<24;pos++)
 +
        {
 +
    temp = (asc2_2412[num][pos*2]<<8)<nowiki>|</nowiki>asc2_2412[num][pos*2+1];//调用2412字体,需要自己取模定义
 +
    for(t=0;t<12;t++)
 +
    { 
 +
POINT_COLOR=fc;             
 +
if(temp&0x8000)
 +
{
 +
    LCD_DrawPoint(x+t,y+pos);//画一个点   
 +
}
 +
temp<<=1;
 +
    }
 +
        }
 +
    }
 +
    POINT_COLOR=colortemp;
 +
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏       
 +
<nowiki>}</nowiki>
 +
}}
  
 
*'''16x32字体取模说明'''
 
*'''16x32字体取模说明'''
第100行: 第291行:
 
:函数定义如下:
 
:函数定义如下:
 
{{code|1=
 
{{code|1=
void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
+
static void LCD_Show_3216_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
+
{
  u8 temp;
+
    u16 temp;
  u8 pos,t;
+
    u8 pos,t;
  u16 colortemp=POINT_COLOR;  
+
    u16 colortemp=POINT_COLOR;      
  num=num-' ';//得到偏移后的值
+
    num=num-' ';//得到偏移后的值
  LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
+
    LCD_SetWindows(x,y,x+16-1,y+32-1);//设置单个文字显示窗口
  if(!mode) //非叠加方式
+
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
  {
+
    {
      for(pos=0;pos<size;pos++)
+
for(pos=0;pos<32;pos++)
      {
+
{
  if(size==12)
+
    temp = (asc2_3216[num][pos*2]<<8)<nowiki>|</nowiki>asc2_3216[num][pos*2+1];//调用3216字体,需要自己取模定义
          {
+
    for(t=0;t<16;t++)
              temp=asc2_1206[num][pos];//调用1206字体
+
    {                 
  }
+
if(temp&0x8000)
          else
+
{
          {
+
    Lcd_WriteData_16Bit(fc);
              temp=asc2_1608[num][pos]; //调用1608字体
+
}
          }
+
else  
  for(t=0;t<size/2;t++)
+
{
          {                 
+
    Lcd_WriteData_16Bit(bc);  
              if(temp&(0x80>>t))
+
}
              {
+
temp<<=1;
                Lcd_WriteData_16Bit(fc);
+
    }
              }  
+
      else
+
}
              {  
+
    }
                Lcd_WriteData_16Bit(bc);  
+
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
      }
+
    {
          }
+
        for(pos=0;pos<32;pos++)
      }
+
{
  }
+
    temp = (asc2_3216[num][pos*2]<<8)<nowiki>|</nowiki>asc2_3216[num][pos*2+1];//调用3216字体,需要自己取模定义
  else//叠加方式
+
    for(t=0;t<16;t++)
  {
+
    {   
      for(pos=0;pos<size;pos++)
+
POINT_COLOR=fc;               
      {
+
if(temp&(0x8000))
  if(size==12)
+
{
          {
+
    LCD_DrawPoint(x+t,y+pos);//画一个点  
              temp=asc2_1206[num][pos];// 调用1206字体
+
}
  }
+
temp<<=1;
          else
+
    }
          {
+
}
              temp=asc2_1608[num][pos]; //调用1608字体
+
    }
  }
+
    POINT_COLOR=colortemp;
  for(t=0;t<size/2;t++)
+
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏      
          {   
 
      POINT_COLOR=fc;               
 
      if(temp&(0x80>>t))
 
              {
 
                LCD_DrawPoint(x+t,y+pos);//画一个点  
 
      }
 
          }
 
      }
 
  }
 
  POINT_COLOR=colortemp;
 
  LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏    
 
 
<nowiki>}</nowiki>
 
<nowiki>}</nowiki>
 
}}
 
}}
 
#等待
 
此函数包含了12x6和16x8两种英文字体设置。
 
 
包含了两种显示模式:叠加模式和非叠加模式。
 
 
叠加模式:字体不带背景色,直接叠加显示到原来显示的内容上
 
 
非叠加模式:字体带有背景色,显示时会将原来显示的内容覆盖掉
 
  
 
== <font color="blue">单个中文汉字取模</font> ==
 
== <font color="blue">单个中文汉字取模</font> ==

2019年1月14日 (一) 16:06的版本

取模软件配置

测试示例所用的字体取模软件为PCtoLCD2002,关于它的详细使用说明见如下文档:

PCtoLCD2002使用说明

PCtoLCD2002软件具体设置如下:

  • 字体和尺寸选择

MSP130W-002.jpg

模式需要选择字符模式
字体可以根据需求选择,比如选择宋体
字宽和字高可以根据需求选择,中英文常用的字体尺寸如下:
中文(字宽x字高):16x16、24x24、32x32
英文(字库x字高):6x8、6x12、8x16、12x24、16x32(对应的字体尺寸需要分别设置为12x8、12x12、16x16、24x24、32x32)
修改点阵大小可以根据需求设置,一般设置为0
  • 字模选项设置
字模选项设置有多种情况,不同的设置,代码处理方法不一样。这里就选取下面的设置为例,后续的函数代码都是基于此设置编写。

MSP130W-001.jpg

点阵格式选择阴码
取模方式选择逐行式
取模走向选择顺向(高位在前)
输出数制选择十六进制数
自定义格式选择C51格式
其他按默认设置

底层支撑函数

  • LCD_SetWindows
该函数实现因驱动IC而异(不同的驱动IC设置坐标值命令和原理有差异),但是原理基本一样,都是设置起始坐标和结束坐标,设置一块显示区域
举例如下(ILI9341为例)
void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
{	
	LCD_WR_REG(lcddev.setxcmd);	
	LCD_WR_DATA(xStar>>8);
	LCD_WR_DATA(0x00FF&xStar);		
	LCD_WR_DATA(xEnd>>8);
	LCD_WR_DATA(0x00FF&xEnd);

	LCD_WR_REG(lcddev.setycmd);	
	LCD_WR_DATA(yStar>>8);
	LCD_WR_DATA(0x00FF&yStar);		
	LCD_WR_DATA(yEnd>>8);
	LCD_WR_DATA(0x00FF&yEnd);

	LCD_WriteRAM_Prepare();	//开始写入GRAM		
}
  • Lcd_WriteData_16Bit
该函数就是往GRAM里面设置像素颜色值,然后显示出来
举例如下(ILI9341为例)
void Lcd_WriteData_16Bit(u16 Data)
{	
      LCD_CS_CLR;
      LCD_RS_SET;  
      SPI_WriteByte(SPI2,Data>>8);
      SPI_WriteByte(SPI2,Data);
      LCD_CS_SET;
}
  • LCD_DrawPoint
其实就是利用LCD_SetWindows函数和Lcd_WriteData_16Bit函数显示一个像素点
举例如下(ILI9341为例)
void LCD_DrawPoint(u16 x,u16 y)
{
	LCD_SetCursor(x,y);//设置光标位置 
	Lcd_WriteData_16Bit(POINT_COLOR); 
}

单个英文字符取模

  • 6x8字体取模说明
尺寸设置如下图所示:
函数定义如下:
static void LCD_Show_0806_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
    u8 temp;
    u8 pos,t;
    u16 colortemp=POINT_COLOR;      		   
    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+6-1,y+8-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
    {		
        for(pos=0;pos<8;pos++)
	{
	    temp = asc2_0806[num][pos];//调用0806字体,需要自己取模定义
	    for(t=0;t<6;t++)
            {                 
	        if(temp&0x80)
	        {
		    Lcd_WriteData_16Bit(fc);
		}
		else 
		{
		    Lcd_WriteData_16Bit(bc); 
		}
		temp<<=1;
	    }
			
	}	
    }
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
    {
	for(pos=0;pos<8;pos++)
	{
	    temp = asc2_0806[num][pos];//调用0806字体,需要自己取模定义
	    for(t=0;t<6;t++)
            {   
		POINT_COLOR=fc;              
		if(temp&0x80)
		{
		    LCD_DrawPoint(x+t,y+pos);//画一个点    
		}
		temp<<=1;
	    }
	}
    }
    POINT_COLOR=colortemp;	
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏     	   
}
  • 6x12字体取模说明
尺寸设置如下图所示:


函数定义如下:
static void LCD_Show_1206_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
    u8 temp;
    u8 pos,t;
    u16 colortemp=POINT_COLOR;      		   
    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+6-1,y+12-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
    {		
        for(pos=0;pos<12;pos++)
	{
	    temp = asc2_1206[num][pos];//调用1206字体,需要自己取模定义
	    for(t=0;t<6;t++)
            {                 
		if(temp&0x80)
		{
		    Lcd_WriteData_16Bit(fc);
		}
		else 
		{
		    Lcd_WriteData_16Bit(bc); 
		}
		temp<<=1;
	    }
			
	}	
    }
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
    {
	for(pos=0;pos<12;pos++)
	{
	    temp = asc2_1206[num][pos];//调用1206字体,需要自己取模定义
	    for(t=0;t<6;t++)
	    {   
		POINT_COLOR=fc;              
		if(temp&0x80)
		{
		    LCD_DrawPoint(x+t,y+pos);//画一个点    
		}
		temp<<=1;
	    }
	}
    }
    POINT_COLOR=colortemp;	
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏         	   
}
  • 8x16字体取模说明
尺寸设置如下图所示:
函数定义如下:
static void LCD_Show_1608_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
    u8 temp;
    u8 pos,t;
    u16 colortemp=POINT_COLOR;      		   
    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+8-1,y+16-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
    {		
	for(pos=0;pos<16;pos++)
	{
	    temp = asc2_1608[num][pos];//调用1608字体,需要自己取模定义
	    for(t=0;t<8;t++)
            {                 
		if(temp&0x80)
	        {
		    Lcd_WriteData_16Bit(fc);
		}
		else 
		{
		    Lcd_WriteData_16Bit(bc); 
		}
		temp<<=1;
	    }
	}	
    }
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
    {
	for(pos=0;pos<16;pos++)
	{
	    temp = asc2_1608[num][pos];//调用1608字体,需要自己取模定义
	    for(t=0;t<8;t++)
	    {   
		POINT_COLOR=fc;              
		if(temp&0x80)
		{
		    LCD_DrawPoint(x+t,y+pos);//画一个点    
		}
		temp<<=1;
	    }
	}
    }
    POINT_COLOR=colortemp;	
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏         	   
}
  • 12x24字体取模说明
尺寸设置如下图所示:
函数定义如下:
static void LCD_Show_2412_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
    u16 temp;
    u8 pos,t;
    u16 colortemp=POINT_COLOR;      		   
    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+12-1,y+24-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
    {		
	for(pos=0;pos<24;pos++)
	{
	    temp = (asc2_2412[num][pos*2]<<8)|asc2_2412[num][pos*2+1];//调用2412字体,需要自己取模定义
	    for(t=0;t<12;t++)
	    {                 
	        if(temp&0x8000)
		{
		    Lcd_WriteData_16Bit(fc);
		}
		else 
		{
		    Lcd_WriteData_16Bit(bc); 
		}
		temp<<=1;
	    }
	}	
    }
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
    {
	for(pos=0;pos<24;pos++)
        {
	    temp = (asc2_2412[num][pos*2]<<8)|asc2_2412[num][pos*2+1];//调用2412字体,需要自己取模定义
	    for(t=0;t<12;t++)
	    {   
		POINT_COLOR=fc;              
		if(temp&0x8000)
		{
		    LCD_DrawPoint(x+t,y+pos);//画一个点    
		}
		temp<<=1;
	    }
        }
    }
    POINT_COLOR=colortemp;	
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏       	   
}
  • 16x32字体取模说明
尺寸设置如下图所示:
函数定义如下:
static void LCD_Show_3216_char(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 mode)
{
    u16 temp;
    u8 pos,t;
    u16 colortemp=POINT_COLOR;      		   
    num=num-' ';//得到偏移后的值
    LCD_SetWindows(x,y,x+16-1,y+32-1);//设置单个文字显示窗口
    if(!mode) //非叠加方式:字体带有背景色,显示时会将原来显示的内容覆盖掉
    {		
	for(pos=0;pos<32;pos++)
	{
	    temp = (asc2_3216[num][pos*2]<<8)|asc2_3216[num][pos*2+1];//调用3216字体,需要自己取模定义
	    for(t=0;t<16;t++)
	    {                 
		if(temp&0x8000)
		{
		    Lcd_WriteData_16Bit(fc);
		}
		else 
		{
		    Lcd_WriteData_16Bit(bc); 
		}
		temp<<=1;
	    }
			
	}	
    }
    else//叠加方式:字体不带背景色,直接叠加显示到原来显示的内容上
    {
        for(pos=0;pos<32;pos++)
	{
	    temp = (asc2_3216[num][pos*2]<<8)|asc2_3216[num][pos*2+1];//调用3216字体,需要自己取模定义
	    for(t=0;t<16;t++)
	    {   
		POINT_COLOR=fc;              
		if(temp&(0x8000))
		{
		    LCD_DrawPoint(x+t,y+pos);//画一个点    
		}
		temp<<=1;
	    }
	}
    }
    POINT_COLOR=colortemp;	
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏      	   
}

单个中文汉字取模

A、16x16中文字体显示函数定义如下:

void GUI_DrawFont16(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
   u8 i,j;
   u16 k;
   u16 HZnum;
   u16 x0=x;
   HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);	//自动统计汉字数目
   for (k=0;k<HZnum;k++) 
   {
       if((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
       { 	
           LCD_SetWindows(x,y,x+16-1,y+16-1);
	   for(i=0;i<16*2;i++)
           {
		for(j=0;j<8;j++)
		{	
		     if(!mode) //非叠加方式
		     {
			  if(tfont16[k].Msk[i]&(0x80>>j))
                          {	
                               Lcd_WriteData_16Bit(fc);
                          }			  
                          else 
                          {
                               Lcd_WriteData_16Bit(bc);
			  }
		     }
		     else
		     {
			  POINT_COLOR=fc;
			  if(tfont16[k].Msk[i]&(0x80>>j))						
                          {
                               LCD_DrawPoint(x,y);//画一个点
			  }
			  x++;
			  if((x-x0)==16)
			  {
			       x=x0;
			       y++;
			       break;
			  }
		     }
	        }
	    }
	 }				  	
	 continue;  //找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
    }
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏 
}

B、24x24中文字体显示函数定义如下:

void GUI_DrawFont24(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
    u8 i,j;
    u16 k;
    u16 HZnum;
    u16 x0=x;
    HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);	//自动统计汉字数目
    for (k=0;k<HZnum;k++) 
    {
        if((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
        { 	
             LCD_SetWindows(x,y,x+24-1,y+24-1);
	     for(i=0;i<24*3;i++)
	     {
		  for(j=0;j<8;j++)
		  {
			if(!mode) //非叠加方式
			{
                              if(tfont24[k].Msk[i]&(0x80>>j))
                              {	 
                                   Lcd_WriteData_16Bit(fc);
			      }						
                              else 
                              {
                                   Lcd_WriteData_16Bit(bc);
			      }					
                        }
		        else
		        {
			      POINT_COLOR=fc;
			      if(tfont24[k].Msk[i]&(0x80>>j))
                              { 
                                   LCD_DrawPoint(x,y);// 画一个点
			      }					
                              x++;
			      if((x-x0)==24)
			      {
				   x=x0;
				   y++;
				   break;
			      }
		         }
		   }
	      }
	 }				  	
	 continue;  //找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
    }
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);// 恢复窗口为全屏
}

C、32x32中文字体显示函数定义如下:

void GUI_DrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
    u8 i,j;
    u16 k;
    u16 HZnum;
    u16 x0=x;
    HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);	//自动统计汉字数目
    for (k=0;k<HZnum;k++) 
    {
	 if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
	 { 	
               LCD_SetWindows(x,y,x+32-1,y+32-1);
	       for(i=0;i<32*4;i++)
	       {
		     for(j=0;j<8;j++)
	             {
			   if(!mode) //非叠加方式
			   {
				if(tfont32[k].Msk[i]&(0x80>>j))
                                {
				      Lcd_WriteData_16Bit(fc);
                                }				
				else 
                                {
                                      Lcd_WriteData_16Bit(bc);
				}			
                           }
			   else
			   {
				POINT_COLOR=fc;
			        if(tfont32[k].Msk[i]&(0x80>>j))
                                {
                                      LCD_DrawPoint(x,y);// 画一个点
				}		
		                x++;
				if((x-x0)==32)
				{
				      x=x0;
				      y++;
				      break;
				}
			   }
		      }
		}
	  }				  	
	  continue;  //找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
     }
     LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);// 恢复窗口为全屏
}

以上三个函数分别是对16x16、24x24、32x32汉字进行显示设置。

包含了两种显示模式:叠加模式和非叠加模式。

叠加模式:字体不带背景色,直接叠加显示到原来显示的内容上

非叠加模式:字体带有背景色,显示时会将原来显示的内容覆盖掉

BACK TO TOP