OpenEdv-开源电子网

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

还是在TFT彩屏上显示大尺寸字符的问题

[复制链接]

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
发表于 2018-2-11 11:23:28 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 rjx007 于 2018-2-13 13:16 编辑

用原子提供的字符显示函数,可以显示到32*16,48*24。但弄到64*32的就是显示不出来了,搞了几天都不行,字模是自己取的,48*24也是自己取的,就可以正常显示。
请高手指点。



//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{                                                            
    u8 temp,t1,t;
        u16 y0=y;
        u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数        
         num=num-' ';    //得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
        for(t=0;t<csize;t++)
        {   
                if(size==12)     temp=ascii_1206[num][t];                //调用1206字体
                else if(size==16)temp=ascii_1608[num][t];               //调用1608字体
                else if(size==24)temp=ascii_2412[num][t];               //调用2412字体
                else if(size==48)temp=ascii_4824[num][t];              //可以正常显示
                else if(size==64)temp=ascii_6432[num][t];              //没有显示,不知为什么?
                else return;                                                        //没有的字库
                for(t1=0;t1<8;t1++)
                {                           
                        if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,FRONT_COLOR);
                        else if(mode==0)LCD_DrawFRONT_COLOR(x,y,BACK_COLOR);
                        temp<<=1;
                        y++;
                        if(y>=tftlcd_data.height)return;                //超区域了
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                if(x>=tftlcd_data.width)return;        //超区域了
                                break;
                        }
                }           
        }                                            
}   





最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

4

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2017-1-18
在线时间
80 小时
发表于 2018-2-12 13:41:59 | 显示全部楼层
tftlcd_data.height和tftlcd_data.width定义的对吗?
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-2-12 14:23:27 | 显示全部楼层
应该是对的,
方向.png
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-12 21:12:31 | 显示全部楼层
单步跟踪一下,看个究竟!
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 21:54:34 | 显示全部楼层
好的,在你的诱惑之下,我也好奇地打算试一下。
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 21:59:47 | 显示全部楼层
第一步,取模。

取模数据.zip

6.29 KB, 下载次数: 131

回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 22:19:09 | 显示全部楼层
第二步,简单修改现有程序,遭遇问题。
数字出现了若干的,可能是变量溢出。
而且图形很乱,可能是取模方向有误。


TIM截图20180212221728.png
TIM截图20180212221736.png


回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 22:24:05 | 显示全部楼层
a496298685 发表于 2018-2-12 22:19
第二步,简单修改现有程序,遭遇问题。
数字出现了若干的,可能是变量溢出。
而且图形很乱,可能是取模方 ...

第三步,将数据类型调大之后,不再出现若干数字, TIM截图20180212222347.png
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 22:28:42 | 显示全部楼层
a496298685 发表于 2018-2-12 22:24
第三步,将数据类型调大之后,不再出现若干数字,

第四步,研读原程序,发现原程序采用的是逐行取模(我用的逐列)
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 22:39:46 | 显示全部楼层
a496298685 发表于 2018-2-12 22:28
第四步,研读原程序,发现原程序采用的是逐行取模(我用的逐列)

第五步,重新取模。
正常显示,但是,迷之。。。我想显示的是66666

TIM截图20180212223834.png

可能原因,取模时候多取了一个字符的东西
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-12 22:51:54 | 显示全部楼层
a496298685 发表于 2018-2-12 22:39
第五步,重新取模。
正常显示,但是,迷之。。。我想显示的是66666

第六步,已经解决。

原因:码表的提取使用了Python,在反斜杠的处理中出现异常。

TIM截图20180212225035.png

楼主该你了。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-2-13 10:50:55 | 显示全部楼层
请问楼上是如何修改程序的?
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-13 12:47:47 | 显示全部楼层
rjx007 发表于 2018-2-13 10:50
请问楼上是如何修改程序的?

我直接修改的。我修改的源程序和你的不一样,我怎么讲给你听??

那么该我问你了。

你修改程序之后,为何运行不了,是出了什么问题呢,贴图看看。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-2-13 13:19:26 | 显示全部楼层
本帖最后由 rjx007 于 2018-2-13 13:24 编辑

我是用的如下的程序,弄到32x16,48x24的字符都可以,但64x32的就不行了,屏上没有任何反应,我也不知道该修改什么地方。

