打开/关闭菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

【教程】中英文显示取模设置:修订间差异

来自LCD wiki
Lin留言 | 贡献
Lin留言 | 贡献
无编辑摘要
 
(未显示2个用户的76个中间版本)
第1行: 第1行:
== 取模软件配置 ==
{{lan
    |
cn=http://www.lcdwiki.com/zh/%E3%80%90%E6%95%99%E7%A8%8B%E3%80%91%E4%B8%AD%E8%8B%B1%E6%96%87%E6%98%BE%E7%A4%BA%E5%8F%96%E6%A8%A1%E8%AE%BE%E7%BD%AE
    |
en=http://www.lcdwiki.com/Chinese_and_English_display_modulo_settings
}}
 
 
== <font color="blue">取模软件配置</font> ==
测试示例所用的字体取模软件为PCtoLCD2002,关于它的详细使用说明见如下文档:
测试示例所用的字体取模软件为PCtoLCD2002,关于它的详细使用说明见如下文档:


第6行: 第14行:
PCtoLCD2002软件具体设置如下:
PCtoLCD2002软件具体设置如下:


字体选择'''''',点阵大小偏移量为'''0'''
*'''体和尺寸选择'''
 
字宽字高分别选择:'''12x8、16x16、24x24、32x32'''(英文分别对应为'''6x8、8x16、12x24、16x32''')
 
[[File:MSP130W-001.jpg|750px]]
 
点阵格式选择'''阴码'''
 
取模方式选择'''逐行式'''
 
取模走向'''选择顺向(高位在前)'''


输出数制选择'''十六进制数'''
:[[File:MSP130W-002.jpg|750px]]
:模式需要选择'''字符模式'''
:字体可以根据需求选择,比如选择'''宋体''' 
:字宽和字高可以根据需求选择,中英文常用的字体尺寸如下:
:中文(字宽x字高):'''16x16、24x24、32x32、48x48'''
:英文(字库x字高):'''6x8、6x12、8x16、12x24、16x32、24x48('''对应的字体尺寸需要分别设置为'''12x8、12x12、16x16、24x24、32x32、48x48)'''
:修改点阵大小可以根据需求设置,一般设置为'''0'''


自定义格式选择'''C51格式'''
*'''字模选项设置'''


其他按默认设置
:中文和英文字模选项设置有多种情况,不同的设置,代码处理方法不一样。这里就选取下面的设置为例,后续的函数代码都是基于此设置编写。
:[[File:MSP130W-001.jpg|750px]]
:点阵格式选择'''阴码'''
:取模方式选择'''逐行式'''
:取模走向选择'''顺向(高位在前)'''
:输出数制选择'''十六进制数'''
:自定义格式选择'''C51格式'''


[[File:MSP130W-002.jpg|750px]]
== <font color="blue">底层支撑函数</font> ==


== 底层支撑函数 ==
*'''LCD_SetWindows'''
'''*LCD_SetWindows'''


该函数实现因驱动IC而异(不同的驱动IC设置坐标值命令和原理有差异),但是原理基本一样,都是设置起始坐标和结束坐标,设置一块显示区域
:该函数实现因驱动IC而异(不同的驱动IC设置坐标值命令和原理有差异),但是原理基本一样,都是设置起始坐标和结束坐标,设置一块显示区域
 
:举例如下(ILI9341为例)
举例如下(ILI9341为例)
{{code|1=
{{code|1=
void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
第52行: 第60行:
}}
}}


'''*Lcd_WriteData_16Bit'''
*'''Lcd_WriteData_16Bit'''
 
该函数就是往GRAM里面设置像素颜色值,然后显示出来


举例如下(ILI9341为例)
:该函数就是往GRAM里面设置像素颜色值,然后显示出来
:举例如下(ILI9341为例)
{{code|1=
{{code|1=
void Lcd_WriteData_16Bit(u16 Data)
void Lcd_WriteData_16Bit(u16 Data)
第68行: 第75行:
}}
}}


'''*LCD_DrawPoint'''
*'''LCD_DrawPoint'''
 
其实就是利用LCD_SetWindows函数和Lcd_WriteData_16Bit函数显示一个像素点


举例如下(ILI9341为例)
:其实就是利用LCD_SetWindows函数和Lcd_WriteData_16Bit函数显示一个像素点
:举例如下(ILI9341为例)
{{code|1=
{{code|1=
void LCD_DrawPoint(u16 x,u16 y)
void LCD_DrawPoint(u16 x,u16 y)
第81行: 第87行:
}}
}}


== 英文取模 ==
== <font color="blue">英文字符取模</font> ==


定义如下
*'''[[#英文字符取模|重要说明]]'''
 
