15.17、 TFT触摸屏显示加触摸实验.pdf

上传人:紫竹语嫣 文档编号:5514497 上传时间:2020-05-27 格式:PDF 页数:32 大小:1.79MB
返回 下载 相关 举报
15.17、 TFT触摸屏显示加触摸实验.pdf_第1页
第1页 / 共32页
15.17、 TFT触摸屏显示加触摸实验.pdf_第2页
第2页 / 共32页
15.17、 TFT触摸屏显示加触摸实验.pdf_第3页
第3页 / 共32页
15.17、 TFT触摸屏显示加触摸实验.pdf_第4页
第4页 / 共32页
15.17、 TFT触摸屏显示加触摸实验.pdf_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《15.17、 TFT触摸屏显示加触摸实验.pdf》由会员分享,可在线阅读,更多相关《15.17、 TFT触摸屏显示加触摸实验.pdf(32页珍藏版)》请在三一文库上搜索。

1、 TFT触摸屏显示加触摸实验触摸屏显示加触摸实验 本章节在 TFT 彩屏的显示实验的基础上,还有 TFT LCD 屏的触摸功能。神舟 IV 号标配 的 2.8/3.2 寸 LCD 模块还包含了 SPI 接口的触摸芯片,可以将触摸采样到的数据在 LCD 屏 上进行进行显示。 ? 意义与作用意义与作用 TFT屏在信息行业快速发展中得到广泛的运用,中高端的手机、可视电话、便携式的 VCD、平板电脑等等; 触摸屏逐渐取代键盘成为通信常用的人机交互工具, 手机支持触摸功能、 PDA手持设备 等等的运用。 本节实验,让大家了解TFT彩屏的显示原理,针对LCD的触摸功能进行详解,剖析触摸 采样到LCD屏显示

2、间的处理过程。 ? 实验原理实验原理 TFT LCD 简介简介 TFT就是“Thin Film Transistor”的简称,一般代指薄膜液晶显示器,而实际上指的是 薄膜晶体管(矩阵)可以“主动的”对屏幕上的各个独立的像素进行控制。对于图象产 生的基本原理为: 显示屏由许多可以发出任意颜色的光线的像素组成, 主要控制各个像素显 示相应的颜色就可以达到目的。 在TFT LCD中一般会采用背光技术, 为了能精确的控制每一 个像素的颜色和亮度就需要在每一个想色之后安装一个类似百叶窗的开关,当“百叶窗”打 开时光线就可以透射过来,而“百叶窗”关上之后,光线就无法透射。 神舟IV号开发板上配带的TFT

3、LCD屏,LCD屏为320x240分辨率,262K色(26万色)。神 舟IV号STM32开发板支持2.8/3.2寸的ILI9320或1289等等的TFT LCD,在本例程中,我们以 ILI9320控制器进行简单的介绍。 ILI9320控制器是一款带有262144(26万色)种颜色的单芯片SoC驱动的晶体管显示器, 320x240的分辨率,包括720路源极驱动以及320路的栅极驱动,自带有显存,容量为172800 字节。 本次ILI9320控制模块与STM32处理器之间的接口为“i80-system”接口,用到的信号 包括以下这下所示: 其中DB为数据总线,其它的信号为控制信号,控制信号的含义如

4、下: ILI9320控制的内部结构框图如下所示: 由于该芯片支持262K色(26万色),也就是说每一个点可以有26万不同的颜色,那么要从 数据总线上一次传输26万色的数据,需要18根并行的数据线(2的18次方=262144)。但是 一般的处理器数据线的位宽为2的幂次方,与18最接近的16,所以为了本次STM32采用16位 位宽的总线与其连接,那么18bits的数据在16位位宽的总线一次传输不完,两次传输又有浪 费,如下图所示,ILI9320控制器支持在16位位宽的总线系统中分两次传输18位数据,以实 现26万色的显示,如图中的第二种和第三种。 然而在色彩深度要求不高的场合, 一般采用降低色彩深

