基于51单片机的TFT液晶显示设计
扫描二维码
随时随地手机看文章
0 引言
51单片机作为一种常见的通用单片机, 虽然其内部资源, 处理速度等都无法与新型高速单片机相提并论, 但其低廉的价格, 极低的入门难度以及适用于简单场合应用等特点, 依然是开发者的常用选择之一。
用51单片机驱动液晶模块通常都使用1602和12864等极为简单的液晶模块, 这里介绍用51单片机驱动QVGA分辨率的TFT液晶模块, 以实现彩色和更为复杂的内容显示的方法。同时, 本文还将使用DS1302芯片和DS18B20芯片来实现在液晶屏上显示实时时钟和温度。
1 硬件设计
本系统硬件电路的设计主要包括单片机最小系统电路, TFT液晶显示电路, 时钟电路, 设置电路以及温度采集电路。其系统工作原理框图如图1所示。
图1 硬件系统原理框图
1.1 单片机最小系统
一个单片机的最小系统包括外部晶振、电源、复位电路等, 这是保证单片机正常工作的必要条件。通过单片机可控制整个系统, 包括读取DS18B20芯片的温度数据, 读取/写入DS1302芯片的日历时钟数据, 检测是否有按键按下并进行相应的操作, 最后还要向显示驱动芯片写入数据,以使得TFT液晶屏上能够显示所需的内容。
1.2 液晶显示电路
驱动TFT液晶面板的芯片有多种选择, 本文使用的是台湾奕力科技的ILI9325芯片。该芯片能够支持320×240 (QVGA) 分辨率, 同时内置173KB的RAM, 故其最高能显示26万色。ILI9325支持的接口方式有8/9/16/18位i80系统总线、SPI总线、RGB接口和VSYNC接口。它的总线式接口电路方式是把液晶显示器看作外部的数据存储器,它访问液晶显示器就像访问数据存储器的一个单元一样, 采用这种方式能充分发挥单片机的总线读写功能优势, 而且便于升级和扩展。由于本文采用的STC89C54RD+单片机并没有SPI总线, 因此, 为了节约IO的使用, 本文最终采用8位系统总线的方式来连接ILI9325芯片。其显示部分电路如图2所示。
图2 显示部分电路图
图2中, 除P0口用作8位总线传输数据以外,还需要5个额外的IO口分别用作驱动芯片的片选(CS), 复位(RESET), 命令/数据选择位(RS), 写入位(WR) 和读取位(RD)。但实际上, 由于这里不需要从驱动芯片中读取数据, 因此, RD位在实际程序中并未使用。
1.3 时钟电路
时钟电路主要由DS1302芯片组成。DS1302是DALLAS公司推出的涓流充电时钟芯片。该芯片内含一个实时时钟/日历和31 字节的静态RAM,可与单片机通过简单的串行接口进行通信。该芯片可提供秒、分、时、日、日期、月、年等信息, 每月的天数和闰年的天数可自动补偿, 并能计算到2100年。DS1302与单片机之间能简单地采用同步串行方式进行通信, 而且仅需用到复位(RES)、I/O口、SCLK串行时钟三个口线。DS1302工作时的功耗很低, 其双电源管脚可用于主电源和备份电源供应, 并可为可编程涓流充电电源附加七个字节的存储器。因此, 该芯片可广泛应用于电话等便携式仪器以及电池供电的仪器仪表等产品。图3所示是DS1302的时钟电路连接图。
此外, 设计时需要为DS1302 提供外接的32.768 Hz晶振, 而不需要接电容或电阻。
图3 时钟电路连接图
1.4 温度采集电路
DS18B20数字温度计是DALLAS公司生产的单总线器件(1-Wire)。该芯片具有线路简单, 体积小的特点。因此, 用它组成的测温系统线路简单。它只用一根通信线就可以连接多个DS18B20数字温度计, 因此十分方便。此外, 该芯片还具有以下一些特点:
◇ 仅需一个端口即可完成数据的读取和写入;◇ 每个DS12B20芯片都有一个独一无二的序列号, 因此, 可以在一条数据线上挂载多个芯片;◇ 测量温度范围在-55℃到125℃之间;◇ 数字温度计的分辨率可以选择9到12位;◇ 可以设置告警温度的上下限。
图4所示是该芯片与单片机的连接电路。表1所列是DS18B20三个引脚的定义。
图4 温度采集电路图
表1 DS18B20的引脚定义
1.5 设置电路
设置电路的主要功能是将时间和日期设置到当前时间和日期。本设计仅需使用3个按键即可完成该功能。第一个按键用于选择更改的内容,即第一次按下该按键时, 时钟停止并且出现一指示符, 该指示符指向秒所在位置, 以后每按下该按键, 系统将依次轮询分、时、日、月、年、星期, 这样用户便可修改系统时间和日期, 当选完星期之后, 再次按下第一个按键, 则时钟又从设定的时间继续运行并且指示符消失。另外两个按键起“+”, “-” 的作用, 可供用户调节时间和日期时使用。需要注意的是, 只有在调节状态时按下“+”, “-” 按钮才能起作用。
在按键去抖方面, 本设计使用的是软件去抖, 但在实际中, 有时也应该加入电容或双稳态触发器以实现硬件去抖。当然, 在本文的实验中, 仅使用软件去抖也能很好的工作。其设置电路原理图如图5所示。
图5 设置电路原理图。
2 软件系统设计
软件部分的设计主要包括显示子程序、DS1302芯片子程序、DS18B20芯片子程序、按键处理子程序以及主程序。主程序部分主要用于进行各个设备的初始化, 接着进行键盘扫描, 同时读取时间、温度, 最后调用显示子程序。DS1302芯片子程序主要负责读取内部存储器中的时间、日期, 并在有相应键盘响应时将时间、日期数据存入存储器。DS18B20芯片子程序的作用相对比较简单, 只需按一定间隔读取温度数据即可。按键子程序的目的是不停的轮询按键, 一旦有按键被按下, 程序将立即执行相应的处理。而显示部分子程序是该项目中难度最大同时也是代码最多的子程序, 它包含显示驱动芯片的初始化函数,同时也定义了如何向液晶屏发送指定内容的函数, 例如文字、字母、图形等。
2.1 主程序设计
主程序在完成对各器件的初始化后, 便开始执行键盘扫描, 以读取芯片数据及显示程序。其主程序流程图如图6所示。
图6 主程序流程图。
2.2 显示程序设计
显示程序的设计是本设计的难点, 究其原因, 第一, 是显示驱动芯片的寄存器配置比较复杂, ILI9325有超过40个寄存器, 这些寄存器大部分在显示初始化程序中即可配置完成, 而另外一些则可能会在其他程序中再次用到。例如在每次写入数据前首先要确定写入的范围, 而这个范围需要在寄存器中配置。
第二, 是往显示屏上输出任何内容均需要手动编写方法。如果在1602液晶或12864液晶上写入英文字母、数字, 有的甚至可以是中文都可以直接使用现有指令写入。但ILI9325芯片没有字库, 因而会带来一些困难, 但同时也带来了灵活的选择, 因为这样, 字体和字号就不受限制了。
本文在制作字库时, 使用的是常见的字模软件,该软件可以生成任意大小的字模, 还可以根据图片取模。因此, 利用该软件可获得所需的所有汉字和字母, 本文所取的汉字字模大小为40×46,数字为16×31。正是由于字模大小的不同, 本设计生成的两个头文件均使用结构体方式来定义了索引内码和点阵码数据两个属性。特别需要注意的是, 汉字内码为2byte, 而英文数字内码为1byte。因此, 在两个不同的索引程序的判断条件中必须将其区分开。本文还将需要使用的一些简单标志图形(如指示时钟修改位的标志) 也都合并到了英文字库中。
解决了上述两个难点, 程序设计也就基本完成了。如果需要用到一些复杂的图形, 例如圆形、方形、三角形等, 也完全可以额外增加几个函数。还有一点要注意的是, 从温度采集芯片和时钟芯片获得的数据必须转换为ASCII码, 否则,索引程序就不能识别。本系统的显示程序流程图如图7所示。
图7 显示程序流程图2.3 DS1302子程序及按键处理子程序:
DS1302时钟日期芯片子程序中定义了读取写入数据的函数。通过这两个函数可以确定读取芯片中时间和日期等数据的函数以及设置这些数据的函数。设置函数将被键盘扫描程序使用, 而读取函数则将在主函数中应用。
按键处理子程序的主要目的就是轮询各按钮是否被按下, 只有当第一按键被按下时, 才会处理第二和第三按键。注意, 按下第一功能键时,必须关闭DS1302写保护功能, 而在退出设定状态时, 则需要打开写保护。为了在更改数据时实时显示出更改的数值, 在按键处理时, 也要用到显示函数。该流程较为简单, 本文不再赘述。
2.4 DS18B20芯片子程序
DS18B20是一种温度采集芯片。在进行温度采集前, 一般首先都需要初始化, 然后还需进行ROM操作, 待发出存储器操作指令后才能读取温度数据。本设计使用定时器0中断, 每隔1秒读取一次温度, 这一速度已经足够满足日常要求了。
3 结束语
本文使用51单片机配合QVGA液晶实现了时间、日期和温度的实时显示。事实上, 选用TFT液晶能够更加灵活、多彩的显示内容, 更符合未来的发展趋势。同时, 在处理简单的图像内容上, STC89C54RD+单片机已经足够满足要求, 其刷新速度在首次刷屏后几乎没有延迟, 故可取得很好的效果。同时其硬件电路上也相当简洁, 精度也很好, 因而具有不错的应用前景。