无外部ICFLASH,不用SD卡显示汉字程序代码分享(汉字内码)

2019-08-14 00:50发布

用了几个小时弄了个小程序,主要用于字数不多但型号字体变化较多的场合
效果如下






 typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       unsigned char Index[2];               // 汉字内码索引
         char Msk[32];                       // 点阵码数据
}; /////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot,逐列取模高位在前,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
const struct typFNT_GB16 codeGB_16[] =          // 数据表
{
"爱", 0x00,0x02,0x02,0x04,0x4D,0x05,0x69,0x09,0x59,0x32,0x49,0xE2,0x6F,0x54,0x59,0x54,
      0xC9,0x48,0x89,0x58,0x99,0x64,0xE9,0x44,0x89,0x02,0x09,0x03,0x0C,0x02,0x00,0x00, "你", 0x01,0x00,0x02,0x00,0x0F,0xFE,0x34,0x00,0xC2,0x08,0x04,0x30,0x19,0xC0,0xF0,0x84,
      0x50,0x02,0x17,0xFC,0x10,0x00,0x11,0x00,0x14,0xC0,0x38,0x38,0x10,0x10,0x00,0x00, "无", 0xFF,0xFD,0xFD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xDF,0xBD,0x3F,0x80,0xFF,
      0xBC,0x03,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xFD,0xF1,0xFF,0xFF, "线", 0xFD,0xFB,0xF9,0xBB,0xE5,0x3B,0x1C,0xB7,0xB9,0xB7,0xFF,0xB7,0xF6,0xFB,0xF6,0xFB,
      0xF6,0xF7,0x00,0x37,0xF6,0xCF,0xB6,0xD7,0xC6,0xBB,0xD6,0xFD,0xFE,0xE0,0xFF,0xFF, "站", 0xF7,0xF7,0xF5,0xF7,0xB6,0x2F,0xC7,0xCF,0xF7,0x2F,0xF0,0xEF,0xF7,0xFF,0xFF,0x01,
      0xFF,0x7B,0xFF,0x7B,0x00,0x7B,0xF7,0x7B,0xF7,0x7B,0xF7,0x01,0xF7,0xFF,0xFF,0xFF, "标", 0xF7,0xDF,0xF7,0x3F,0xF4,0xFF,0x00,0x00,0xF5,0xFF,0xF6,0x6F,0xFB,0xDF,0xBB,0x3F,
      0xBB,0xFD,0xBB,0xFE,0xB8,0x01,0xBB,0xFF,0xBB,0x7F,0xBB,0x9F,0xFB,0xC7,0xFF,0xFF,
};







