一、问题描述
I80规格的LCD屏,一般都是竖屏,比如240x320;
在实际使用中,经常需要竖屏横用,即240x320的竖屏要显示320*240的图片或视频;如果只是单纯显示图片,是看不出斜线问题的,但当播放视频的视频,或显示动态画面的时候,屏幕中就有横切线一闪一闪;
要解决横斜线问题,需要明白为什么会有横线:
二、原因说明
- I80屏是有内置memory的,它会保存最近一次接收到的图像数据image buf;对于屏而言,它每个周期都会去拿自己内置memory的数据,然后显示;注意,这里是拿屏自己内置的memory数据,而不是主控IC刚发过来的数据;
- 当屏要从memory中拿数据去显示时,如果拿到一半,主控此时发了一帧新的数据过来,这样屏拿到的数据就有一部分是上一帧的数据,有一部分是新帧的数据,两帧画面之间肯定存在差异,所以在屏在拿到的新旧数据交界处,看起来就是一条横切线;
注意:I80屏横切线问题并不是横屏竖用才有这个问题,哪怕是竖屏竖用,只要是I80屏,都可能会有这个问题,只是竖屏横用的时候这个问题被放大了;
三、解决方法
解决方法就是要利用I80屏的Tear功能;
Tear功能:当屏本身显示完一帧画面后,Tearing引脚就会产生一个中断;
Tear引脚有两种使用使用方法,下面逐一讲解:
第一种:当Tear中断来的时候,MCU to memory能快速地将已经准备好的image buf发送出去,在时间段a-b这段时间里,要把数据发完,这样保证屏从自己内置的memory拿到的数据是最新的完整的一帧数据;
这种方法每次Tear中断来的时候,都能够拿到最新的数据,Tear的中断周期大概是每秒80-90次,但如果你的视频帧率是30帧的话,就不需要每个中断都去发数据,要不会消耗过多的cpu资源,我们只需在中断到来的时候,并且此时数据准备好了,才去发送数据到屏;
先说明一下第二种和第一种方法适应条件:上面第一种方法,适合cpu频率比较高的IC,比如96MHz,192MHz等等,这个频率下,可以满足在时间段a-b内发完一帧数据;第二种方法,使用的主控频率则不高,可能频率只是32MHz等等;
第二种:当Tear中断来时候,在Tear中断的上升沿之后发送数据,由于发送速度比较慢,在屏显示的第一个周期内,拿到的数据依然是内置memory旧帧,只有在第二次拿数据,即从d位置开始,拿到的数据才是新帧数据,这样的话,就需要两个Tear中断才能显示一帧数据;
这种方式,播放视频的帧率最好别超过30帧,因为Tear的中断周期大概是每秒80-90次
以上两种方法,根据主控IC的频率选择具体用哪种;
讲到这里,LCD屏横切线的问题一般是可以解决了,但总有一些屏,一些需求,单独靠Tear功能还是不能解决,这样的话,最后的解决方法就是:**把你要显示的横屏数据,先转为竖屏数据,然后再发送给屏。**只要结合这两种方法,I80横切线问题就一定能解决。
【说明:本博客是我自己调试经验,可以转载,但请不要盗用。】