基于RT-Thread和STM32的数码相框的设计方案

3.4 LCD触摸驱动电路

本系统的触摸控制器选用TSC2046,TSC2046是四线电阻式触摸屏控制器,其核心是一个具有采样和保持功能的12位逐次逼近式A/D转换器。本系统通过STM32的SPI接口驱动TSC2046控制器,典型的驱动电路如图6所示。

4.系统软件设计

本系统的软件主要由系统各模块初始化、μC/GUI建立人机交互界面、文件系统读取图片及字库文件、图片解码算法的实现、触摸浏览功能及幻灯片播放功能等功能模块组成。

4.1 μC/GUI建立人机交互界面本系统利用μC/GUI builder建立μC/GUI人机交互界面,在μC/GUI builder中建立窗体、文本框、控件等、将编译后产生的C文件添加到工程目录中。μC/GUI builder的应用,缩短了界面开发周期,修改灵活方便,后期修改界面时,只需要在μC/GUI builder修改相关组件,编译运行即可实现程序的修改。

4.2 μC/GUI显示汉字

μC/GUI中通过查找字模的方式来实现字体的显示。字体库中的每一个字母都有其对应的字模,字模由结构体GUI_FONT和GUI_FONT_PROP统一管理。但是μC/GUI中本身只支持英文,没有提供中文的字库源码文件。本系统在修改μC/GUI字库显示驱动函数的基础上实现了汉字的显示,以显示12*12点阵汉字为例,具体的修改步骤如下:

第一步:在GUI.H中声明全局结构体对象GUI_Font12_HZ;

第二步:定义存放字模数据的数组;

第三步:定义用于说明每个字母的字模数据在程序段存储方式的结构体;

第四步:根据汉字内码高位定义多个结构体,用于存放字库字模编码和字模数据存放地址的映像;

第五步:将创建的汉字库文件HZK12.C添加至μC/GUI工程,在主函数中调用显示函数。

通过以上步骤实现了中文汉字在μC/GUI界面的显示,经测试,汉字显示流畅稳定。

4.3 图片解码算法

JPEG图片解码显示包括解析JPEG头文件信息、基于连续DCT编码的JPEG解码算法处理、转换图像格式、液晶显示等部分,总体流程图如图7所示。

4.3.1 解析JPEG头文件信息

对JPEG解码的过程进行初始化,获取JPEG头文件中的相关信息,本系统的方法是设计一系列的结构体对应头文件中的各个信息标记,并存储标记内表示的信息,如色彩信息、采样比、图片尺寸、量化表、Huffman解码表等重要信息。

4.3.2 基于连续DCT编码的JPEG解码算法

基于连续DCT编码的JPEG解码算法包括熵解码、反量化和反向离散余弦变换(IDCT)共三个步骤。JPEG基本系统的解码器结构图如图8所示。

(1)熵解码。熵解码的输入信号是被压缩编码的比特流,输出是被解码得到的DCT变换系数的量化值。通过查找Huffman解码表将压缩图像数据还原成交流AC系数和直流DC系数组成的量化数据块。

熵解码对读入的图像数据进行DC直流系数和AC交流系数的Huffman解码。JPEG算法提供标准的Huffman码表,针对每幅图像都有各自不同的特点,系统熵解码采用自适应的Huffman码表。采用自适应的Huffman码表,首先统计输入图像数据的特性,生成码树,再反推得到各级Huffman码表。

在JPEG头文件信息的标记中,定义了一张表用来记录Huffman树其代码长度限制在16bit以内。JPEG头文件信息一般包含4个Huffman码:用于解码直流DC系数的Huffman码表,其中包括一个亮度表和一个色度表;用于解码交流AC系数的Huffman码表,其中包括一个亮度表和一个色度表。根据Huffman码表在文件中的保存形式,设计Huffman解码一个码字的程序,程序流程图如图9所示。

解码时,输入图像压缩后的数据流,从数据流中读取比特数据组成的码字,在Huffman树中搜索码字的位置,根据码字的位置确定解码的值,解码输出结果是一个8位值。在Huffman解码过程中,如果产生了一个0xFF,就用0xFF0x00代替,把0xFF0x00当做0xFF进行处理。

(2)反量化。反量化的输入信号是熵解码后的数据,通过查量化表进行计算,将在压缩过程中经过DCT变换后的频率系数还原出来,反量化成DCT系数。

JPEG文件中包括亮度量化表和色度量化表两张量化表,将Huffman解码得到的系数矩阵与相应的量化矩阵相乘,即得到反量化结果。

由于数据是按8×8矩阵的“Z”字形编排,所以要对反量化运算的结果进行反Zig-Zag变换。

(3)反向离散余弦变换(IDCT)。反向离散余弦变换把频率域DCT分量系数反转成颜色空间域表示的图像数据。对反量化后得到的DCT变换系数经过反向离散余弦变换IDCT得到图像的像素。反离散余弦转换的输入是频率域的一个8×8分量系数块,输出则得到空间域的一个8×8像素块。