MSP430单片机与液晶显示器的串行接口方案设计(一(2)
2013-06-26 01:16
导读:bsp; 2.4 软件设计 MSP420F149允许用户标准C进行编程,并提供高效的C编译环境。如果对程序运行时间的要求不是很荷刻,采用C语言进行程序开发应当是编程人
bsp;
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;
(科教范文网 lw.nSeAc.com编辑发布)
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写入数据*