本系统中,CPLD部分采用VHDL进行编程,主程序采用C语言进行编程,便于程序的移植,并使其具有较高的可读性。首先解决DSP与LCD的时序匹配问题,时序匹配是DSP控制LCD最关键的问题,其实质是如何编写程序对LCD的指令寄存器和数据寄存器进行读写操作,接口时序如图3和图4所示。
使用显示模块时应注意以下几点:(1)欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字母编码。(2)显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。(3)当字符编码为两字节时,应先写入高位字节,再写入低位字节。(4)模块在接收指令前,处理器必须先确认模块内部处于非忙状态,则读取BF标志,BF需为“0”,方可接收新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。
通过初始液晶显示屏以及调用字库显示汉字和字符来具体说明DSP控制液晶显示屏的设计思想。系统硬件上电复位后,首先完成DSP的初始化,然后根据用户系统的需要对控制器的各项指令代码及其参数进行设置,以完成液晶模块的参数以及显示方式等一系列过程的初始化。液晶模块具体编程如下:
#include"DSP28_Device.h"
unsignedint*LcdComL=(unsignedint*)0x5100;//命令寄存器低地址
unsignedint*LcdComH=(unsignedint*)0x5200;//命令寄存器高地址
unsignedint*LcdDatL=(unsignedint*)0x5300;//数据寄存器低地址
unsignedint*LcdDatH=(unsignedint*)0x5400;//数据寄存器高地址
voidWriteLcdCom(unsignedcharc);//写命令
voidWriteLcdDat(unsignedchard);//写数据
voiddelay(unsignedintt);//延时
voidmain(void)//主程序
{InitSysCtrl();//初始化系统
DINT;//关中断
IER=0x0000;
IFR=0x0000;
InitPieCtrl();//初始化
PIEInitPieVectTable();//初始化
PIE中断矢量表
InitPeripherals();//初始化外设
LcdComL=0x00;//初始化命令寄存器
LcdDatL=0x00;//初始化数据寄存器
WriteLcdCom(0x01);//清除显示屏
WriteLcdCom(0x0e);//显示状态打开
WriteLcdCom(0x30);//LCD选择为8位并行数据传输方式
比如要在显示屏第一行显示“检测物质:Theanol”
WriteLcdCom(0x80);//写第一个字符的地址
WriteLcdDat(0xbc);//第一个汉字“检”的高字节
WriteLcdDat(0xec);//“检”的低字节
WriteLcdDat(0xb2);//汉字“测”高字节
WriteLcdDat(0xe2);//“测”低字节
WriteLcdDat(0xce);//汉字“物”高字节
WriteLcdDat(0xef);//汉字“物”低字节
WriteLcdDat(0xd6);//汉字“质”高字节
WriteLcdDat(0xca);“质”低字节
WriteLcdDat(0x3a);//冒号“:”
WriteLcdDat(0x45);//字符“T”
WriteLcdDat(0x74);//字符“h”
…for(;;);
}voidWriteLcdCom(unsignedcharc){*LcdComH=c;
*LcdComL=c;
delay(5000);}voidWriteLcdDat(unsignedchard){*LcdDatH=d;
*LcdDatL=d;
delay(5000);}voiddelay(unsignedintt){while(t>0)
t--;}
以上程序均在DSP集成开发环境CCS中调试通过,LCD显示屏上可以正常显示连续的汉字、字符以及图形等,在实际的嵌入式数据采集系统中得以应用。通过移植本文的程序,修改其中一些命令,可以完成更加复杂的功能,并且具有缩短产品开发周期,加快产品上市等优点,因此非常适合便携式设备的界面显示系统。
结论
本文作者创新点:以DSP为核心处理器,利用CPLD来进行逻辑转换和控制,实现高速CPU处理器和低速外设接口的时序匹配,同时采用了移植性能和可读性能高的C程序设计,无需插入等待周期,在实际的嵌入式系统中成功运行,为快速处理器与慢速外设的接口设计提供了一种借鉴的方法。