5、度来提高系统的效率, 例如如果 16位位宽的总线系统中实现65K色(2的16次方为65K),则一次可以传输完一个点的数据, 效率提高了一倍。如上图的第一种我们配置TRI为0,DFM为任意值时,低5位为蓝色B,中 间6位为绿色G,最高5位为红色R。 下面我们了解几个重要的指令描述,如下图红框中内容。 首先,我们看看指令00h,当为读操作时,读取控制器的型号;当为写操作时,打开/ 关闭OSC振荡器。我们在代码设计中就是通过指令00h读取控制器的型号,从而针对具体型 号的控制器进行初始化操作,以便于兼容ILI93XX系列的控制器。 当写操作设置OSC比特位为1时,开启内部振荡器;为0时,停止振荡器。

6、然后至少等待 10ms时钟稳定后,再继续其它功能的设置。 第二个指令为03h,进入模式命令。在这个命令中,我们关注AM、I/D1、I/D0三个比特 位。 AM控制GRAM的更新方向: 当AM= “0” , 表示地址更新方向为垂直方向; 当AM= “1” , 表示地址更新方向为水平方向;I/D1:0:当更新一个显示数据时,控制地址计数器自动 增1和减1。详细内容如下所示: 第三个指令为07h,显示控制命令。 D1:0:设置为“11”时,打开显示;设置为“00”时,关闭显示;而配合BASEE比特 位,可以用来设置开启或是关闭显示器时,系统是挂起还是运行状态,以此设置在挂起状 态,达到降低功耗的目的

7、。 而CL比特位,当CL为1时,选择8位彩色;当CL为“0”时,选择为262144彩色: 接着我们了解第四个和第五个指令为20h和21h,分别为设置GRAM的行地址(X坐标) 和列地址(Y坐标)。我们通过此两个指令的设置,指定需要写入的点,然后再设置颜色, 便实现在指定点写入一个颜色的。 第六个指令为22h,(读/写)数据(到/从)GRAM。当这个指令执行时,地址计数器 自动增加和减少。 下面再看看50h 53h指令,垂直和水平RAM地址位置设置。 HAS7:0/HEA7:0:指定区域的垂直方向上的起点和终点。通过设置HAS和HEA比特, 以限制GRAM区域的垂直方向上的大小。 VSA8:0/

8、VEA8:0:指定区域的水平方向上的起点和终点。通过设置VSA和VEA比特, 以显示GRAM区域的水平方向上的大小。 其中: 到此,我们先简单了解到这里。有兴趣的朋友可以参阅ILI9320控制器资料一文。 触摸屏简介触摸屏简介 触摸屏一般分为电阻、电容、表面声波、红外线扫描和矢量压力传感等,其中使用最 多的是四线或无线电阻触摸屏。四线电阻触摸屏是由两个透明电阻膜构成的,在它的水平 和垂直电阻网上施加电压,就可以通过A/D转换面板在触摸点测量出电压,从而对应出坐 标值。 我们一般液晶所用的触摸屏, 最多的就是电阻式触摸屏了 (多点触摸属于电容式触 摸屏, 比如M8, IPhone等支持多点触摸的

9、手机所用的屏就是电容式的触摸屏) , TFTLCD 自带的触摸屏属于电阻式触摸屏,下面简单介绍下电阻式触摸屏的原理。 电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非 常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层, 表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、 光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000 英寸)的透明隔离点把两层导电层隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位 置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。

10、控制 器侦测到这一接触并计算出(X,Y)的位置,再根据获得的位置模拟鼠标的方式运作。这 就是电阻技术触摸屏的最基本的原理。 电阻屏的特点有: 1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。 2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。 3)电阻触摸屏的精度只取决于 A/D 转换的精度,因此都能轻松达到 4096*4096。 从以上介绍可知,触摸屏都需要一个 AD 转换器, 一般来说是需要一个控制器的。 TFTLCD 模块选择的是四线电阻式触摸屏, 这种触摸屏的控制芯片有很多, 包括: ADS7843、 ADS7846、TSC2046、XPT2046 和 AK4

