|
|
第155行: |
第155行: |
|
| |
|
| *[http://www.lcdwiki.com/zh/16x16_Chinese_font_modulo_description '''16x16中文字体取模说明'''] | | *[http://www.lcdwiki.com/zh/16x16_Chinese_font_modulo_description '''16x16中文字体取模说明'''] |
| *'''16x16中文字体取模说明''' | | *[http://www.lcdwiki.com/zh/24x24_Chinese_font_modulo_description '''24x24中文字体取模说明'''] |
| | | *[http://www.lcdwiki.com/zh/32x32_Chinese_font_modulo_description '''32x32中文字体取模说明'''] |
| :尺寸设置如下图所示:
| |
| :[[File:Module-006.jpg|750px]]
| |
| :取模成功后需要定义以下结构体数组存放取模数据(结构体定义见以上'''[[#中文汉字取模|重要说明]]'''):
| |
| {{code|1=
| |
| const typFNT_GB16 tfont16[]=
| |
| {
| |
| "中",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,
| |
| 0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
| |
| <nowiki>}</nowiki>;
| |
| }}
| |
| | |
| :函数定义如下:
| |
| {{code|1=
| |
| 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);//恢复窗口为全屏
| |
| <nowiki>}</nowiki>
| |
| }}
| |
| | |
| *'''24x24中文字体取模说明'''
| |
| | |
| :尺寸设置如下图所示:
| |
| :[[File:Module-007.jpg|750px]]
| |
| :取模成功后需要定义以下结构体数组存放取模数据(结构体定义见以上'''[[#中文汉字取模|重要说明]]'''):
| |
| {{code|1=
| |
| const typFNT_GB24 tfont24[]=
| |
| {
| |
| "中",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,
| |
| 0x10,0x00,0x10,0x10,0x18,0x1F,0xFF,0xF8,0x18,0x10,0x18,0x18,0x10,0x18,0x18,0x10,
| |
| 0x18,0x18,0x10,0x18,0x18,0x10,0x18,0x18,0x10,0x18,0x1F,0xFF,0xF8,0x10,0x10,0x10,
| |
| 0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x18,0x00,0x00,
| |
| 0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
| |
| <nowiki>}</nowiki>;
| |
| }}
| |
| | |
| :函数定义如下: | |
| {{code|1=
| |
| 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);// 恢复窗口为全屏
| |
| <nowiki>}</nowiki>
| |
| }}
| |
| | |
| *'''32x32中文字体取模说明'''
| |
| | |
| :尺寸设置如下图所示:
| |
| :[[File:Module-008.jpg|750px]]
| |
| :取模成功后需要定义以下结构体数组存放取模数据(结构体定义见以上'''[[#中文汉字取模|重要说明]]'''):
| |
| {{code|1=
| |
| const typFNT_GB32 tfont32[]=
| |
| {
| |
| "中",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x80,0x00,
| |
| 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,
| |
| 0x08,0x01,0x80,0x30,0x0F,0xFF,0xFF,0xF0,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,
| |
| 0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,
| |
| 0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0F,0xFF,0xFF,0xE0,0x0C,0x01,0x80,0x20,
| |
| 0x0C,0x01,0x80,0x20,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,
| |
| 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,
| |
| 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
| |
| <nowiki>}</nowiki>;
| |
| }}
| |
| | |
| :函数定义如下:
| |
| {{code|1=
| |
| 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);// 恢复窗口为全屏
| |
| <nowiki>}</nowiki>
| |
| }}
| |
|
| |
|
| [[#top|BACK TO TOP]] | | [[#top|BACK TO TOP]] |
取模软件配置
测试示例所用的字体取模软件为PCtoLCD2002,关于它的详细使用说明见如下文档:
PCtoLCD2002使用说明
PCtoLCD2002软件具体设置如下:
- 模式需要选择字符模式
- 字体可以根据需求选择,比如选择宋体
- 字宽和字高可以根据需求选择,中英文常用的字体尺寸如下:
- 中文(字宽x字高):16x16、24x24、32x32、48x48
- 英文(字库x字高):6x8、6x12、8x16、12x24、16x32、24x48(对应的字体尺寸需要分别设置为12x8、12x12、16x16、24x24、32x32、48x48)
- 修改点阵大小可以根据需求设置,一般设置为0
- 中文和英文字模选项设置有多种情况,不同的设置,代码处理方法不一样。这里就选取下面的设置为例,后续的函数代码都是基于此设置编写。
- 点阵格式选择阴码
- 取模方式选择逐行式
- 取模走向选择顺向(高位在前)
- 输出数制选择十六进制数
- 自定义格式选择C51格式
底层支撑函数
- 该函数实现因驱动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
}
- 该函数就是往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_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; //结构体名称可以自己定义
- 4、结构体数组定义见以下各个尺寸汉字取模说明;
BACK TO TOP