:1、因为在程序里是按照ASCII码偏移量搜索需要显示的英文字符的,所以需要将整套ASCII字符都取模。
:2、'''如果不需要使用某个字符,可以将该字符的取模据设置为{0}''',例子所示(以6x8尺寸字符为例)
{{code|1=
{{code|1=
void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
const unsigned char asc2_0806[95][8]={
{
   ...  //此例子省略,实际应用需要添加
   u8 temp;
{0},/*"2",18*/ 不使用数字2
  u8 pos,t;
{0x00,0x00,0x78,0xB0,0x08,0x88,0x70,0x00},/*"3",19*/
  u16 colortemp=POINT_COLOR;
{0x00,0x00,0x30,0x50,0x90,0x78,0x10,0x00},/*"4",20*/
  num=num-' ';//得到偏移后的值
{0},/*"5",21*/ 不使用数字5
  LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
{0x00,0x00,0x70,0x80,0xF8,0x88,0x70,0x00},/*"6",22*/
  if(!mode) //非叠加方式
{0},/*"7",23*/ 不使用数字7
  {
{0x00,0x00,0xF8,0x88,0x70,0x88,0x78,0x00},/*"8",24*/
      for(pos=0;pos<size;pos++)
{0},/*"9",25*/ 不使用数字9
      {
   ..//此例子省略,实际应用需要添加
  if(size==12)
 
          {
              temp=asc2_1206[num][pos];//调用1206字体
  }
          else
          {
              temp=asc2_1608[num][pos]; //调用1608字体
          }
  for(t=0;t<size/2;t++)
          {                
              if(temp&(0x80>>t))
              {
                Lcd_WriteData_16Bit(fc);
              }  
      else
              {
                Lcd_WriteData_16Bit(bc);
      }
          }
      }
  }
  else//叠加方式
  {
      for(pos=0;pos<size;pos++)
      {
  if(size==12)
          {
              temp=asc2_1206[num][pos];// 调用1206字体
  }
          else
          {
              temp=asc2_1608[num][pos]; //调用1608字体
  }
  for(t=0;t<size/2;t++)
          { 
      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两种英文字体设置。
:3、ASCII码字符如下所示(最前面的空格也要包含):
::ASCII字符: '''!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'''
:4、英文取模说明的数据字体都为'''Default'''
 
*'''各尺寸英文字体取模说明'''


包含了两种显示式:叠加式和非叠加式。
:*[http://www.lcdwiki.com/zh/6x8_English_font_modulo_description '''6x8英文字体取说明''']
:*[http://www.lcdwiki.com/zh/6x12_English_font_modulo_description '''6x12英文字体取说明''']
:*[http://www.lcdwiki.com/zh/8x16_English_font_modulo_description '''8x16英文字体取说明''']
:*[http://www.lcdwiki.com/zh/12x24_English_font_modulo_description '''12x24英文字体取模说明''']
:*[http://www.lcdwiki.com/zh/16x32_English_font_modulo_description '''16x32英文字体取模说明''']
:*[http://www.lcdwiki.com/zh/24x48_English_font_modulo_description '''24x48英文字体取模说明''']
:*[http://www.lcdwiki.com/zh/32x64_English_font_modulo_description '''32x64英文字体取模说明''']
:*[http://www.lcdwiki.com/zh/48x96_English_font_modulo_description '''48x96英文字体取模说明''']
:*[http://www.lcdwiki.com/zh/64x128_English_font_modulo_description '''64x128英文字体取模说明''']


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


非叠加式:字体带有背景色,显示时会将原来显示的内容覆盖掉
== <font color="blue">中文汉字取</font> ==


== 中文取模 ==
*'''[[#中文汉字取模|重要说明]]'''
'''A、16x16中文显示数定义如下:'''
 
:1、显示汉时,是通过查询需要显示汉字的GBK码来获取取模数据的;
:2、汉字取模成功后,通过一个结构体组来保存汉字GBK码和取模数据的对应关系;
:3、结构体定义如下:
{{code|1=
{{code|1=
void GUI_DrawFont16(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
//16x16中文字体结构体定义
typedef struct
{
      unsigned char Index[2]; //存放汉字GBK码
      char Msk[32]; //存放汉字取模数据
}typFNT_GB16;  //结构体名称可以自己定义
 
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//24x24中文字体结构体定义
typedef struct
{
{
  u8 i,j;
       unsigned char Index[2]; //存放汉字GBK码
  u16 k;
      char Msk[72]; //存放汉字取模数据
  u16 HZnum;
}typFNT_GB24; //结构体名称可以自己定义
  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);//恢复窗口为全屏
<nowiki>}</nowiki>
}}


'''B、24x24中文字体显示函数定义如下:'''
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
{{code|1=
//32x32中文字体结构体定义
void GUI_DrawFont24(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
typedef struct
{
{
    u8 i,j;
      unsigned char Index[2]; //存放汉字GBK码
    u16 k;
      char Msk[128]; //存放汉字取模数据
    u16 HZnum;
}typFNT_GB32; //结构体名称可以自己定义
    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);// 恢复窗口为全屏
<nowiki>}</nowiki>
}}


'''C、32x32中文字体显示函数定义如下:'''
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
{{code|1=
//48x48中文字体结构体定义
void GUI_DrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
typedef struct
{
{
    u8 i,j;
      unsigned char Index[2]; //存放汉字GBK码
    u16 k;
      char Msk[288]; //存放汉字取模数据
    u16 HZnum;
}typFNT_GB48; //结构体名称可以自己定义
    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);// 恢复窗口为全屏
<nowiki>}</nowiki>
}}
}}


以上三个函数分别是对16x16、24x24、32x32汉字进行显示设置。
*'''各尺寸汉字说明'''
 
包含了两种显示式:叠加模式和非叠加模式。


叠加式:字体不带背景色,直接叠加显示到原来显示的内容上
:*[http://www.lcdwiki.com/zh/16x16_Chinese_font_modulo_description '''16x16中文字体取说明''']
:*[http://www.lcdwiki.com/zh/24x24_Chinese_font_modulo_description '''24x24中文字体取模说明''']
:*[http://www.lcdwiki.com/zh/32x32_Chinese_font_modulo_description '''32x32中文字体取模说明''']
:*[http://www.lcdwiki.com/zh/48x48_Chinese_font_modulo_description '''48x48中文字体取模说明''']


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


[[#top|BACK TO TOP]]
[[#top|BACK TO TOP]]

2023年6月12日 (一) 11:53的最新版本

语言选择

Languages

➤中文
➤EN



取模软件配置

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

PCtoLCD2002使用说明

PCtoLCD2002软件具体设置如下:

  • 字体和尺寸选择
模式需要选择字符模式
字体可以根据需求选择,比如选择宋体
字宽和字高可以根据需求选择,中英文常用的字体尺寸如下:
中文(字宽x字高):16x16、24x24、32x32、48x48
英文(字库x字高):6x8、6x12、8x16、12x24、16x32、24x48(对应的字体尺寸需要分别设置为12x8、12x12、16x16、24x24、32x32、48x48)
修改点阵大小可以根据需求设置,一般设置为0
  • 字模选项设置
中文和英文字模选项设置有多种情况,不同的设置,代码处理方法不一样。这里就选取下面的设置为例,后续的函数代码都是基于此设置编写。
点阵格式选择阴码
取模方式选择逐行式
取模走向选择顺向(高位在前)
输出数制选择十六进制数
自定义格式选择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); 
}

英文字符取模

1、因为在程序里是按照ASCII码偏移量搜索需要显示的英文字符的,所以需要将整套ASCII字符都取模。
2、如果不需要使用某个字符,可以将该字符的取模数据设置为{0},如以下例子所示(以6x8尺寸字符为例)
const unsigned char asc2_0806[95][8]={
   ...  //此例子省略,实际应用需要添加
{0},/*"2",18*/ 不使用数字2
{0x00,0x00,0x78,0xB0,0x08,0x88,0x70,0x00},/*"3",19*/
{0x00,0x00,0x30,0x50,0x90,0x78,0x10,0x00},/*"4",20*/
{0},/*"5",21*/ 不使用数字5
{0x00,0x00,0x70,0x80,0xF8,0x88,0x70,0x00},/*"6",22*/
{0},/*"7",23*/ 不使用数字7
{0x00,0x00,0xF8,0x88,0x70,0x88,0x78,0x00},/*"8",24*/
{0},/*"9",25*/ 不使用数字9
   ...  //此例子省略,实际应用需要添加

}
3、ASCII码字符如下所示(最前面的空格也要包含):
ASCII字符: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
4、英文取模说明的数据字体都为Default
  • 各尺寸英文字体取模说明


中文汉字取模

1、显示汉字时,是通过查询需要显示汉字的GBK码来获取取模数据的;
2、汉字取模成功后,通过一个结构体数组来保存汉字GBK码和取模数据的对应关系;
3、结构体定义如下:
//16x16中文字体结构体定义
typedef struct 
{
       unsigned char Index[2];	//存放汉字GBK码
       char Msk[32]; //存放汉字取模数据
}typFNT_GB16;  //结构体名称可以自己定义

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//24x24中文字体结构体定义
typedef struct 
{
       unsigned char Index[2];	//存放汉字GBK码
       char Msk[72]; //存放汉字取模数据
}typFNT_GB24;  //结构体名称可以自己定义

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//32x32中文字体结构体定义
typedef struct 
{
       unsigned char Index[2];	//存放汉字GBK码
       char Msk[128]; //存放汉字取模数据
}typFNT_GB32;  //结构体名称可以自己定义

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//48x48中文字体结构体定义
typedef struct 
{
       unsigned char Index[2];	//存放汉字GBK码
       char Msk[288]; //存放汉字取模数据
}typFNT_GB48; //结构体名称可以自己定义
  • 各尺寸汉字取模说明

数字变量显示

BACK TO TOP