11、182 等。这几款芯片的驱动基本上是一样的,也就是 你只要写出了 ADS7843 的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样 的,完全 PINTOPIN。所以在替换起来,很方便。 神舟IV号的触摸屏附在LCD屏的表面上,与LCD屏相配合使用,主要是用的触摸芯片 是ADS7843,业界上与ADS7843芯片相兼容的触摸芯片还有ADS7846、AK4182、XPT2046 以及TSC2046等,驱动基本上一致。 ADS7843是一款4线式触摸屏控制器,内含12位分辨率,125KHz转换速率,逐步逼近型 的A/D转换器。内部有一个由多个模拟开关组成的供电测量电路网络和12位的A/D转

12、换器。 其可以根据处理器(stm32f103RTB6通过SPI总线)发来的不同测试命令导通不同的模拟开 关, 以便向工作面电极对提供电压, 并把相应测量电极上的触点坐标位置所对应的电压模拟 量引入到A/D转换器。在触摸点X、Y坐标的测试过程中,测试电压与测量点的等效电路如 下图所示:(P为测量点) 当触摸屏受到点击或是挤压的时,ADS7843通过中断请求通知处理器 (STM32F103RBT6)有触摸发生。如“中断请求”图所示,当没有触摸时,MOSFET和 打开、 关闭, 则中断输出引脚通过外加的上拉电阻输出为高, 当有触摸时, 和打开, 关闭,则中断输出引脚通过内部的连接到地,输出为低,从而

13、向处理器发出中断请求。 BMP 文件介绍文件介绍 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的 所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以 BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象 文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的 BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图 DIB(device-independent bitmap)格式

14、(注:Windows 3.0以后,在系统中仍然存在DDB位图, 象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文 件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示 设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会 以.DIB或.RLE作扩展名)。 以下的图片用UltraEdit软件打开后结果右边所示: 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头 (bitmap-information header)、彩色表(color tab

15、le)和定义位图的字节阵列,它具有如下所示的 形式。 位图文件的组成 结构名称 符号 位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh 位图信息头(bitmap-information header)BITMAPINFOHEADER bmih 彩色表(color table) RGBQUAD aColors 图象数据阵列字节 BYTE aBitmapBits 下表为位图文件结构内容摘要 偏移量 域的名称 大小 内容 图 象 文 件 头 0000h 文件标识 2 bytes 两字节的内容用来识别位图的类型: BM : Windows 3.1x, 95

16、, NT, BA :OS/2 Bitmap Array CI :OS/2 Color Icon CP :OS/2 Color Pointer IC : OS/2 Icon PT :OS/2 Pointer 注: 因为 OS/2 系统并没有被普及开, 所以在编 程时,你只需判断第一个标识“BM”就行。 0002h File Size 1 dword用字节表示的整个文件的大小 0006h Reserved 1 dword保留,必须设置为 0 000Ah Bitmap Data Offset 1 dword 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 000Eh Bit

17、map Header Size 1 dword 位图信息头(Bitmap Info Header)的长度,用来描述 位图的颜色、压缩方法等。下面的长度表示: 28h - Windows 3.1x, 95, NT, 0Ch - OS/2 1.x F0h - OS/2 2.x 注:在 Windows95、98、2000 等操作系统中, 位图信息头的长度并不一定是 28h,因为微软 已经制定出了新的 BMP 文件格式, 其中的信息 头结构变化比较大,长度加长。所以最好不要 直接使用常数 28h,而是应该从具体的文件中 读取这个值。这样才能确保程序的兼容性。 0012h Width 1 dword位图

