ARMLCD的驱动与触摸屏的中断
1、LCD显示单位:帧
(1)显示器上一整个画面的内容成为一个帧,整个显示器工作是一帧一帧的在显示。
(2)电源实际就是以每秒种24帧的速度在播放图片。
(3)帧内数据:一帧分为多行,一行分为多像素,因此一帧图像其实就是多个像素组成的矩阵。
(4)帧外数据:整个视频由很多个帧构成,最终播放视频时逐个播放各个图像帧即可。
2、LCD显示一帧图像的过程
(1)首先把帧分为行,然后再把行分为像素,然后逐个像素去显示。(显示像素:其实就是LCD驱动器按照接收到的LCD控制器给的显示数据,驱动一个像素的液晶分子旋转,让这个像素显示出相应的颜色值的过程)
(2)关键点:LCD控制器和驱动器之间一次只能传一个像素点的显示数据。所以一帧图像在屏幕上其实是串行的依次被显示上去的,不是同一时间显示出来的。
3、为了向前兼容出现的六个时序参数
HPSW 水平同步信号脉宽
HBPD 水平同步信号前肩
HFPD 水平同步信号后肩
VSPW 垂直同步信号脉宽
VBPD 垂直同步信号前肩
VFPD 垂直同步信号后肩
(1)一行的通信过程是这样的:LCD控制器先发送一个HSYNC高电平脉冲(脉冲宽度是HSPW),脉冲告诉驱动器下面的信号是一行信息,这一行信息包括3部分:HBPD+有效行信息+HFPD。其中前肩和后肩都属于时序信息(和LCD屏幕具体有关),有效行信息就是横向分辨率。所以你可以认为一行总共包含4部分:HSPW+HBPD+有效行信息+HFPD。
(2)一帧图像其实就是一列,一列图像由多个行组成,每行都是上面讲的这个时序。
(3)一帧图像的通信过程是这个样子的:整个帧图像信号分为4部分:VSPW+VBPD+帧有效信号+VFPD。VSPW是帧同步信号宽度,用来告诉驱动器一帧图像要开始了;VBPD和VFPD分别是垂直同步信号前后肩。
(4)必要说明:这6个参数对于LCD显示器其实本来是没有用的,这些信号其实是老式的CRT显示器才需要的,LCD本身不需要,但是出于历史兼容性要求,LCD选择了兼容CRT显示器的这些时序要求,所以理解LCD显示器时序和编程时,用CRT的方式来理解不会出错。
其时序图如下:
在进行驱动屏幕的时候只要是找到相对应的时序就可以了,主要记住还有显存的地址
rGPCUP = 2 ;
rGPCCON = 0xaaaaaaa9;
rGPCDAT=1;
rGPDUP=0;
rGPDCON=0xaaaaaaaa; //引脚的初始化
VIDCON0 |= (0<<22)|(0<<13)|(13<<6)|(1<<5)|(1<<4)|(0<<2)|(3<<0);
VIDCON1 |= (1<<6)|(1<<5); //设置一些极性以及分频参数
VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;//设置时序
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);//告诉其行列
WINCON0 |= (1<<0);
WINCON0 &= ~(0xf << 2);
WINCON0 |= 0xB<<2; //设置显示的彩色
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0); //设置屏幕的长宽
VIDW00ADD0B0 = (volatile unsigned)gFB_Addr; //告诉显存首地址
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff); //告诉他的显存的容量大小
//
对于中断操作的话
中断寄存器介绍
3.内部中断。内部中断有8个寄存器,下面逐一来看。
寄存器:SUBSRCPND:当一个中断发生后,那么相应的位会被置1,表示一个中断发生了。
INTSUBMSK:与上一个是一伙的,中断屏蔽寄存器,具体屏蔽什么,自己看手册去吧。
INTMOD:中断的方式。一个中断可以是普通中断,也可以是快中断,在这里设置,但只能有一个快中断。
PRIORITY :优先级寄存器,不说了。
SRCPND :当一个中断发生后,那么相应的位会被置1,表示一个或一类中断发生了。
INTMSK :中断屏蔽寄存器。
INTPND :中断发生后,SRCPND中会有位置1,可能好几个(因为同时可能发生几个中断),这些中断会由优先级仲裁器选出一个最紧迫的,然后吧把INTPND中相应位置1,所以同一时间只有一位是1。也就是说前面的寄存器置1是表示发生了,只有INTPND置1,CPU才会处理。
INTOFFSET :用来表示INTPND中哪一位置1了,好让你查询,普通中断跳转时查询用。清除INTPND、SRCPND时自动清除。
1:先开中断,设置中断入口地址,中断的话必须要对PC值进行操作,所以一定要通过汇编进入中断,返回时要对
PC进行相对应的操作,例如:
TouchHandler
STMDB sp!,{r0-r12,lr}
BL Readlcdxy
LDMIA sp!,{r0-r12, lr}
SUBS pc, lr, #4 --- 因为ARM的指令结构是流线型的
2:进入中断,取消其标志位,清除其标志位不是写入0,而是写入了1才会清除,不然会一直进入中断