使用触摸屏
显示技术,是光电学科中的一个研究方向。该实验将了解:①TFT屏幕的结构,②电阻触摸屏的原理,③……。
开发板上带的屏幕,为电阻式薄膜晶体管液晶触摸屏。下面,将分别对显示功能和触摸功能的结构及原理,逐项讨论。
薄膜晶体管液晶显示屏介绍
薄膜晶体管液晶显示屏,英文缩写TFT-LCD,全称Thin Film Transistor-Liquid Crystal Display。它对于屏幕上的每一个像素点,都设置有相应的薄膜晶体管。薄膜晶体管的作用是:①当选择写入某个像素的颜色数据时,它能将数据储存起来;②当不选择这个像素时,其中的数据不会随意发生改变。它有效克服非选通状态下的串扰问题,使液晶屏幕的静态特性与扫描线数无关。换句话说,如果不输入任何命令,屏幕上的显示效果会一直保留。
实验所用屏幕的分辨率为320*240,采用16位真彩色显示方式。屏幕颜色,由红绿蓝RGB三种颜色,按照不同的比例混合而成。这里的颜色配比,采用RGB565方式,其数据结构,如图[figRGB565]所示。
RGB565结构图
颜色结构体上的某个位,若需要则为1,不需要则为0。因此,红色为0b1111100000000000=0xF800,绿色为0b0000011111100000=0x07E0,蓝色为0b0000000000011111=0x001F。16位颜色,意味着最多存在种颜色,足够一般的项目使用了。
电阻式触摸屏介绍
实验所用触摸屏,是电阻式四线触摸屏。电阻式触摸屏外表面,有两层透明的电阻材料。当发生触碰时,材料间的电压,因电阻变化而发生电压变化。分别使用模数转换器ADC,对纵横两个方向进行电压测量,即可计算得出触碰点大致的物理坐标。这个物理坐标,通过一个线性变换,即可得到屏幕坐标。触摸屏开发与使用,需要的就是这个屏幕坐标。
电阻屏的精度完全取决于ADC的精度,常用的触摸屏芯片有ADS7843、TSC2046、XPT2046等,它们的ADC精度都是12位的,即触摸精度能达到。
开发板上使用的屏幕控制芯片为ILI9341,四线电阻触摸的控制芯片为XPT2046。通常,芯片厂商会提供芯片的驱动程序,以便于开发者使用或加以改进。
单片机与屏幕的连接示意图如图[figDIS]所示。图中,ILI9341的读使能线和XPT2046的片选线共用了端口P44,虽说端口可以分时复用,但这一点可能会使得读取触摸点和读取屏幕信息时出现一些奇奇怪怪的问题。
单片机与屏幕连接示意图
SPI总线,全称Serial Peripheral Interface,串行外设接口。它以主从方式工作:一个主设备,多个从设备。它们能根据一定的时序进行通讯。现在大多数单片机中,都内部支持有SPI功能,只需更改少数SFR特殊状态寄存器,即可方便地使用SPI通讯。
GUI概述
GUI,全称Graphical User Interface,图形用户界面。对于普通用户来说,一个图形显示界面,会显得比指示灯、命令行窗口更友好得多。GUI的大致结构,自顶而下来讲,分为:应用程序,UI界面库,图形渲染库,驱动程序和操作系统的其他组分,示意图如图[figGUI]所示。
GUI示意图
应用程序负责“规划”UI界面。UI界面指的是给用户看的、使用的、带有事件响应的东西。在Win系统下,UI界面大致是我们平时见到的窗口,按钮,菜单栏,文本框等等。图形渲染库,则是根据UI所需要的内容,调用驱动程序,在屏幕上指定的位置绘图。
对于不熟悉单片机开发的同学,笔者已经准备好了一些库函数,不需要同学们自行对照芯片手册编写驱动程序了。而,由于单片机的资源非常有限,笔者提供的库函数的功能同样也非常有限。
本实验中涉及到的库函数:
LIB_Init();
初始化各个器件。先调用一下。
DIS_Clear(u16 color);
用color颜色清屏。
DIS_Set_Addr(u16 xs,u16 ys,u16 xe,u16 ye);
设定要绘图的区域为(xs,ys)到(xe,ye),配合DIS_Write_Data(u16 data)将数据连续上屏用。
DIS_Write_Data(u16 data);
GUI_Point(u16 x,u16 y,u16 color);
在(x,y)画颜色为color的点。
GUI_Line(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
在点(x1,y1)(x2,y2)间,用color颜色画直线。
GUI_Rect(u16 x1,u16 y1,u16 x2,u16 y2,u8 mode,u16 color);
在点(x1,y1)(x2,y2)间,用color画矩形,mode可选填充,或仅画边框。
GUI_Circle(u16 x,u16 y,u16 r,u8 mode,u16 color);
以(x,y)为圆心,r为半径画颜色为color的圆,mode……
GUI_Arc(u16 x,u16 y,u16 r,u16 sa,u16 ea,u8 mode,u16 color);
以(x,y)为圆心,r为半径,从起始角度sa到终止角度ea(角度制),画颜色为……
GUI_Ellipse(u16 x1,u16 y1,u16 x2,u16 y2,u16 a,u16 b,u8 mode,u16 color);
以(x1,y1)(x2,y2)为焦点,画两轴为a、b的椭圆…… (实在不要挑战这个画椭圆的函数,非常脆弱,极其容易出错误)
TP_Point TP_Get_Point()
触摸屏触摸检测。返回值为一个结构体。x,y为触摸点屏幕坐标,flag表示有没有发生触摸。
typedef struct{
u16 x;u16 y;
u8 flag
};
……
还有一些函数,参见附录或libE51.h,猜测别人的写的啥意思(反正不留联系方式)。