18、的宽度,以象素为单位 0016h Height 1 dword位图的高度,以象素为单位 001Ah Planes 1 word位图的位面数(注:该值将总是 1) 图 象 信 息 头 001Ch Bits Per Pixel 1 word 每个象素的位数 1 - 单色位图(实际上可有两种颜色,缺省情况 下是黑色和白色。你可以自己定义这两种颜色) 4 - 16 色位图 8 - 256 色位图 16 - 16bit 高彩色位图 24 - 24bit 真彩色位图 32 - 32bit 增强型真彩色位图 001Eh Compression 1 dword 压缩说明: 0 - 不压缩 (使用 BI_RGB

19、 表示) 1 - RLE 8-使用 8 位 RLE 压缩方式(用 BI_RLE8 表示) 2 - RLE 4-使用 4 位 RLE 压缩方式(用 BI_RLE4 表示) 3 - Bitfields-位域存放方式(用 BI_BITFIELDS 表示) 0022h Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是 4 的倍 数 0026h HResolution 1 dword用象素/米表示的水平分辨率 002Ah VResolution 1 dword用象素/米表示的垂直分辨率 002Eh Colors 1 dword 位图使用的颜色数。 如 8-比特/

20、象素表示为 100h 或者 256. 0032h Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者 等于 0 时),表示所有颜色都一样重要 调色板 数据 根据 BMP 版 本的不同 而不同 Palette N * 4 byte 调色板规范。对于调色板中的每个表项,这 4 个字节 用下述方法来描述 RGB 的值: 1 字节用于蓝色分量 1 字节用于绿色分量 1 字节用于红色分量 1 字节用于填充符(设置为 0) 图象数据 根据 BMP 版本 及调色板尺寸 的不同而不同 Bitmap Data xxx bytes 该域的大小取决于压缩方法及图像的尺寸

21、和图像的位深 度,它包含所有的位图数据字节,这些数据可能是彩色 调色板的索引号,也可能是实际的 RGB 值,这将根据图 像信息头中的位深度值来决定。 文件结构详解文件结构详解 1. 位图文件头 位图文件头包含有关于文件类型、文件大小、存放位置等信息,在 Windows 3.0 以上版本的位图文件 中用 BITMAPFILEHEADER 结构来定义: typedef struct tagBITMAPFILEHEADER /* bmfh */ UINT bfType; DWORD bfSize; UINT bfReserved1; UINT bfReserved2; DWORD bfOffBits

22、; BITMAPFILEHEADER; 其中: bfType 说明文件的类型.(该值必需是 0x4D42,也就是字符BM。我 们不需要判断 OS/2 的位图标识, 这么做现在来看似乎已经没有 什么意义了, 而且如果要支持 OS/2 的位图, 程序将变得很繁琐。 所以,在此只建议你检察BM标识) bfSize 说明文件的大小,用字节为单位 bfReserved1 保留,必须设置为 0 bfReserved2 保留,必须设置为 0 bfOffBits 说明从文件头开始到实际的图象数据之间的字节的偏移量。这 个参数是非常有用的,因为位图信息头和调色板的长度会根据 不同情况而变化,所以你可以用这个偏移

23、值迅速的从文件中读 取到位数据。 2. 位图信息头 位图信息用 BITMAPINFO 结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用 BITMAPINFOHEADER 结构定义,后者用 RGBQUAD 结构定义。BITMAPINFO 结构 具有如下形式: typedef struct tagBITMAPINFO /* bmi */ BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors1; BITMAPINFO; 其中: bmiHeader 说明 BITMAPINFOHEADER

24、 结构,其中包含了有关位图的尺寸及位格式等信息 bmiColors 说明彩色表 RGBQUAD 结构的阵列,其中包含索引图像的真实 RGB 值。 BITMAPINFOHEADER 结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为: typedef struct tagBITMAPINFOHEADER /* bmih */ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMet

25、er; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER; 其中: biSize 说明 BITMAPINFOHEADER 结构所需要的字数。注:这个值并不一定是 BITMAPINFOHEADER 结构的尺寸, 它也可能是 sizeof(BITMAPV4HEADER)的值, 或是 sizeof(BITMAPV5HEADER)的值。 这要根据该位图文件的格式版本来决定, 不 过,就现在的情况来看,绝大多数的 BMP 图像都是 BITMAPINFOHEADER 结构的 (可能是后两者太新的缘故吧

26、:-)。 biWidth 说明图象的宽度,以象素为单位 biHeight 说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还 有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个 正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的 BMP 文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个 负数时(正向图像),图像将不能被压缩(也就是说 biCompression 成员将不能是 BI_RLE8 或 BI_RLE4)。 biPlanes 为目标设备说明位面数,其值将总是被设为 1 biBitCount 说明比特数/

