More actions
Line 74: | Line 74: | ||
}} | }} | ||
== English modulo == | == Single English character modulo == | ||
*'''6x8 English font modulo description''' | |||
:The size settings are as shown below: | |||
:[[File:Module-001.jpg|750px]] | |||
:The function is defined as follows: | |||
{{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-' ';//Get the offset value | |||
LCD_SetWindows(x,y,x+6-1,y+8-1);//Set a single text display window | |||
if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display | |||
{ | |||
for(pos=0;pos<8;pos++) | |||
{ | |||
temp = asc2_0806[num][pos];//Call 0806 font, you need to take the model definition | |||
for(t=0;t<6;t++) | |||
{ | |||
if(temp&0x80) | |||
{ | |||
Lcd_WriteData_16Bit(fc); | |||
} | |||
else | |||
{ | |||
Lcd_WriteData_16Bit(bc); | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | |||
{ | |||
for(pos=0;pos<8;pos++) | |||
{ | |||
temp = asc2_0806[num][pos];//Call 0806 font, you need to take the model definition | |||
for(t=0;t<6;t++) | |||
{ | |||
POINT_COLOR=fc; | |||
if(temp&0x80) | |||
{ | |||
LCD_DrawPoint(x+t,y+pos);//Draw a point | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
POINT_COLOR=colortemp; | |||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen | |||
<nowiki>}</nowiki> | |||
}} | |||
The function is defined as follows: | *'''6x12 English font modulo description''' | ||
:The size settings are as shown below: | |||
:[[File:Module-002.jpg|750px]] | |||
:The function is defined as follows: | |||
{{code|1= | {{code|1= | ||
void | 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-' ';//Get the offset value | |||
LCD_SetWindows(x,y,x+6-1,y+12-1);//Set a single text display window | |||
if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display | |||
{ | |||
for(pos=0;pos<12;pos++) | |||
{ | |||
temp = asc2_1206[num][pos];//Call 1206 font, you need to take the model definition | |||
for(t=0;t<6;t++) | |||
{ | |||
if(temp&0x80) | |||
{ | |||
Lcd_WriteData_16Bit(fc); | |||
} | |||
else | |||
{ | |||
Lcd_WriteData_16Bit(bc); | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | |||
{ | |||
for(pos=0;pos<12;pos++) | |||
{ | |||
temp = asc2_1206[num][pos];//Call 1206 font, you need to take the model definition | |||
for(t=0;t<6;t++) | |||
{ | |||
POINT_COLOR=fc; | |||
if(temp&0x80) | |||
{ | |||
LCD_DrawPoint(x+t,y+pos);//Draw a point | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
POINT_COLOR=colortemp; | |||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen | |||
<nowiki>}</nowiki> | |||
} | |||
}} | }} | ||
*'''8x16 English font modulo description''' | |||
:The size settings are as shown below: | |||
:[[File:Module-003.jpg|750px]] | |||
:The function is defined as follows: | |||
{{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-' ';//Get the offset value | |||
LCD_SetWindows(x,y,x+8-1,y+16-1);//Set a single text display window | |||
if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display | |||
{ | |||
for(pos=0;pos<16;pos++) | |||
{ | |||
temp = asc2_1608[num][pos];//Call 1608 font, you need to take the model definition | |||
for(t=0;t<8;t++) | |||
{ | |||
if(temp&0x80) | |||
{ | |||
Lcd_WriteData_16Bit(fc); | |||
} | |||
else | |||
{ | |||
Lcd_WriteData_16Bit(bc); | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | |||
{ | |||
for(pos=0;pos<16;pos++) | |||
{ | |||
temp = asc2_1608[num][pos];//Call 1608 font, you need to take the model definition | |||
for(t=0;t<8;t++) | |||
{ | |||
POINT_COLOR=fc; | |||
if(temp&0x80) | |||
{ | |||
LCD_DrawPoint(x+t,y+pos);//Draw a point | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
POINT_COLOR=colortemp; | |||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen | |||
<nowiki>}</nowiki> | |||
}} | |||
*'''12x24 English font modulo description''' | |||
:The size settings are as shown below: | |||
:[[File:Module-004.jpg|750px]] | |||
:The function is defined as follows: | |||
{{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-' ';//Get the offset value | |||
LCD_SetWindows(x,y,x+12-1,y+24-1);//Set a single text display window | |||
if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display | |||
{ | |||
for(pos=0;pos<24;pos++) | |||
{ | |||
temp = (asc2_2412[num][pos*2]<<8)<nowiki>|</nowiki>asc2_2412[num][pos*2+1];//Call 2412 font, you need to take the model definition | |||
for(t=0;t<12;t++) | |||
{ | |||
if(temp&0x8000) | |||
{ | |||
Lcd_WriteData_16Bit(fc); | |||
} | |||
else | |||
{ | |||
Lcd_WriteData_16Bit(bc); | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | |||
{ | |||
for(pos=0;pos<24;pos++) | |||
{ | |||
temp = (asc2_2412[num][pos*2]<<8)<nowiki>|</nowiki>asc2_2412[num][pos*2+1];//Call 2412 font, you need to take the model definition | |||
for(t=0;t<12;t++) | |||
{ | |||
POINT_COLOR=fc; | |||
if(temp&0x8000) | |||
{ | |||
LCD_DrawPoint(x+t,y+pos);//Draw a point | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
POINT_COLOR=colortemp; | |||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen | |||
<nowiki>}</nowiki> | |||
}} | |||
Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | *'''16x32 English font modulo description''' | ||
:The size settings are as shown below: | |||
:[[File:Module-005.jpg|750px]] | |||
:The function is defined as follows: | |||
{{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-' ';//Get the offset value | |||
LCD_SetWindows(x,y,x+16-1,y+32-1);//Set a single text display window | |||
if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display | |||
{ | |||
for(pos=0;pos<32;pos++) | |||
{ | |||
temp = (asc2_3216[num][pos*2]<<8)<nowiki>|</nowiki>asc2_3216[num][pos*2+1];//Call 3216 font, you need to take the model definition | |||
for(t=0;t<16;t++) | |||
{ | |||
if(temp&0x8000) | |||
{ | |||
Lcd_WriteData_16Bit(fc); | |||
} | |||
else | |||
{ | |||
Lcd_WriteData_16Bit(bc); | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content | |||
{ | |||
for(pos=0;pos<32;pos++) | |||
{ | |||
temp = (asc2_3216[num][pos*2]<<8)<nowiki>|</nowiki>asc2_3216[num][pos*2+1];//Call 3216 font, you need to take the model definition | |||
for(t=0;t<16;t++) | |||
{ | |||
POINT_COLOR=fc; | |||
if(temp&(0x8000)) | |||
{ | |||
LCD_DrawPoint(x+t,y+pos);//Draw a point | |||
} | |||
temp<<=1; | |||
} | |||
} | |||
} | |||
POINT_COLOR=colortemp; | |||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen | |||
<nowiki>}</nowiki> | |||
}} | |||
== Chinese modulo == | == Chinese modulo == |
Revision as of 18:07, 14 January 2019
Molding software configuration
The font modulo software used in the test example is PCtoLCD2002. For detailed instructions on its use, see the following document:
PCtoLCD2002 Instructions for use
The PCtoLCD2002 software is specifically set as follows:
- Font and size selection
- Mode needs to select字符模式
- Fonts can be selected according to needs, such as selection宋体
- The word width and word height can be selected according to the needs. The font sizes commonly used in Chinese and English are as follows:
- Chinese (word width x word height):16x16、24x24、32x32
- English (character x word height):6x8、6x12、8x16、12x24、16x32(The corresponding font size needs to be set to respectively12x8、12x12、16x16、24x24、32x32)
- Modify the dot matrix size can be set according to requirements, generally set to0
- Font option setting
- There are many situations in the font option setting. Different settings and different code processing methods.
- Here is an example of the following settings, the subsequent function code is written based on this setting.
- Dot matrix format select 阴码
- Modal mode select 逐行式
- Molding trend select 顺向(高位在前)
- Output number system select 十六进制数
- Custom format select C51格式
Bottom support function
- LCD_SetWindows
- The function implementation differs depending on the driver IC (different drive ICs set coordinate values with different commands and principles),
- but the principle is basically the same, setting the start and end coordinates and setting a display area.
- Examples are as follows (ILI9341 as an example)
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(); //Start writing to GRAM }
- Lcd_WriteData_16Bit
- This function is to set the pixel color value into GRAM, and then display it
- Examples are as follows (ILI9341 as an example)
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
- In fact, the LCD_SetWindows function and the Lcd_WriteData_16Bit function are used to display a pixel.
- Examples are as follows (ILI9341 as an example)
void LCD_DrawPoint(u16 x,u16 y) { LCD_SetCursor(x,y);//Set the cursor position Lcd_WriteData_16Bit(POINT_COLOR); }
Single English character modulo
- 6x8 English font modulo description
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-' ';//Get the offset value LCD_SetWindows(x,y,x+6-1,y+8-1);//Set a single text display window if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display { for(pos=0;pos<8;pos++) { temp = asc2_0806[num][pos];//Call 0806 font, you need to take the model definition for(t=0;t<6;t++) { if(temp&0x80) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } temp<<=1; } } } else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content { for(pos=0;pos<8;pos++) { temp = asc2_0806[num][pos];//Call 0806 font, you need to take the model definition for(t=0;t<6;t++) { POINT_COLOR=fc; if(temp&0x80) { LCD_DrawPoint(x+t,y+pos);//Draw a point } temp<<=1; } } } POINT_COLOR=colortemp; LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
- 6x12 English font modulo description
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-' ';//Get the offset value LCD_SetWindows(x,y,x+6-1,y+12-1);//Set a single text display window if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display { for(pos=0;pos<12;pos++) { temp = asc2_1206[num][pos];//Call 1206 font, you need to take the model definition for(t=0;t<6;t++) { if(temp&0x80) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } temp<<=1; } } } else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content { for(pos=0;pos<12;pos++) { temp = asc2_1206[num][pos];//Call 1206 font, you need to take the model definition for(t=0;t<6;t++) { POINT_COLOR=fc; if(temp&0x80) { LCD_DrawPoint(x+t,y+pos);//Draw a point } temp<<=1; } } } POINT_COLOR=colortemp; LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
- 8x16 English font modulo description
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-' ';//Get the offset value LCD_SetWindows(x,y,x+8-1,y+16-1);//Set a single text display window if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display { for(pos=0;pos<16;pos++) { temp = asc2_1608[num][pos];//Call 1608 font, you need to take the model definition for(t=0;t<8;t++) { if(temp&0x80) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } temp<<=1; } } } else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content { for(pos=0;pos<16;pos++) { temp = asc2_1608[num][pos];//Call 1608 font, you need to take the model definition for(t=0;t<8;t++) { POINT_COLOR=fc; if(temp&0x80) { LCD_DrawPoint(x+t,y+pos);//Draw a point } temp<<=1; } } } POINT_COLOR=colortemp; LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
- 12x24 English font modulo description
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-' ';//Get the offset value LCD_SetWindows(x,y,x+12-1,y+24-1);//Set a single text display window if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display { for(pos=0;pos<24;pos++) { temp = (asc2_2412[num][pos*2]<<8)|asc2_2412[num][pos*2+1];//Call 2412 font, you need to take the model definition for(t=0;t<12;t++) { if(temp&0x8000) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } temp<<=1; } } } else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content { for(pos=0;pos<24;pos++) { temp = (asc2_2412[num][pos*2]<<8)|asc2_2412[num][pos*2+1];//Call 2412 font, you need to take the model definition for(t=0;t<12;t++) { POINT_COLOR=fc; if(temp&0x8000) { LCD_DrawPoint(x+t,y+pos);//Draw a point } temp<<=1; } } } POINT_COLOR=colortemp; LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
- 16x32 English font modulo description
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-' ';//Get the offset value LCD_SetWindows(x,y,x+16-1,y+32-1);//Set a single text display window if(!mode) //Non-overlay mode: The font has a background color, which will overwrite the original display { for(pos=0;pos<32;pos++) { temp = (asc2_3216[num][pos*2]<<8)|asc2_3216[num][pos*2+1];//Call 3216 font, you need to take the model definition for(t=0;t<16;t++) { if(temp&0x8000) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } temp<<=1; } } } else//Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content { for(pos=0;pos<32;pos++) { temp = (asc2_3216[num][pos*2]<<8)|asc2_3216[num][pos*2+1];//Call 3216 font, you need to take the model definition for(t=0;t<16;t++) { POINT_COLOR=fc; if(temp&(0x8000)) { LCD_DrawPoint(x+t,y+pos);//Draw a point } temp<<=1; } } } POINT_COLOR=colortemp; LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
Chinese modulo
A. 16x16 Chinese font display function is defined as follows:
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); //Automatic statistics of the number of Chinese characters 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) //Non-superimposed way { if(tfont16[k].Msk[i]&(0x80>>j)) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } } else //Superposition method { POINT_COLOR=fc; if(tfont16[k].Msk[i]&(0x80>>j)) { LCD_DrawPoint(x,y);//Draw a point } x++; if((x-x0)==16) { x=x0; y++; break; } } } } } continue; //Find the corresponding dot matrix font to exit immediately, to prevent the impact of multiple Chinese characters repeated modulo } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen }
B. 24x24 Chinese font display function is defined as follows:
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); //Automatic statistics of the number of Chinese characters 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) //Non-superimposed way { if(tfont24[k].Msk[i]&(0x80>>j)) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } } else //Superposition method { POINT_COLOR=fc; if(tfont24[k].Msk[i]&(0x80>>j)) { LCD_DrawPoint(x,y);// Draw a point } x++; if((x-x0)==24) { x=x0; y++; break; } } } } } continue; //Find the corresponding dot matrix font to exit immediately, to prevent the impact of multiple Chinese characters repeated modulo } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);// Restore window to full screen }
C. 32x32Chinese font display function is defined as follows:
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); //Automatic statistics of the number of Chinese characters 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) //Non-superimposed way { if(tfont32[k].Msk[i]&(0x80>>j)) { Lcd_WriteData_16Bit(fc); } else { Lcd_WriteData_16Bit(bc); } } else //Superposition method { POINT_COLOR=fc; if(tfont32[k].Msk[i]&(0x80>>j)) { LCD_DrawPoint(x,y);// Draw a point } x++; if((x-x0)==32) { x=x0; y++; break; } } } } } continue; //Find the corresponding dot matrix font to exit immediately, to prevent the impact of multiple Chinese characters repeated modulo } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);// Restore window to full screen }
The above three functions are display settings for 16x16, 24x24, 32x32 Chinese characters.
Two display modes are included: overlay mode and non-overlay mode.
Overlay mode: the font does not have a background color, and is directly superimposed and displayed on the original display content.
Non-overlay mode: The font has a background color, which will overwrite the original display.