导航菜单
Toggle navigation
英文主页
树莓派显示模块
树莓派HDMI
树莓派MHS显示屏
树莓派GPIO显示屏
SPI显示模块
常规SPI模块
Arduino SPI模块
全视角SPI模块
Arduino显示模块
Arduino UNO
Arduino Mega2560
其他显示模块
8/16位并口模块
OLED显示模块
RGB显示模块
开发板
显示屏
IPS彩屏
TN彩屏
OLED屏
查看“【教程】中英文显示取模设置”的源代码
←
【教程】中英文显示取模设置
跳转至:
导航
、
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
{{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,关于它的详细使用说明见如下文档: [http://www.lcdwiki.com/res/PublicFile/PCtoLCD2002_Use_Illustration_CN.pdf '''PCtoLCD2002使用说明'''] PCtoLCD2002软件具体设置如下: *'''字体和尺寸选择''' :[[File:MSP130W-002.jpg|750px]] :模式需要选择'''字符模式''' :字体可以根据需求选择,比如选择'''宋体''' :字宽和字高可以根据需求选择,中英文常用的字体尺寸如下: :中文(字宽x字高):'''16x16、24x24、32x32、48x48''' :英文(字库x字高):'''6x8、6x12、8x16、12x24、16x32、24x48('''对应的字体尺寸需要分别设置为'''12x8、12x12、16x16、24x24、32x32、48x48)''' :修改点阵大小可以根据需求设置,一般设置为'''0''' *'''字模选项设置''' :中文和英文字模选项设置有多种情况,不同的设置,代码处理方法不一样。这里就选取下面的设置为例,后续的函数代码都是基于此设置编写。 :[[File:MSP130W-001.jpg|750px]] :点阵格式选择'''阴码''' :取模方式选择'''逐行式''' :取模走向选择'''顺向(高位在前)''' :输出数制选择'''十六进制数''' :自定义格式选择'''C51格式''' == <font color="blue">底层支撑函数</font> == *'''LCD_SetWindows''' :该函数实现因驱动IC而异(不同的驱动IC设置坐标值命令和原理有差异),但是原理基本一样,都是设置起始坐标和结束坐标,设置一块显示区域 :举例如下(ILI9341为例) {{code|1= 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 <nowiki>}</nowiki> }} *'''Lcd_WriteData_16Bit''' :该函数就是往GRAM里面设置像素颜色值,然后显示出来 :举例如下(ILI9341为例) {{code|1= void Lcd_WriteData_16Bit(u16 Data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(SPI2,Data>>8); SPI_WriteByte(SPI2,Data); LCD_CS_SET; <nowiki>}</nowiki> }} *'''LCD_DrawPoint''' :其实就是利用LCD_SetWindows函数和Lcd_WriteData_16Bit函数显示一个像素点 :举例如下(ILI9341为例) {{code|1= void LCD_DrawPoint(u16 x,u16 y) { LCD_SetCursor(x,y);//设置光标位置 Lcd_WriteData_16Bit(POINT_COLOR); <nowiki>}</nowiki> }} == <font color="blue">英文字符取模</font> == *'''[[重要说明]]''' :1、因为在程序里是按照ASCII码偏移量搜索需要显示的英文字符的,所以需要将整套ASCII字符都取模。 :2、'''如果不需要使用某个字符,可以将该字符的取模数据设置为{0}''',如以下例子所示(以6x8尺寸字符为例) {{code|1= 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 ... //此例子省略,实际应用需要添加 <nowiki>}</nowiki> }} :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英文字体取模说明'''] *'''8x16英文字体取模说明''' :尺寸设置如下图所示: :[[File:Module-003.jpg|750px]] :取模数据如下(点击打开): ::[http://www.lcdwiki.com/res/PublicFile/8x16_ASCII_data.txt '''8x16英文ASCII取模数据'''] :函数定义如下: {{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英文字体取模说明''' :尺寸设置如下图所示: :[[File:Module-004.jpg|750px]] :取模数据如下(点击打开): ::[http://www.lcdwiki.com/res/PublicFile/12x24_ASCII_data.txt '''12x24英文ASCII取模数据'''] :函数定义如下: {{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英文字体取模说明''' :尺寸设置如下图所示: :[[File:Module-005.jpg|750px]] :取模数据如下(点击打开): ::[http://www.lcdwiki.com/res/PublicFile/16x32_ASCII_data.txt '''16x32英文ASCII取模数据'''] :函数定义如下: {{code|1= 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)<nowiki>|</nowiki>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)<nowiki>|</nowiki>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);//恢复窗口为全屏 <nowiki>}</nowiki> }} == <font color="blue">中文汉字取模</font> == *'''[[#中文汉字取模|重要说明]]''' :1、显示汉字时,是通过查询需要显示汉字的GBK码来获取取模数据的; :2、汉字取模成功后,通过一个结构体数组来保存汉字GBK码和取模数据的对应关系; :3、结构体定义如下: {{code|1= //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、结构体数组定义见以下各个尺寸汉字取模说明; *'''16x16中文字体取模说明''' :尺寸设置如下图所示: :[[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]]
该页面使用的模板:
模板:Code
(
查看源代码
)
模板:Lan
(
查看源代码
)
返回至
【教程】中英文显示取模设置
。