27、象素,其值为 1、4、8、16、24、或 32 biCompres sion 说明图象数据压缩的类型。其值可以是下述值之一: BI_RGB:没有压缩; BI_RLE8:每个象素 8 比特的 RLE 压缩编码,压缩格式由 2 字节组成(重复象素计数 和颜色索引); BI_RLE4:每个象素 4 比特的 RLE 压缩编码,压缩格式由 2 字节组成 BI_BITFIELDS:每个象素的比特由指定的掩码决定。 biSizeImag e 说明图象的大小,以字节为单位。当用 BI_RGB 格式时,可设置为 0 biXPelsPer Meter 说明水平分辨率,用象素/米表示 biYPelsPer Mete

28、r 说明垂直分辨率,用象素/米表示 biClrUsed 说明位图实际使用的彩色表中的颜色索引数(设为 0 的话,则说明使用所有调色板 项) biClrImport ant 说明对图象显示有重要影响的颜色索引的数目,如果是 0,表示都重要。 现就 BITMAPINFOHEADER 结构作如下说明: (1) 彩色表的定位 应用程序可使用存储在 biSize 成员中的信息来查找在 BITMAPINFO 结构中的彩色表,如下所示: pColor = (LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-bmiHeader.biSize) (2) biBitCount bi

29、BitCount=1 表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像 信息头装调色板中将有两个调色板项,称为索引 0 和索引 1。图象数据阵列中的每一位表示一个象素。如果一 个位是 0,显示时就使用索引 0 的 RGB 值,如果位是 1,则使用索引 1 的 RGB 值。 biBitCount=4 表示位图最多有 16 种颜色。每个象素用 4 位表示,并用这 4 位作为彩色表的表项来查找该象 素的颜色。例如,如果位图中的第一个字节为 0x1F,它表示有两个象素,第一象素的颜色就在彩色表的第 2 表 项中查找,而第二个象素的颜色就在彩色表的第 16 表项中查找。此

30、时,调色板中缺省情况下会有 16 个 RGB 项。对应于索引 0 到索引 15。 biBitCount=8 表示位图最多有 256 种颜色。每个象素用 8 位表示,并用这 8 位作为彩色表的表项来查找该 象素的颜色。例如,如果位图中的第一个字节为 0x1F,这个象素的颜色就在彩色表的第 32 表项中查找。此时, 缺省情况下,调色板中会有 256 个 RGB 项,对应于索引 0 到索引 255。 biBitCount=16 表示位图最多有 65536 种颜色。每个色素用 16 位(2 个字节)表示。这种格式叫作高彩色, 或叫增强型 16 位色,或 64K 色。它的情况比较复杂,当 biCompr

31、ession 成员的值是 BI_RGB 时,它没有调色 板。16 位中,最低的 5 位表示蓝色分量,中间的 5 位表示绿色分量,高的 5 位表示红色分量,一共占用了 15 位,最高的一位保留,设为 0。这种格式也被称作 555 16 位位图。如果 biCompression 成员的值是 BI_BITFI ELDS,那么情况就复杂了,首先是原来调色板的位置被三个 DWORD 变量占据,称为红、绿、蓝掩码。分别 用于描述红、绿、蓝分量在 16 位中所占的位置。在 Windows 95(或 98)中,系统可接受两种格式的位域:5 55 和 565,在 555 格式下,红、绿、蓝的掩码分别是:0x7C

