1、第三讲 用户界面设计1 液晶显示简介 1.1 液晶显示原理 液晶显示器(LCD)是一种被动式显示器。它由于功耗极低、抗干扰能力强,因此可以在低功耗的单片机系统中大量使用。LCD 本身不发光,只是调节光的亮度,目前市售的LCD 都是利用液晶的扭曲向列效应原理制成的。向列效应是一种电场效应,夹在两片导电玻璃电极间的液晶经过一定处理,其内部的分子呈 90的扭曲,当线性的偏振光经过其偏振面时便会旋转 90。当在玻璃电极上加上电压后,在电场的作用下,液晶的扭曲结构消失,其旋光作用也消失,偏振光便可以直接通过。当去掉电场后液晶分子又恢复其扭曲结构。把这样的液晶置于两个偏振片之间,改变振片相对位置(正交或平
2、行),就可得到白底黑字或黑底白字的显示形式。LCD 的主要参数有:响应时间(毫秒级);余辉(毫秒级);阈值电压(320V);功耗(5100mW/cm)。由于加直流信号,将使液晶材料迅速分解,大大缩短显示器的工作寿命,故通常采用方波驱动。方波的频率一般为 25100Hz ,并保证其为对称方波,从而使加在液晶板板上的直流电压平均值为零。否则,有较大的直流分量,将影响显示器的工作寿命。 1.2 液晶显示器的分类 LCD 的分类方法有很多种,按显示的色彩除了黑白显示外,LCD 还有多灰度和彩色显示等。如果根据驱动方式来分,可分为静态驱动(Static )、单纯矩阵驱动( Simple Matrix)和
3、主动矩阵驱动(Active Matrix)3 种(后两种采用逐行扫描方式,利用人的视觉滞留现象产生稳定的图像)。按照其显示方式分为数显式、点阵字符式、 点阵图形式等。2 液晶显示模块 TM12864A 的应用液晶显示模块是一种将液晶显示器件、驱动控制器、背光源、连接件、结构件装配在一起的组件。英文名称叫“LCD Module”,简称“LCM ”。 这使得液晶显示模块的硬件电路简单化,从而降低模块的成本。2.1 模块简介TM12864A 是一种点阵图形式液晶显示模块,其内置 HD61202/ HD61203 控制驱动器,TM12864A 液晶模块内部逻辑电路如图 2-1 所示。两片 HD6120
4、2 作为列驱动器,一片 HD61203 作为行驱动器,其中 HD61203 不与 CPU 发生联系,主要用于产生行驱动信号和各种同步信号。两片 HD61202,每片拥有 6464 位(512B)的显示存储器,其数据直接作为显示驱动信号。左半区域由 cs1 选择,右半区域由 cs2 选择。同时 HD61202 配备了一套显示存储器的管理电路和与计算机接口电路(8 位并行数据接口,适配 M6800 系列时序),允许计算机直接访问显示存储器。显示屏上各像素点的显示状态与显示存储器的结构关系如图 2-2,各点按列构成字节,字节长度为 8 位。图 2-1 液晶模块内部逻辑电路图 2-2 显示存储器的结构
5、关系2.2 引脚功能与操作时序 液晶显示模块的控制总线包括:DB0DB7 三态 8 位数据总线。RS 输入 寄存器选择信号。RS=0 选通指令寄存器,数据总线传输的是指令代码或标志位;RS=1 选通数据寄存器,数据总线传输的是显示数据或自定义字符的字模数据。R/W 输入 读/写选择信号。 R/W=1 为读操作选择,R/W=0 为与操作选择,R/W 号的宽度要大于 E 信号的宽度才能保证计算机的操作正确。E 输入 使能信号。TM12864A 的接口时序是适配 M6800 系列的,其特点是读/ 写操作时序是由使能信号E 完成:不操作时为低电平状态,E 信号为高电平时,控制器将所需数据送入数据总线上
6、,供计算机读取;在写操作时,E 信号下降沿处将数据总线上的数据写入控制器接口模块的寄存器内。而 89C51 属于 Intel 8080 系列时序的计算机,其读写操作是在 /wr 或/rd 的下降沿进行的。所以 TM12864A 液晶显示模块与 Intel 8080 系列时序的 cpu 相连接时,关键要注意 E 信号的使用。 与其连接,关键要注意 E 信号的使用。直接访问方式是单片机把液晶显示模块作为存储器或 I/O 设备直接挂在计算机的总线上。在这种方式下,控制信号 E 由 89C51 的读操作信号-RD 和写操作信号-WR 与地址信号合成产生。直接访问方式的接口电路如图 2-3 所示,8 位
7、数据总线与 89C51 的数据总线连接,E 信号由-WR 和-RD 信号逻辑相与,然后由高位地址组成的 “片选“信号选通控制,CS1,CS2,RS 及 R/W 信号由低位地址提供。由此确定了 89C51 操作该液晶显示模块的唯一地址选择。13 软件设计131 硬件接口驱动软件的层次硬件接口层与系统的硬地址、时序、中断等直接相关,一般只在模块内被其他函数调用,不直接被用户程序调用;应用接口层应该与系统的硬件无关,对硬件的控制完全通过硬件接口层来实现,对用户程序应该有良好的接口界面,便于主程序或其他模块程序的调用。132 硬件接口层的程序设计1)问题定义任务:向 DDRAM 特定的位置,写入或读出
8、数据定义两个基本函数:a) 将 data 写入到 DDRAM 当前位置上,当前位置自动增一Void put_data(char dat)b) 从 DDRAM 当前位置上读出一个字节的数据Char get_data(void)当前位置由技术资料显示,TM12864A 的行计数器与列计数器的值,只能写入不能读出,对这种量编程时一般采用设置影像变量的办法。设置 2 个模块级通用变量;Unsigned char col,row;2) 算法研究这两个程序的编写主要是解决列,与行的变换问题:问题 1,列左右半部更换:当 col63 时,应该是 cs1=0,cs2=1 写入的值应该为 col-64;另外,无
9、论 col63, 写入的值可统一表达为 col%64。问题 2,行的自动增量:行0;i-)Style_5x7(ci-1);*浮点数的显示办法浮点数的取值范围 1.175e-38 3.403e+38用常规方法 *.* 只能显示有限范围内的数。限制整数部分和小数部分*100000 的值在-32768+32768 以内,出界时将出现错误显示结果。给定浮点数 f,整数部分的显示位数为 w1,小数部分显示位数为 w2,例如F=123.5678 w1=4, w2=2则显示 “0123.56”F才能用)(2)抗干扰和抗扰动三种方式(1)程序调用加延时(不适合实时多任务程序)(2)键盘中断(3)定时中断中扫描
10、方式缓冲区 多字节与单字节用 户 程 序定 时 中 断程 序键 盘缓 冲 区读 出 暂 存 扫 描 输 入单字节 FIFO Flip Flop 方式定时中断程序将键码写入(非 0XFF)用户程序将键码取出并将缓冲区清光(写入0XFF)。定时中断抗抖动的工作原理如果一个键按下,并稳定一个足够长的时间 T,就认定这次按键操作有效,否则不予处理,在定时中断中,这个时间 T,可以用中断的次数 N 来表示,具体处理时,设定一个变量 n 来记录键盘值标一个扫描码的中断次数,当 nN 时即认为该键码有效,为进行比较:还需要保留上次扫描的键码值。框图如下,设扫描码为 C,上次的扫描码为 CL,n 为寿命,ke
11、y_N 为寿命时间常数。程序框图如图:入口扫描获得此次键码 CC = C L 吗 ?n = n + 1 n = 0n = k e y _ N 吗 ?输出键码到缓冲区继续NYYN入口扫描获得此次键码 CC = C L 吗 ?n = n + 1 n = 0n = k e y _ N 吗 ?输出键码到缓冲区继续NYYNn = k e y _ R 吗 ?n = 0YN利用寿命系数 n 可以实现连击,只需设定一个重复时间常数 key_R,当 n=key_R 时,令 n=0,则键每经过 key_R*t 重复一次。调试时,改变两个常数的值,可以改变键盘的灵敏度和重复速度。我们的系统取key_N=10(太小时
12、,键的灵敏度下降,太小时会出现连击) ,key_R=30 (30*0.01=0.3 秒),每秒 3 个字符比较合适。以上程序可直接输出扫描码,若想给每个键一个编码(与字符集编码相对应)很容易。设输出缓冲字节为 key_code,Switch(c)Case 0x77: key_code=0;break;Case 0xb7: key_code=1;break;Case 0xee: key_code=11;break;Default: key_code=0xff;虽然这个函数是面向硬件的,但由于它必须在定时中断中调用,而定时中断程序是在软件框架的主程序模块中,所以这个程序也必须外部函数,变量 key
13、_code 是该函数与其他函数交换的信息,必须被定义为模块级共用变量Char key_code函数原型 extern void key_board(void)(4)其他两个函数Extern char inkey(void) 返回当前的键码Return(key_code);Extern char _getkey(void)Char a;While(key_code=0xff);无键按下时等待;A=key_code;Key_code=0xff;Return(a)2.3.3 测试与软件框架 LCD 显示程序一起测试将 key_scan 加入到软件框架的定时中断中在软件框架主循环中加入Main_loop:C=getkey();Style_5x7(c);Goto main_loop;就可以实现按一个键显示一个字符,添加 N 个语句就可以实现回车操作。