Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Chinese and English display modulo settings: Difference between revisions

From LCD wiki
Lin (talk | contribs)
No edit summary
Lin (talk | contribs)
No edit summary
Line 58: Line 58:
This function is to set the pixel color value into GRAM, and then display it
This function is to set the pixel color value into GRAM, and then display it


举例如下(ILI9341为例)
Examples are as follows (ILI9341 as an example)
{{code|1=
{{code|1=
void Lcd_WriteData_16Bit(u16 Data)
void Lcd_WriteData_16Bit(u16 Data)

Revision as of 10:06, 29 November 2018

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 selection 宋体, the dot size offset is 0

Word width and word height are selected: 12x8, 16x16, 24x24, 32x32 (English corresponds to 6x8, 8x16, 12x24, 16x32)

Dot matrix format select 阴码

Modal mode select 逐行式

Molding trend select 顺向(高位在前)

Output number system select 十六进制数

Custom format select C51格式

Other by default

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); 
}

English modulo

The function is defined as follows:

void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
{  
   u8 temp;
   u8 pos,t;
   u16 colortemp=POINT_COLOR; 
   num=num-' ';//Get the offset value
   LCD_SetWindows(x,y,x+size/2-1,y+size-1);//Set a single text display window
   if(!mode) //Non-superimposed way
   {		
       for(pos=0;pos<size;pos++)
       {
	   if(size==12)
           {
              temp=asc2_1206[num][pos];//Call 1206 font
	   }
           else
           { 
              temp=asc2_1608[num][pos];		 //Call 1608 font
           }
	   for(t=0;t<size/2;t++)
           {                 
              if(temp&(0x80>>t))
              {
                 Lcd_WriteData_16Bit(fc);
              } 
	      else
              { 
                 Lcd_WriteData_16Bit(bc); 
	      }
           }		
       }	
   }
   else//Superposition method
   {
       for(pos=0;pos<size;pos++)
       {
	   if(size==12)
           {
              temp=asc2_1206[num][pos];//Call 1206 font
	   }
           else
           { 
              temp=asc2_1608[num][pos];		 //Call 1608 font
	   }
	   for(t=0;t<size/2;t++)
           {   
	      POINT_COLOR=fc;              
	      if(temp&(0x80>>t))
              {
                 LCD_DrawPoint(x+t,y+pos);//Draw a point  
	      }
           }
       }
   }
   POINT_COLOR=colortemp;	
   LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//Restore window to full screen   	   
}

This function contains two English font settings of 12x6 and 16x8.

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.

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.

BACK TO TOP