32、00、0x03E0、0x001F,而在 565 格式下,它们 则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出 想要的颜色分量(当然还要再经过适当的左右移操作)。在 NT 系统中,则没有格式限制,只不过要求掩码之 间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数 据又比真彩图像小的多,所以,它更多的被用于游戏软件)。 biBitCount=24 表示位图最多有表示位图最多有 1670 万种颜色。这种位图没有调色板(万种颜色。这种位图没有调色板(bmiColors 成员尺寸为成员尺寸

33、为 0),在 位数组中,每 ),在 位数组中,每 3 个字节代表一个象素,分别对应于颜色个字节代表一个象素,分别对应于颜色 R、G、B。 ?本次实验使用的格式?本次实验使用的格式 biBitCount=32 表示位图最多有 4294967296(2 的 32 次方)种颜色。这种位图的结构与 16 位位图结构非常 类似,当 biCompression 成员的值是 BI_RGB 时,它也没有调色板,32 位中有 24 位用于存放 RGB 值,顺序 是:最高位保留,红 8 位、绿 8 位、蓝 8 位。这种格式也被成为 888 32 位图。如果 biCompression 成员的 值是 BI_BITF

34、IELDS 时,原来调色板的位置将被三个 DWORD 变量占据,成为红、绿、蓝掩码,分别用于描述 红、绿、蓝分量在 32 位中所占的位置。在 Windows 95(or 98)中,系统只接受 888 格式,也就是说三个掩码 的值将只能是:0xFF0000、0xFF00、0xFF。而在 NT 系统中,你只要注意使掩码之间不产生重叠就行。(注: 这种图像格式比较规整, 因为它是 DWORD 对齐的, 所以在内存中进行图像处理时可进行汇编级的代码优化 (简 单)。 (3) ClrUsed BITMAPINFOHEADER 结构中的成员 ClrUsed 指定实际使用的颜色数目。如果 ClrUsed 设

35、置成 0,位图使 用的颜色数目就等于 biBitCount 成员中的数目。请注意,如果 ClrUsed 的值不是可用颜色的最大值或不是 0, 则在编程时应该注意调色板尺寸的计算, 比如在 4 位位图中, 调色板的缺省尺寸应该是 16sizeof(RGBQUAD), 但是,如果 ClrUsed 的值不是 16 或者不是 0,那么调色板的尺寸就应该是 ClrUsedsizeof(RGBQUAD)。 (4) 图象数据压缩 BI_RLE8:每个象素为 8 比特的 RLE 压缩编码,可使用编码方式和绝对方式中的任何一种进行压缩,这 两种方式可在同一幅图中的任何地方使用。 编码方式:由 2 个字节组成,第

36、一个字节指定使用相同颜色的象素数目,第二个字节指定使用的颜色索引。 此外,这个字节对中的第一个字节可设置为 0,联合使用第二个字节的值表示: 第二个字节的值为 0:行的结束。 第二个字节的值为 1:图象结束。 第二个字节的值为 2:其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量。 绝对方式:第一个字节设置为 0,而第二个字节设置为 0x030xFF 之间的一个值。在这种方式中,第二个 字节表示跟在这个字节后面的字节数,每个字节包含单个象素的颜色索引。压缩数据格式需要字边界(word bo undary)对齐。 BI_RLE4:每个象素为 4 比特的 RLE 压缩编码,同样也可使

37、用编码方式和绝对方式中的任何一种进行压 缩,这两种方式也可在同一幅图中的任何地方使用。这两种方式是: 编码方式:由 2 个字节组成,第一个字节指定象素数目,第二个字节包含两种颜色索引,一个在高 4 位,另 一个在低 4 位。第一个象素使用高 4 位的颜色索引,第二个使用低 4 位的颜色索引,第 3 个使用高 4 位的颜色 索引,依此类推。 绝对方式:这个字节对中的第一个字节设置为 0,第二个字节包含有颜色索引数,其后续字节包含有颜色索 引,颜色索引存放在该字节的高、低 4 位中,一个颜色索引对应一个象素。此外,BI_RLE4 也同样联合使用第 二个字节中的值表示: 第二个字节的值为 0:行的结

38、束。 第二个字节的值为 1:图象结束。 第二个字节的值为 2:其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量。 3. 彩色表 彩色表包含的元素与位图所具有的颜色数相同,象素的颜色用 RGBQUAD 结构来定义。对于 24-位真彩色 图象就不使用彩色表(同样也包括 16 位、和 32 位位图),因为位图中的 RGB 值就代表了每个象素 RGBQ UAD 结构描述由 R、G、B 相对强度组成的颜色,定义如下: typedef struct tagRGBQUAD /* rgbq */ BYTE rgbBlue; /指定蓝色强度 BYTE rgbGreen; /指定绿色强度 BYTE

39、rgbRed; /指定红色强度 BYTE rgbReserved;/ 保留,设置为 0 RGBQUAD; 4. 位图数据 紧跟在彩色表之后的是图象数据字节阵列。图象的每一扫描行由表示图象象素的连续的字节组成,每一行的 字节数取决于图象的颜色数目和用象素表示的图象宽度。扫描行是由底向上存储的,这就是说,阵列中的第一 个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。(只针对与倒向 DIB,如果是正向 DI B,则扫描行是由顶向下存储的),倒向 DIB 的原点在图像的左下角,而正向 DIB 的原点在图像的左上角。同 时,每一扫描行的字节数必需是 4 的整倍数,也就是 DWORD 对齐

40、的。如果你想确保图像的扫描行 DWORD 对齐,可使用下面的代码: (width*biBitCount)+31)5)2 由上面的知识知:注意上面的数均为 16 进制 1. 0000h 42 表示 B(的 ascii)0001h 4D 表示 M 2. 0002h 0005h 2E0A0000 表示整个文件大小 3. 000Ah 36 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 可以看出 FF 确实 由 0036h 开始出现 4. 000Eh 28 位图信息头的长度,是 windows 的 5. 0012h 0016h 位图的宽度和高度均为 1Dh=1*16+13=2

