无外部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 05:21
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-08-14 06:46
谢谢分享
梦想启动
3楼-- · 2019-08-14 08:51
楼上好牛逼啊
龙胜阳子
4楼-- · 2019-08-14 09:46

 //显示一个汉字-16
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;
        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;
       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;      
}



MODE==1
Show_Str(80,100,200,14,"无8线a无",14,1);


MODE==0
Show_Str(80,100,200,14,"无8线a无",14,0);

 


 

Tardis
5楼-- · 2019-08-14 14:35
= =
你这方法我早在AVR时代用过了,我还以为你说的是不用外部IC和FLASH甚至SD卡,直接根据汉字GBK码,来用算法算出字体的点阵来,然后显示,如果真这么牛×,此贴可以申酷了。
kuanglf
6楼-- · 2019-08-14 16:36
 精彩回答 2  元偷偷看……

一周热门 更多>