OpenEdv-开源电子网

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

TFTLCD实验显示汉字函数

[复制链接]

16

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-7-22
在线时间
0 小时
发表于 2014-7-31 14:33:43 | 显示全部楼层 |阅读模式

该函数是在原子例程的实验中直接修改而来的。
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/32
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{          
    u8 temp,t1,t;
 u16 y0=y;
 u16 colortemp=POINT_COLOR;             
 //设置窗口    
 num=num-' ';//得到偏移后的值
 if(!mode) //非叠加方式
 {
     for(t=0;t<size;t++)
     {  
   if(size==12)temp=asc2_1206[num][t];  //调用1206字体
   else if(size==16) temp=asc2_1608[num][t];   //调用1608字体
   else if(size==32)  temp=asc2_1616[num][t];      //调用1616汉字字体                       
         for(t1=0;t1<8;t1++)
   { 
         
          if(temp&0x80)POINT_COLOR=colortemp;
    else POINT_COLOR=BACK_COLOR;
    LCD_DrawPoint(x,y); 
    temp<<=1;
    y++;
    if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
    if(size==32)
    {
     if((y-y0)==16)
     {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
     }
    }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }   
 }else//叠加方式
 {
     for(t=0;t<size;t++)
     {  
   if(size==12)temp=asc2_1206[num][t];  //调用1206字体
   else if(size==16)temp=asc2_1608[num][t];   //调用1608字体
    else if(size==32)  temp=asc2_1616[num][t];                          
         for(t1=0;t1<8;t1++)
   {      
          if(temp&0x80)LCD_DrawPoint(x,y);
    temp<<=1;
    y++;
    if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
    if(size==32)
    {
     if((y-y0)==16)
     {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
     }
    }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }    
 }
 OINT_COLOR=colortemp;             
}
最后是在添加一个数组即可:
const unsigned char asc2_1616[95][32]={ 
{
0x08,0x20,0x06,0x20,0x40,0x7E,0x31,0x80,0x00,0x00,0x49,0x00,0x6A,0xFF,0x5C,0x92
,0x48,0x92,0xFE,0xFE,0x88,0x92,0x9C,0x92,0xAA,0xFF,0x09,0x00,0x01,0x00,0x00,0x00},/*"潘",0*/

};   
调用时如下 LCD_ShowChar(30,160,'0'+1,32,0) ;
即起始坐标为(30,160),显示文字为数组asc2_1616的第一个元素,大小为16*16,非叠加方式。
缺点是每次显示只能显示一个汉字,如需显示其他汉字在 数组asc2_1616添加相应的元素即可。

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

使用道具 举报

16

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-7-22
在线时间
0 小时
 楼主| 发表于 2014-7-31 14:36:32 | 显示全部楼层
修正一下LCD_ShowChar(30,160,'0'+1,32,0) ;应改为
LCD_ShowChar(30,160,'0',32,0) ;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-31 23:23:41 | 显示全部楼层
谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-9-2
在线时间
0 小时
发表于 2015-4-10 10:49:46 | 显示全部楼层
回复【2楼】潘浩锐:
---------------------------------
你好,哥们,我用的是mini32,为何在实验11 TFT液晶显示实验基础上,移植你的代码没有显示出汉字?谢谢
趁着年轻,追逐自己所爱的----单片机&&足球!
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-6-25
在线时间
0 小时
发表于 2015-6-29 10:22:22 | 显示全部楼层
回复【2楼】潘浩锐:
---------------------------------
有问题,不显示字。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

高级会员

Rank: 4

积分
877
金钱
877
注册时间
2015-11-5
在线时间
74 小时
发表于 2015-12-18 19:55:12 | 显示全部楼层
回复【4楼】非洲小男孩:
---------------------------------
LCD_ShowChar(30,160,32,32,0) ;
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-11-17
在线时间
21 小时
发表于 2016-8-24 22:25:31 | 显示全部楼层
我的战舰版,按照楼主程序这么写的LCD_ShowChar(30,160,32+‘0’,32,0) ;
回复 支持 反对

使用道具 举报

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
发表于 2016-8-26 17:11:01 | 显示全部楼层
STM32基础篇 发表于 2015-12-18 19:55
回复【4楼】非洲小男孩:
---------------------------------
LCD_ShowChar(30,160,32,32,0)&nbsp;;

调用的时候括号里第三个数据为什么是32?我要是想改大字体 这个应该对应什么
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-8-26
在线时间
28 小时
发表于 2016-8-27 09:13:39 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2017-3-4 13:15:02 | 显示全部楼层
这个函数的num=num-‘0’去掉之后就可以按照自己的数组的元素位置减1,就可以正常用了。
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2017-3-3
在线时间
18 小时
发表于 2017-3-17 09:57:40 | 显示全部楼层
OINT_COLOR=colortemp;这是啥呀,出现的有点莫名其妙
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-6-28
在线时间
2 小时
发表于 2017-6-28 09:17:02 | 显示全部楼层
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{           
u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;              
//设置窗口     
num=num-' ';//得到偏移后的值,空格的ascii码是0
if(!mode) //非叠加方式
{
    for(t=0;t<size;t++)
    {   
           if(size==12)temp=asc2_1206[num][t];  //调用1206字体
           else if(size==16) temp=asc2_1608[num][t];   //调用1608字体
           else if(size==32)  temp=asc2_1616[num][t];      //调用1616汉字字体                        
     for(t1=0;t1<8;t1++)
                {
      if(temp&0x80)POINT_COLOR=colortemp;
                  else POINT_COLOR=BACK_COLOR;
                  LCD_DrawPoint(x,y);
                  temp<<=1;
                  y++;
                  if(x>=lcddev.width)
                  {
                          POINT_COLOR=colortemp;
                          return;
                  }//超区域了
                if(size==32)
                {
                 if((y-y0)==16)
                 {
                  y=y0;
                  x++;
                  if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
                  break;
                 }
                }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }   
}else//叠加方式
{
     for(t=0;t<size;t++)
     {   
   if(size==12)temp=asc2_1206[num][t];  //调用1206字体
   else if(size==16)temp=asc2_1608[num][t];   //调用1608字体
   else if(size==32)  temp=asc2_1616[num][t];                           
   for(t1=0;t1<8;t1++)
   {      
    if(temp&0x80)LCD_DrawPoint(x,y);
    temp<<=1;
    y++;
    if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
    if(size==32)
    {
     if((y-y0)==16)
     {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
     }
    }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }     
}
        POINT_COLOR=colortemp;              
}
调用时void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{           
u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;              
//设置窗口     
num=num-' ';//得到偏移后的值,空格的ascii码是0
if(!mode) //非叠加方式
{
    for(t=0;t<size;t++)
    {   
           if(size==12)temp=asc2_1206[num][t];  //调用1206字体
           else if(size==16) temp=asc2_1608[num][t];   //调用1608字体
           else if(size==32)  temp=asc2_1616[num][t];      //调用1616汉字字体                        
     for(t1=0;t1<8;t1++)
                {
      if(temp&0x80)POINT_COLOR=colortemp;
                  else POINT_COLOR=BACK_COLOR;
                  LCD_DrawPoint(x,y);
                  temp<<=1;
                  y++;
                  if(x>=lcddev.width)
                  {
                          POINT_COLOR=colortemp;
                          return;
                  }//超区域了
                if(size==32)
                {
                 if((y-y0)==16)
                 {
                  y=y0;
                  x++;
                  if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
                  break;
                 }
                }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }   
}else//叠加方式
{
     for(t=0;t<size;t++)
     {   
   if(size==12)temp=asc2_1206[num][t];  //调用1206字体
   else if(size==16)temp=asc2_1608[num][t];   //调用1608字体
   else if(size==32)  temp=asc2_1616[num][t];                           
   for(t1=0;t1<8;t1++)
   {      
    if(temp&0x80)LCD_DrawPoint(x,y);
    temp<<=1;
    y++;
    if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
    if(size==32)
    {
     if((y-y0)==16)
     {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
     }
    }
    else if((y-y0)==size)
    {
      y=y0;
      x++;
      if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
      break;
    }
   }   
     }     
}
        POINT_COLOR=colortemp;              
}
调用时LCD_ShowChar(30,160,' ',32,0);
实测可以显示“潘”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-6-28
在线时间
2 小时
发表于 2017-6-28 09:19:12 | 显示全部楼层
电子蛋黄酱 发表于 2017-3-17 09:57
OINT_COLOR=colortemp;这是啥呀,出现的有点莫名其妙

掉了个P,
POINT_COLOR=colortemp;
回复 支持 反对

使用道具 举报

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-1-4
在线时间
23 小时
发表于 2017-8-12 15:32:25 | 显示全部楼层
peivie 发表于 2017-6-28 09:19
掉了个P,
POINT_COLOR=colortemp;

实在是佩服啊~
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-7-15
在线时间
7 小时
发表于 2018-8-9 11:35:23 | 显示全部楼层
可以的
回复 支持 反对

使用道具 举报

9

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-7-8
在线时间
181 小时
发表于 2021-10-25 17:29:28 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2020-5-16
在线时间
6 小时
发表于 2022-2-7 18:47:28 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 04:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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