41、9,对比下图所示的图片属性验证是正确的 6. 001Ah 位图的面数总是 1 7. 001Ch 18h=1*16+8=24 每个象素的位数,即为 24 位真彩色图(这种位图没有调色板,在位数组 中,每 3 个字节代表一个象素,分别对应于颜色 R、G、B。) 用 matlab 打开后的 R, G, B 数据为: 截屏如下, 可以看见有一圈 0, 因为图片中间是圆 (黑色的线) , 白色部分 RGB 均为 255 ? 硬件设计硬件设计 神舟IV号开发板载有目前比较通用的液晶显示模块接口,支持触摸,其原理图如下: 由于STM32F107芯片不支持FSMC,所以神舟IV号开发板通过GPIO总线对屏进行

42、进行 访问操作,实现图形界面的显示。 神舟系列的2.8/3.2寸LCD触摸屏支持触摸功能,LCD模块上有触摸芯片,将电阻式触摸 屏的模拟信号转化为数字信号,处理器通过SPI接口读取芯片转换后的数字,支持查询方式 和中断方式。 触摸屏控制芯片为 XPT2046。XPT2046 是一款 4 导线制触摸屏控制器,内含 12 位分辨 率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置, 除此之外,还可以测量加 在触摸屏上的压力。内部自带 2.5V 参考电压可以作为

43、辅助输入、温度测量和电池监测模式 之用,电池监测的电压范围可以从 0V 到 6V。XPT2046 片内集成有一个温度传感器。 在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。 触摸芯片现位于 TFT LCD 屏上,处理器通过 SPI2 总线控制触摸芯片。X+、X-、Y+和 Y-则连接到 LCD 触摸屏上。 ? 软件设计软件设计 由于STM32F107芯片不支持FSMC,所以神舟IV号开发板通过GPIO总线对屏进行进行 访问操作,实现图形界面的显示。 ? TFT驱动芯片初始化驱动芯片初始化 TFT LCD的初始化主要是在ili9320_Initiliztion() 函数实

44、现的,首先程序调用LCD_Init() 函数,对TFT LCD使用的GPIO管脚进行初始化, LCD_Init()函数如下: 它调用的LCD_Pins_Config对TFT LCD使用的GPIO管脚进行初始化,具体代码如下: TFT LCD的初始化主要是在ili9320_Initiliztion()函数实现的,实现过程如下: 首先程序调用LCD_Init()函数,对TFT LCD使用的GPIO管脚进行初始化,完成了GPIO 的初始化以后,我们就可以正常的访问TFT LCD驱动芯片了, 程序首先读取驱动芯片的ID, 然后依据驱动芯片的型号执行对应的初始化程序。例如本次驱动芯片的ID为9320,依

