正点原子液晶屏汉字显示实验的最低端字符无法显示问题的程序bug

这里用的正点原子的例程汉字显示实验

屏幕分辨率是480*800的,按道理说,我这样是在最低端显示出来

我们可以看到字幕S并没有显示出来,汉字倒是显示出来了,让我觉得很奇怪,后来去看了源码,发现是例程的bug,原子的程序写错了一点

首先来看Show_Str函数会调用到什么函数,显示字符串里的字母调用的是LCD_ShowChar函数,显示汉字调用的是Show_Font函数,如下:

首先来看字符显示函数,看看问题在哪,如下图:

我们认真一看,发现第二个箭头这句代码写错了,因为y值是画点函数的y左边,屏幕竖方向是800像素,且从0开始取值,那么最大可以y=779,然后y++,为800,而此时这句代码判断是否大于等于屏幕高度即800,这不就刚好等于了吗,这时被认为了超区域了,实际上就错了,并没有超区域,把这句代码改成等于就可以了,既然只是某些点超出了区域,为什么整个字母都没有显示出来呢,实际上是因为是一列一列像素的画,而字母取模时候并没有完全占满32*32像素,上边和下边,左边和右边都有一定的留白的像素行和列,而这里的超区域是第一列的纵坐标就检测到了,就return了,停止画点,所以已经画的那些点都是背景颜色的点,看不出来罢了。LCD_Fast_DrawPoint这个函数一旦调用确实是实时显示的,没任何问题。汉字能显示出来是因为汉字取模的32*32的像素点基本没有边缘留白的现象,所以当超区域时候,可以看到画出来的一部分。

这样就对了,也就是屏幕上所有的像素点都能被使用,正确画出来了。

为什么汉字显示就没这个问题呢,我们看Show_Font函数源码:

可以看到画点那儿并没有做是否超出区域的判断,因此汉字能显示出来,但是这样也有问题,就是不做判断的话,给的y左边太大,超出屏幕800纵坐标,那么就会有些点看不到了,只能显示出汉字的一大半,这里我就不改它了,不给它加判断了。只要我们在用Show_Str函数时候,给的起始纵坐标心中有数,是对的,那就完全ok的。

改正那个大于等于为大于之后,就可以正确显示出来了,如下图所示:

可以看出,没问题了,我们可以发现,S下面还有几行是空的,实际上是因为32字体的字母在取模的时候高度并不是32的,而是头顶和脚底都有几行留白。根据刚刚我们的理论,汉字并没有加超出区域判断,而字母的显示是加了超出区域显示的判断的,如果超出了,就根本无法显示出字母。我们来做个实验,

仍然用32的字体,但是y起始左边改成772,所以772+32=804肯定就超出了屏幕的纵坐标800像素,因为字母加了超出区域判断,所以会无法显示,汉字没有加判断,所以可以显示,但是超出的那些像素点就无法显示了,所以汉字只能显示一大半的高度,我们来看看运行效果:

ok,完全正确,字母S果然无法显示出来,而汉字显示了一大半而已,因为汉字的超出屏幕的像素点部分当然无法显示出来了。

 

最后再说一下,我发现个奇怪的现象:

Show_Str(0,790,100,32,"S你好",32,0);

我把显示起始点设为790,也就是有一半是越界的,从分析来看,字母显示函数因为加了越界判断,所以不会显示,而汉字可以显示一部分出来,可是为什么另一半显示在屏幕最上方去了呢,如下图:

我大致跟踪了一下画点函数的底层,也没发什么原因,不过我猜测是底层函数自动做了一个循环坐标画点的原因,比如y大于800后就从0重新递增了,由于时间有限,我就不去深究了,有兴趣的可以去具体看看,欢迎和我探讨。

那么为了避免的这样的情况,有两个办法,1是和字母显示函数一样做一个越界判断,但是因为字母取模没有留白,所以还是会画出几个点,但是可以在还没画点之前就做判断,就可以很好的解决这个问题。2是自己写程序注意点,不要自己越界了,不然显示出来就是循环的了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值