OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7412|回复: 14

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

[复制链接]

27

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2013-5-12
在线时间
26 小时
发表于 2013-10-6 05:25: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;//下一个汉字偏移    
        }      
    }  
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2013-5-12
在线时间
26 小时
 楼主| 发表于 2013-10-6 05:26:27 | 显示全部楼层
Show_Str(80,80,200,16,"爱你标a站无7线无无无无",16);
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-6 10:55:57 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-10-7
在线时间
1 小时
发表于 2013-10-7 21:16:44 | 显示全部楼层
楼上好牛逼啊
回复 支持 反对

使用道具 举报

27

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2013-5-12
在线时间
26 小时
 楼主| 发表于 2013-10-7 23:42:48 | 显示全部楼层

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

 


 

回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-10-8 08:37:31 | 显示全部楼层
= =
你这方法我早在AVR时代用过了,我还以为你说的是不用外部IC和FLASH甚至SD卡,直接根据汉字GBK码,来用算法算出字体的点阵来,然后显示,如果真这么牛×,此贴可以申酷了。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

8

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2013-9-5
在线时间
31 小时
发表于 2014-4-25 23:16:11 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

3

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-9-2
在线时间
0 小时
发表于 2015-4-9 20:39:39 | 显示全部楼层
回复【2楼】龙胜阳子:
---------------------------------
大神,我最近在做显示汉字,把你的代码添加到ALIENTEK MINISTM32 实验11 TFT液晶显示实验里,怎么不显示?求解,谢谢
趁着年轻,追逐自己所爱的----单片机&&足球!
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-6-22
在线时间
29 小时
发表于 2016-4-11 15:19:28 | 显示全部楼层
怎么直接复制你的代码会报错的,,,main.c(53): error:  #513: a value of type "const char *" cannot be assigned to an entity of type "u16"  
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-5-2
在线时间
11 小时
发表于 2017-5-2 21:59:23 | 显示全部楼层
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;//???????     
        }      
    }   
}

改了下楼主的,不会报错了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-5-2
在线时间
11 小时
发表于 2017-5-2 22:00:41 | 显示全部楼层
字数组跟楼主是一样的,不知道为什么我发出来乱码了
回复 支持 反对

使用道具 举报

4

主题

66

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3329
金钱
3329
注册时间
2016-11-9
在线时间
297 小时
发表于 2017-5-3 00:01:55 | 显示全部楼层
学习了,厉害.....
回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2017-7-24
在线时间
48 小时
发表于 2017-7-27 09:36:40 | 显示全部楼层
赞,先保存
回复 支持 反对

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2017-6-12
在线时间
85 小时
发表于 2017-9-16 17:17:34 | 显示全部楼层
瑞克和莫蒂 发表于 2017-5-2 21:59
struct typFNT_GB16
{
unsigned char Index[2];

  for (k=0;k<70;k++) 为什么循环70啊?
回复 支持 反对

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2017-6-12
在线时间
85 小时
发表于 2017-9-16 17:29:54 | 显示全部楼层
瑞克和莫蒂 发表于 2017-5-2 21:59
struct typFNT_GB16
{
unsigned char Index[2];

取模软件如何设置的啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 02:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表