45、据驱 动芯片的型号执行对应的初始化部分程序如下: 说明:说明:由于篇幅限制,没有列出ili9320_Initializtion()完整函数。实际的工程文件中, 支持数种TFT驱动芯片的初始化,其中9320与8989等多个驱动芯片已经在神舟IV号通过验 证,可以正常使用。 下面再看一下TFT的几个基本操作函数。 设置窗口区域的函数,通过50h53h命令,规划区域大小: 设置指定点的显示ASCII码字符的函数: ? 触摸屏驱动芯片初始化触摸屏驱动芯片初始化 前面在神舟IV号STM32开发板中,通过SPI2接口访问2.8/3.2 TFT LCD模块上的驱动芯 片,在实验程序中,通过GPIO模拟SPI

46、接口的方式进行访问,其中ADS7843_Init()函数主要 完成相关的GPIO管脚以及中断源配置,主要代码如下: ? 主程序实现主程序实现 主函数首先是一些变量的定义: 其次是串口、触摸屏和 LCD 等的初始化,最后重复显示三幅画面: 在这里,我们需要关注一下Delay_ARMJISHU(10000000)函数。 在延时函数中,对中断管脚的判断,如果有效时,则在延时的过程对触摸进行响应。 当然,在延迟时,如果触摸了,也可以采用中断进行响应,但是,这样在图片的刷新过程中 可能会导致图片的混乱。 触摸响应程序具体代码如下: 另一个函数DrawPicture_Center它将图片显示到屏幕上,将自

47、己喜欢的图片,通过转换 工具转换为picture.h文件后 (根据可以使用光盘根目录下的神舟系列开发板LCD图片转换.rar 里的软件),就可以通过此函数显示图片了。 根据BMP位图文件的格式,图片的大小位于文件的以下这四个字节,上述程序中的 PictureWidth变量和PictureHeight就是读取图片的宽度和高度。 0012h Width 1 dword 位图的宽度,以象素为单位 0016h Height 1 dword 位图的高度,以象素为单位 转换工具格式转换到数组.exe的使用方法如下: 首先将需要显示的图片转为顶部在左边的图片,如下所示: 然后将缩放为文件占用空间在 大小在2

48、40X320以内,由于STM32F107VC的内部Flash 大小为256 Kbytes of Flash memory(0x0000 - 0x3FFFF)而大小在240X320的24bit图片占用 大小240X320X3=230400字节, 如果编译时警告内部ROM资源不足, 将修改图片的分辨率。 接着将图片保存为24位BMP位图格式的图片, 并将图片命名为Armjishu.bmp如下格式 将其与格式转换到数组.exe与Armjishu.bmp放在同一文件夹里,双击格式转换到 数组.exe即可将图片转换为数组ArmjishuChar.c。(格式转换到数组.exe只是将文件的 二进制数据读出来

49、%X输出打印为数组) 最后,备份picture.h文件,用ArmjishuChar.c中数据代替picture.h的数组const u8 picture=的原内容,编译即可显示用户的图片。 ili9320_DrawPicture函数位于文件ili9320.c文件中 ili9320_DrawPicture()读取连续的 3 个字节, 24bit 的 BMP 图像每 3 个字节描述一个像素 点颜色 RGB888。而我们神州开发板上的 LCD 使用的是 16 位色代表一个像素点颜色 RGB565,所以需要作调整,RGB888 转换为 RGB565,很容易,只需要将代表红颜色的 8 位(R8)数据的高五位,代表绿颜色的 8 位(G8)数据的高六位,代表蓝颜色的 8 位(B8)数据的 高五位提取出来组成一个 16bit 即可。代码中为了加快执行速度,一次读取了 16bit 数据,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1