//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{                                                            
    u8 temp,t1,t;
        u16 y0=y;
        u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数        
         num=num-' ';    //得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
        for(t=0;t<csize;t++)
        {   
                if(size==12)        temp=ascii_1206[num][t];                //调用1206字体
                else if(size==16)  temp=ascii_1608[num][t];               //调用1608字体
                else if(size==24)  temp=ascii_2412[num][t];               //调用2412字体
                else if(size==48)  temp=ascii_4824[num][t];              //可以正常显示
                else if(size==64)  temp=ascii_6432[num][t];              //没有显示,不知为什么?
                else return;                                                        //没有的字库
                for(t1=0;t1<8;t1++)
                {                           
                        if(temp&0x80)     LCD_DrawFRONT_COLOR(x,y,FRONT_COLOR);
                        else if(mode==0) LCD_DrawFRONT_COLOR(x,y,BACK_COLOR);
                        temp<<=1;
                        y++;
                        if(y>=tftlcd_data.height)return;                //超区域了
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                if(x>=tftlcd_data.width)return;        //超区域了
                                break;
                        }
                }           
        }                                            
}   

回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-16 01:28:47 | 显示全部楼层

那么应该显示错乱而非没有显示。
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2018-2-17 09:56:29 | 显示全部楼层
本帖最后由 rjx007 于 2018-2-17 10:05 编辑

感谢原子老板的指点,将u8 csize 改为u16 csize就可以了。
但又出现了一个新问题:只想显示一个字符,却出现了一行字符,不得其解。后将代码做如下修改后即正常显示了。
以下代码中红色的是新增加的语句。

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{                                                            
        u8 temp,t1,t;
        u16 y0=y;
        u16 x0=x;  //保存初置的x坐标
        u16 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数        
         num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
        for(t=0;t<csize;t++)
        {   
                if(size==12)     temp=ascii_1206[num][t];                  //调用1206字体
                else if(size==16)temp=ascii_1608[num][t];        //调用1608字体
                else if(size==24)temp=ascii_2412[num][t];        //调用2412字体
                else if(size==48)temp=ascii_4824[num][t];        //调用4824字体
                else if(size==64)temp=ascii_6432[num][t];        //调用6432字体
                else return;                                                  //没有的字库,返回
                for(t1=0;t1<8;t1++)
                {                           
                        if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,FRONT_COLOR);
                        else if(mode==0)LCD_DrawFRONT_COLOR(x,y,BACK_COLOR);
                        temp<<=1;
                        y++;
                        if(y>=tftlcd_data.height)return;                //超区域了
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                               if(x>=(x0+32))return;  //将x坐标限制为一个字符的宽度。
                                if(x>=tftlcd_data.width)return;        //超区域了
                                
                                break;
                        }
                }           
        }                                            
}   
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2012-2-15
在线时间
9 小时
发表于 2019-4-16 18:53:51 | 显示全部楼层
你好,请问楼主,你这超过4k的ROM 字符集数组是如何设定的啊?我定义个大的数组 ascii_4824数组得有95*72大了,编译器不通过
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-9-15
在线时间
4 小时
发表于 2019-10-23 16:10:17 | 显示全部楼层
新人求教!请问怎么得到字符集?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-8-24
在线时间
16 小时
发表于 2019-11-21 02:16:35 | 显示全部楼层
rjx007 发表于 2018-2-17 09:56
感谢原子老板的指点,将u8 csize 改为u16 csize就可以了。
但又出现了一个新问题:只想显示一个字符,却出 ...

你好楼主,我也出现了只想显示一个字符,结果出现了一排字符的现象,你找到原因了吗
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-5-13
在线时间
8 小时
发表于 2019-12-5 16:39:36 | 显示全部楼层
LCD_DrawFRONT_COLOR这个函数可以贴出来看看吗
回复

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2019-12-7 10:48:03 | 显示全部楼层
本帖最后由 rjx007 于 2019-12-7 10:49 编辑

//快速画点
//x,y:坐标
//color:颜色
void LCD_DrawFRONT_COLOR(u16 x,u16 y,u16 color)
{           
        LCD_Set_Window(x, y, x, y);
        LCD_WriteData_Color(color);        
}
下载原子的资料,里面都有的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 13:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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