//显示一个汉字
void LCD_GB1616(u16 x,u16 y,u8 font[2],u8 size) {  
    u8 y0=y;
 u16 tempcolor;
 u8 temp;
    unsigned int i,j,k;     for (k=0;k<70;k++)
    {
     if ((codeGB_16[k].Index[0]==font[0])&&(codeGB_16[k].Index[1]==font[1]))
     {
      for(i=0;i<size*2;i++)
      {
       temp=codeGB_16[k].Msk;
       for(j=0;j<8;j++)
       {
        if(temp&0x80)LCD_DrawPoint(x,y);
     else
     {
   tempcolor=POINT_COLOR;
   POINT_COLOR=BACK_COLOR;
   LCD_DrawPoint(x,y);
         POINT_COLOR=tempcolor;//还原
  }
         temp<<=1;
      y++;
   if((y-y0)==size)
   {
    y=y0;
    x++;
    break;
         }
       }    
      }
     } 
   }   
}    
 void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size)
{     
 u16 x0=x;
 u16 y0=y;           
    u8 bHz=0;     //字符或者中文                       
    while(*str!=0)//数据未结束
    {
        if(!bHz)
        {
         if(*str>0x80)bHz=1;//中文
         else              //字符
         {     
                if(x>(x0+width-size/2))//换行
    {      
     y+=size;
     x=x0;   
    }          
          if(y>(y0+height-size))break;//越界返回     
          if(*str==13)//换行符号
          {        
              y+=size;
     x=x0;
              str++;
          } 
          else LCD_ShowChar(x,y,*str,size,0);//有效部分写入
    str++;
          x+=size/2; //字符,为全字的一半
         }
        }else//中文
        {    
            bHz=0;//有汉字库   
            if(x>(x0+width-size))//换行
   {    
    y+=size;
    x=x0;   
   }
         if(y>(y0+height-size))break;//越界返回            
         LCD_GB1616(x,y,str,size); //显示这个汉字,空心显示
         str+=2;
         x+=size;//下一个汉字偏移    
        }      
    }  
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
非洲小男孩
1楼-- · 2019-08-14 20:29
回复【2楼】龙胜阳子:
---------------------------------
大神,我最近在做显示汉字,把你的代码添加到ALIENTEK MINISTM32 实验11 TFT液晶显示实验里,怎么不显示?求解,谢谢
得了白学症
2楼-- · 2019-08-14 23:06
怎么直接复制你的代码会报错的,,,main.c(53): error:  #513: a value of type "const char *" cannot be assigned to an entity of type "u16"  
瑞克和莫蒂
3楼-- · 2019-08-15 00:48
struct typFNT_GB16
{
unsigned char Index[2];
u8 Msk[32];
};

const struct typFNT_GB16 codeGB_16[] =// ???
{
"°&reg;", 0x00,0x02,0x02,0x04,0x4D,0x05,0x69,0x09,0x59,0x32,0x49,0xE2,0x6F,0x54,0x59,0x54,
0xC9,0x48,0x89,0x58,0x99,0x64,0xE9,0x44,0x89,0x02,0x09,0x03,0x0C,0x02,0x00,0x00,
"&Auml;&atilde;", 0x01,0x00,0x02,0x00,0x0F,0xFE,0x34,0x00,0xC2,0x08,0x04,0x30,0x19,0xC0,0xF0,0x84,
0x50,0x02,0x17,0xFC,0x10,0x00,0x11,0x00,0x14,0xC0,0x38,0x38,0x10,0x10,0x00,0x00,
"&Icirc;&THORN;", 0xFF,0xFD,0xFD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xDF,0xBD,0x3F,0x80,0xFF,
0xBC,0x03,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xBD,0xFD,0xFD,0xF1,0xFF,0xFF,
"&Iuml;&szlig;", 0xFD,0xFB,0xF9,0xBB,0xE5,0x3B,0x1C,0xB7,0xB9,0xB7,0xFF,0xB7,0xF6,0xFB,0xF6,0xFB,
0xF6,0xF7,0x00,0x37,0xF6,0xCF,0xB6,0xD7,0xC6,0xBB,0xD6,0xFD,0xFE,0xE0,0xFF,0xFF,
"&Otilde;&frac34;", 0xF7,0xF7,0xF5,0xF7,0xB6,0x2F,0xC7,0xCF,0xF7,0x2F,0xF0,0xEF,0xF7,0xFF,0xFF,0x01,
0xFF,0x7B,0xFF,0x7B,0x00,0x7B,0xF7,0x7B,0xF7,0x7B,0xF7,0x01,0xF7,0xFF,0xFF,0xFF,
"±ê", 0xF7,0xDF,0xF7,0x3F,0xF4,0xFF,0x00,0x00,0xF5,0xFF,0xF6,0x6F,0xFB,0xDF,0xBB,0x3F,
0xBB,0xFD,0xBB,0xFE,0xB8,0x01,0xBB,0xFF,0xBB,0x7F,0xBB,0x9F,0xFB,0xC7,0xFF,0xFF,
};



void LCD_GB1616(u16 x,u16 y,u8 font[2],u8 size,u8 mode)
{  
u16 y0=y;
u16 tempcolor=POINT_COLOR;
u8 temp;
  unsigned int i,j,k;
   if(mode==0)
   {
   for (k=0;k<70;k++)
   {
    if ((codeGB_16[k].Index[0]==font[0])&&(codeGB_16[k].Index[1]==font[1]))
    {
    for(i=0;i<size*2;i++)
    {
                        temp=codeGB_16[k].Msk[i];
     for(j=0;j<8;j++)
     {
     if((temp&0x80)&&(mode==0)) POINT_COLOR=BACK_COLOR;
  else POINT_COLOR=tempcolor;
   LCD_DrawPoint(x,y);
   POINT_COLOR=tempcolor;
      temp<<=1;
    y++;
  if((y-y0)==size)
  {
   y=y0;
   x++;
   break;
     }
     }   
    }
    }  
   }
   }  
  else
  {
   for (k=0;k<70;k++)
   {
   if ((codeGB_16[k].Index[0]==font[0])&&(codeGB_16[k].Index[1]==font[1]))
   {
   for(i=0;i<size*2;i++)
    {
     temp=codeGB_16[k].Msk[i];
    for(j=0;j<8;j++)
    {
     if((temp&0x80)&&(mode==1)) POINT_COLOR=tempcolor;
else POINT_COLOR=BACK_COLOR;
  LCD_DrawPoint(x,y);
     temp<<=1;
    y++;
  if((y-y0)==size)
  {
   y=y0;
   x++;
   break;
     }
     }   
    }
    }  
   }
   }
   POINT_COLOR=tempcolor;   
}

void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size)
{     
u16 x0=x;
u16 y0=y;            
    u8 bHz=0;     //??????                        
    while(*str!=0)//?????
    {
        if(!bHz)
        {
         if(*str>0x80)bHz=1;//??
         else              //??
         {      
                if(x>(x0+width-size/2))//??
    {      
     y+=size;
     x=x0;   
    }           
          if(y>(y0+height-size))break;//????      
          if(*str==13)//????
          {         
              y+=size;
     x=x0;
              str++;
          }  
          else LCD_ShowChar(x,y,*str,size,0);//??????
    str++;
          x+=size/2; //??,??????
         }
        }else//??
        {     
            bHz=0;//????   
            if(x>(x0+width-size))//??
   {     
    y+=size;
    x=x0;   
   }
         if(y>(y0+height-size))break;//????            
         LCD_GB1616(x,y,str,size,0);//??????,????
         str+=2;
         x+=size;//???????     
        }      
    }   
}

改了下楼主的,不会报错了
瑞克和莫蒂
4楼-- · 2019-08-15 05:58
字数组跟楼主是一样的,不知道为什么我发出来乱码了
小胡子DIY
5楼-- · 2019-08-15 11:30
 精彩回答 2  元偷偷看……
随风的风
6楼-- · 2019-08-15 13:48
赞,先保存

一周热门 更多>