摘要:针对利用微控制器(MCU)控制液晶显示驱动器(LCD)的应用开发实例,提出一种采用串行方式来设计微控制器和液晶显示驱动器之间接口的方案。该方案是在现有点阵式液晶显示屏上附加一个MCU,通过程序设计利用MCU的I/O端口去模拟I2C串行总线,从而实现利用MCU去控制LCD的目的;同时介绍一种在图符液晶显示系统中显示动态曲线的技术和实现方法。 关键词:液晶显示驱动器 I2C串行总线 MSP430 1 概述 点阵式液晶与外部的硬件接口简单,能以点阵或图形方式显示出各种信息,因此在电子设计中得到广泛应用。但是,对它的接口设计必须遵循一定的硬件和时序规范,不同的液晶显示驱动器,可能需要采用不同的接口方式和控制指令才能够实现所需信息的显示。某些液晶显示驱动器与外部的接口必须采用串行方式,而其串行接口往往不是标准的串行接口,这就为这类液晶显示驱动器的设计带来了困难。 针对上述问题,本文提出一种利用微控制器(MCU)的I/O端口,通过软件设计模拟与所使用的液晶显示驱动器规范相符的串行总线的设计思想,实现MCU对液晶显示驱动器的控制,从而建立起一套不但可以显示各种字符,而且可以动态显示曲线的游人显示系统。 2 系统设计 本文所建立的液晶显示系统,选用美国德州仪器(TI)公司的MSP430F149微控制器来控制液晶显示驱动器uPD16682A,从而实现各种信息的显示。 2.1 MSP430F14X微控制器简介 TI公司的MSP430F14X微控制器与其它MSP430系列微控制器相同,均甚至一个真正的正交16位RISC CPU内核:具有16个可单周期全寻址的16位寄存器,仅27条的精简指令集以及7种均采用双重取数据技术(DDFT)的一致性寻址方式。DDFT技术利用每个时钟脉冲对存储器进行两次数据存取操作。从而不再需要复杂的时钟乘法和指令流水线方案。 MSP430F14X系列MCU片内不但包括60多KB的Flash、2KB的RAM、一个看门狗时钟、12位16通道的A/D转换器、定时器、高精度比较器、PWM以及高速的USART控制器等常用资源,还在某些型号中集成了LCD控制器。其I/O资源丰富,且每个输入/输出(I/O)引脚上都提供了矢量中断功能,每个外围器件都支持复杂的事件驱动型操作。同其它微控制器相,带片内Flash的微控制器可将系统功耗降低5倍,并且减小了硬件线路板空间,与现代程序设计技术(如计算分支以及高级语言(如C语言)结合使用,使得MSP430的体系结构更为高效。 MSP430F14X可采用一个集成的数字控制振荡器(DCO)或外部高速晶振对系统进行定时,其工作电压范围为1.8~3.6V,并可根据需要提供高达8MIPS(每秒百万条指令)的操作性能,对于对成本非常敏感的应用,该系列器件能够采用DCO来工作而无需外部晶振,快速的指令执行周期配之以低于6ms的等机启动时间,使得系统总功耗比竞争器件低了10倍,大大延长了诸如公用设施计量、便携式仪表测试和智能检测等工程应用系统中的电池使用寿命。 MSP430F14X系列微控制器允许用户使用标准C语言进行程序编程,并提供高效的C语言编译环境;配之以支持对具有仿零点功能的快闪产品进行丰取的快速实时仿真工具FET及优良的调试环境,使MSP430F14X系列微控制器在工程设计中得到了广泛应用。 2.2 液晶显示驱动器uPD16682A简介 uPD16682是NEC公司2001年初推出的液晶显示驱动器,该产品内置大容量显示RAM内存,并能够提供132×65点阵的全点显示,特别适合用于16×16或12×12点阵中、日文字符显示。该产品采用+3V单电源供电,内置升压电路并具3倍压和4倍压两种工作模式,支持8位串行或并行数据的输入,内置时钟发生电路和程序可编程控制的偏压电路。 (1)uPD16682A的显示内存 uPD16682A的显示RAM内存保存着被显示内容的点阵信息。显示RAM的每一位对应显示屏上的一个点,总共可以存储132×65点的信息;通过选择对应的RAM页地址和列地址,微控制器可以访问其中的任何一个点。微控制器对uPD16682A的显示RAM的读写操作通过uPD16682A的I/O缓冲器进行(串行模式下uPD16682A不支持读操作),并且该读操作和液晶显示屏驱动信号的读取操作是独立的,因此,当显示内存的数据同时被双方访问时,不会出现显示信息的抖动等现象。从微控制器读入的显示数据按照D7~D0的数据位顺序与液晶显示屏的行顺序一一对应,其显示关系对应图如图1所示。如果在系统中使用了多片uPD16682A,则在片间进行显示数据的转移和显示一整幅图案时用户就会有很大的自由度。 (2)uPD16682A与微控制器的接口 uPD16682A可以通过8位双向数据总线(并行模式下)或者通过串行总线接收来自微控制器的数据,这两种模式可以通过将其P/S引脚置高或置低进行选择。当工作于并行输入模式下时,uPD16682A的片选信号端、读写信号端以及控制信号端(A0)和数据线(D0~D7)都应该同微控制器的对应端口进行连接。此时uPD16682A内部显示RAM的数据以刷新液晶显示的内容,也可以通过数据总线读取显示内存的内容。当工作于串行模式下,uPD16682A仅使用数据线D6输入串行数据,即串行总线的数据输入端(SI),数据线D7被用作时钟输入(SCL)端,并将片将信号和控制信号(A0)同微控制器总线进行连接,置高或接地读写信号。此时uPD16682A内部显示RAM的数据访问是单向的,即微控制器只可以向显示RAM写数据以刷新液晶显示的内容,但不可以读取显示RAM的内容。 (3)uPD16682A的串行接口 uPD16682A的串行接口是TTL电平,不是标准的串行接口,对串行数据的接收没有具体波特率、数据接口协议的要求,内部包括1个8位的移位寄存器和1个3位的计数器。UPD16682A在每个串行时钟的上升沿将串行数据捕获到其内部的移位寄存器,同时计数器自动加1。当串行数据按照D7~D0的顺序被依次捕获到后,在第8个时钟周期的上升沿,已接收到内部的8位串行数据被转换成一个8位的并行数据;同时,uPD16682A读取控制信号线A0上的电平,并且根据A0信号来判断当前被写入的8位串行数据是一个显示数据还是一个控制命令。对控制信号线A0的读操作由uPD16682A的内部定时器来控制,在每隔8个串行时钟之后自动操作一次。 (4)uPD16682A的控制指令 uPD16682A通过读取其控制信号线A0的电平来判断当前从片外设备接收的数据是一个显示数据还是控制命令。当A0电平为高时,认为接收到的是一个显示数据;而当A0电平为低时,则认为接收到的是一个显示控制命令。利用uPD16682A的控制命令可以实现对uPD16682A大多数操作的控制。 2.3 uPD16682A与MSP430F149的硬件接口设计 图2是系统uPD16682A与MSP430F149的硬件接口示意图。图中系统采用4MHz晶振,并由系统时钟分频得到其它内外设所用的时钟。MSP430F149和uPD16682A相连接的I/O口被定义为输出,MSP430F149利用片内12位A/D采集传感器变换后的电压信号。经程序处理后,通过上述I/O口传送到uPD16682A进行信息显示。由于驱动液晶显示的电压需要十几V,如果系统板采用+3V单供电,则液晶显示驱动器必须采用片内升压电路。图中uPD16682A采用内部4倍压连接方式。 2.4 软件设计 MSP420F149允许用户标准C进行编程,并提供高效的C编译环境。如果对程序运行时间的要求不是很荷刻,采用C语言进行程序开发应当是编程人员的首先。以下主要介绍关于自定义串口总线的程序设计,同时介绍一种在uPD16682A下的画点和画线函数,提供在衅符显示屏下显示曲线的实现方法,从而为程序实现动态显示波形提供了可能。 2.4.1 串行口控制程序 微控制器送往uPD16682A的数据有显示数据或显示命令两种。两者的区分由uPD16692A控制信号线A0的状态来表征,因此将MSP430F149的Port2.2端口电平置高或置低就可控制uPD16682A的状态。 按照uPD16682A串行接口听原理,为了向其写入一个8位或16位的数据,首先必须通过程序设计向uPD16682A产生一个时钟输出。时钟产生可以有两种方式。一是利用微控制器定时器中断,定时依次从I/O端口输出高、低电平。二是利用指令产生和数据同步的时钟脉冲,通过产生一个电平的跳变沿将位数据送到uPD16682A,然后通过逐次移位,就可以将一个8位数据写进uPD16682A内部的数据锁存器。在第8个时钟脉冲的上升沿,锁存器中数据炙一个8位的并行数据,同时根据A0信号线睥电平来显示图符或执行相应的控制命令。虽然这里的串行数据的发送没有具体波特率和数据接口协议的要求,但是在编写程序时,必须认真考虑串行方式下各个信号的时序。以下是向uPD16682A写入一个8位控制命令的程序: void Set_Address(unsigned char column,unsigned char page){ unsigned char ColH,ColL; //设页地址 ColH=page|0xB0; Write_Command(ColH); //设列地址 ColH=(column&0xF0)>>4; ColH|=0x10; ColL=column&0x0F; Write_Command(ColH); Write_Command(ColL); } 2.4.2 字符显示屏上的曲线绘制程序 有了上述程序,就可以方便地在uPD16682A上指定位置显示设定的图案和字符了。如果用户需要动态地展示信号波形和曲线,还可设计出专用的画点和画线函数,从而大大提高了字符液晶显示屏的动态图形显示能力。通常而言,液晶显示屏上的一点对应液晶显示驱动器显示RAM中的一位。显示RAM中的某位为1,则在液晶显示屏上的相应点即为点亮状态;而要想实现在液显示屏上动态的显示点和曲线,必须用到显示RAM中的数据。通常的做法是读取指定点周围的数据,然后在这些点中的某个指定位置插入1位,从而将液晶显示屏上的指定点点亮,这就是基本的画点原理。但是,在串行方式下,uPD16682A不具备数据读出能力。为此,我们仿照显示RAM显示的方式,在MSP430F149的数据区开辟了一块和uPD16682A显示RAM同样大小的内存块,在向uPD16682A显示RAM写入显示数据的同时,也向该内存块的对应位置写入同样的数据,保证了该内存块的内容和uPD16682A显示RAM中的数据是同步刷新的。因此在画点函数中,我们直接从该内存块中取出需要的显示数据进行处理,然后再通过自定义串行总线送往uPD16682A进行显示。用这种方式,我们实现了在液晶显示屏的任意位置画出一个点,并且还可以利用这种方式编制自己的画线函数,这样就使uPD16682A具备了动态显示波形的能力,也就扩展了字符液晶显示屏动态曲线波形的显示功能。以下是uPD16682A编写的画点函数: void DrawPointXY(unsigned char x,unsigned char y){ unsigned char page,dot,dat,CouL,CouH; dot=0x01; page=y/8; /*计算当前点页地址、列地址*/ r_page=page; /*点亮当前点并保持周围点信息不变*/ r_column=x; page|=0xB0; dat=y%8; dot=dot<<dat; CouH=(x&0xF0)>>4; /*通过自定义串行总线向uPD16682A发送数据*/ CouH=CouH|0x10; CouL=(x&0x0F); Write_Command(page); Write_Command(CouH); Write_Command(CouL); dat=DisplayRam[r_page][r_column]; dat|=dot; Write_DisplayData(dat); /*向显示RAM写入数据*/ } 程序中的二维全局数组DisplayRam[][]即为在MSP430F149中开辟的内存块,用于保存当前uPD16682A显示RAM中对应位置的显示数据。全局变量r_page和r_column分别保存8位显示数据的页地址和列地址。 如果想进一步实现曲线的显示,程序中则需要计算两个点之间在X方向和Y方向上的偏差,并依据偏差大小来插入要显示的点。本系统中,用这种设计方法获得了平滑的曲线显示效果。 3 应用 经实践证明,本文所介绍的利用微控制器的I/O端口实现微控制器和液晶显示驱动器之间的自定义串行总线的设计方案,取得了很好的应用效果。设计的液晶显示系统工作稳定可靠,开发的在字符型LCD下动态显示曲线波形的技术,扩展了字符型LCD动态显示曲线的功能,也为液晶显示驱动器的应用开发提供了一种新的途径。本文所提出的用软件模拟串行总线的方法具有很强的通用性,为实现I2C串行接口提供了一种新方式。 |