DSP课程设计液晶显示器控制显示.docx
《DSP课程设计液晶显示器控制显示.docx》由会员分享,可在线阅读,更多相关《DSP课程设计液晶显示器控制显示.docx(19页珍藏版)》请在冰点文库上搜索。
DSP课程设计液晶显示器控制显示
一、设计题目:
液晶显示器控制显示
二、设计目的与步骤:
2.1、设计目的
通过实验学习使用VC5416DSP的扩展I/O端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。
2.2、设计步骤
1.实验准备:
⑴连接实验设备:
请参看本书第三部分、第一章、二。
2.设置CodeComposerStudio2.21在硬件仿真(Emulator)方式下运行:
3.启动CodeComposerStudio2.21:
选择菜单Debug→ResetCPU。
4.打开工程文件:
浏览LCD.c文件的内容,理解各语句作用
工程目录:
C:
\ICETEK\VC5416AES61\VC5416AES61\Lab0403-LCD\LCD.pjt。
5.编译、下载程序。
6.运行程序观察结果:
7将内层循环中的“CTRLCDLCR=(nBW==0)?
(ledkey[nCount][i]):
(~ledkey[nCount][i]);”语句改为“CTRLCDRCR=(nBW==0)?
(ledkey[nCount][i]):
(~ledkey[nCount][i]);”,重复步骤5-6,实现在屏幕右侧显示。
8.更改程序中对页、列的设置,实现不同位置的显示。
9.自己设计一些控制语句,实现不同显示效果。
10.结束程序运行,退出CCS。
三、设计原理:
3.1、扩展IO接口:
ICETEK-VC5416-A是一块以TMS320VC5416ADSP为核心的DSP扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。
3.2、液晶显示模块的访问、控制是由VC5416DSP对扩展接口的操作完成。
控制口的寻址:
命令控制接口的寄存器为CTRLCDCMDR,数据控制接口的寄存器为CTRLCDLCR和CTRLCDRCR,辅助控制接口的寄存器为CTRLCDCR。
3.3、液晶显示模块编程控制:
液晶显示模块的访问、控制是由TMS320VC5416对扩展接口的操作完成。
3.4、控制I/O口的寻址:
命令控制接口CTRLCDCMDR的地址为0x8001,数据控制接口的地址为CTRLCDLCR:
0x8003和CTRLCDRCR:
0x8004,辅助控制接口CTRLCDCR的地址为0x8002。
3.5、显示控制方法:
液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。
其地址与象素的对应方式参见表2-3:
表2-3地址与象素的对应方式
左侧显示内存
右侧显示内存
Y=
0
1
···
62
63
0
1
···
62
63
行号
DB0
DB0
DB0
DBO
DBO
DBO
DBO
DBO
DBO
DBO
0
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
X=0
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
7
DB0
DB0
DB0
DB0
DB0
DB0
DB0
DB0
DB0
DB0
8
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
55
X=7
DB0
DBO
DBO
DBO
DBO
DBO
DBO
DBO
DBO
DBO
56
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
DB7
63
-发送控制命令:
向液晶显示模块发送控制命令的方法是通过向命令控制I/O接口写入命令控制字,然后再向辅助控制接口写入0。
由于液晶模块相对于DSP来讲是慢速设备,在命令之间可能需要增加延时语句。
下面给出的是基本命令字、解释和C语言控制语句举例。
.显示开关:
0x3f打开显示;0x3e关闭显示;
CTRLCDCMDR=0x3f;CTRLCDCR=0;//将液晶显示打开
CTRLCDCMDR=0x3e;CTRLCDCR=0;//将液晶显示关闭
.设置显示起始行:
0x0c0+起始行取值,其中起始行取值为0至63;
CTRLCDCMDR=0x0c0;CTRLCDCR=0;//设置从存储器第0行开始显示
CTRLCDCMDR=0x0c8;CTRLCDCR=0;//设置从存储器第8行开始显示
.设置操作页:
0x0b8+页号,其中页号取值为0-7;
CTRLCDCMDR=0x0b0;CTRLCDCR=0;//设置即将操作的存储器第0页
CTRLCDCMDR=0x0b2;CTRLCDCR=0;//设置即将操作的存储器第2页
.设置操作列:
0x40+列号,其中列号为取值为0-63;
CTRLCDCMDR=0x40;CTRLCDCR=0;//设置即将操作的存储器第0列
CTRLCDCMDR=0x44;CTRLCDCR=0;//设置即将操作的存储器第4列
-写显示数据:
在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。
将数据发送到相应数据控制I/O接口即可。
由于液晶模块相对于DSP来讲是慢速设备,在命令之间可能需要增加延时语句。
C语言语句举例说明:
CTRLCDLCR=0x80;CTRLCDCR=0;//向左侧屏幕缓存存入数0x80,
//如果显示行、页号和列号均为0
//时,屏幕上第8行第1列将显
//示黑色象素
CTRLCDRCR=0x01;CTRLCDCR=0;//向右侧屏幕缓存存入数据1,如
//果显示行、页号和列号均为0
//时,屏幕上/第1行第65列将显
//示黑色象素
3.6.液晶显示器与DSP的连接:
3.7、数据信号的传送:
由于液晶显示模块相对运行在高主频下的DSP属于较为慢速设备,连接时需要考虑数据线上信号的等待问题;
电平转换:
由于DSP为3.3V设备,而液晶显示模块属于5V设备,所以在连接控制线、数据线时需要加电平隔离和转换设备,如:
ICETEK-CTR板上使用了74LS245。
四、CCS开发环境
4.1、CCS是一种针对TMS320系列DSP的集成开发环境,在windows操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪和分析等工具,提供了配置、建立、调试、跟踪和分析程序的工具,从而完成编辑、编译、链接、调试和数据分析等工作。
利用ccs集成开发软件,用户可以在一个开发环境下完成工程项目创建、程序编辑、编译、链接、调试和数据分析等工作环节。
使用ccs开发应用程序的一般步骤为:
1.打开或创建一个工程项目文件,包括源程序、目标文件、库文件、链接命令文件和包含文件。
2.编辑各类文件。
可以使用ccs提供的集成编辑环境,对头文件、链接命令文件和源程序进行编辑。
3.对工程项目进行编译。
如出现语法错误,将在构建窗口中显示错误信息。
用户可以根据显示信息定位错误信息,更改错误。
4.对结果和数据进行分析和算法评估。
用户可以利用ccs提供的探测点、图形显示、性能评价等工具,对运行结果、输出数据进行分析,评估算法性能。
4.2、ICETEKDSP教学实验箱结构图(参见图2-2)
图2-2DSP教学实验箱结构图
通用控制模块部分:
显示输出:
-液晶显示(LCD):
128×64像素点阵图形显示屏。
-发光二极管:
指示灯(12只,分为红、黄、绿三种颜色)
音频输出:
D/A输出提供音频插座,可直接接插耳机。
键盘:
17键数字键盘(标准PS2接口)。
步进电机:
四相步进电机,步距角5.625,起动频率≥300PPS,运行频率≥900PPS,可由DSPI/O端口控制旋转和方向、速度。
直流电机:
空载转速3050转/分,输出功率1.35W,启动力矩21.3N,可以接收DSP输出的PWM控制信号,实现电机的转速和方向控制。
ICETEKDSP教学实验箱的外围接口:
外围接口PA:
ICETEK-VC5416-A扩展接口P4
外围接口PB:
ICETEK-VC5416-A扩展接口P3。
五、C语言程序
//常量定义
#defineLCDDELAY1
#defineLCDCMDTURNON0x3f
#defineLCDCMDTURNOFF0x3e
#defineLCDCMDSTARTLINE0xc0//起始行为第0行
#defineLCDCMDPAGE0xb8//起始页为第0页
#defineLCDCMDVERADDRESS0x40//起始列为第0页
#defineWAITSTATUS(*(unsignedint*)0x28)
//CTR扩展寄存器定义
ioportunsignedintport8000;
ioportunsignedintport8001;
ioportunsignedintport8002;
ioportunsignedintport8003;
ioportunsignedintport8004;
ioportunsignedintport8005;
ioportunsignedintport8007;
#defineCTRGRport8000
#defineCTRLCDCMDRport8001
#defineCTRKEYport8001
#defineCTRCLKEYport8002
#defineCTRLCDCRport8002
#defineCTRLCDLCRport8003//输出显示在左侧屏幕
#defineCTRLCDRCRport8004//输出显示在右侧屏幕
#defineCTRLAport8005
#defineCTRLRport8007
voidDelay(unsignedintnTime);//延时函数
voidTurnOnLCD();//打开显示
voidLCDCLS();//清除屏幕显示内容
unsignedcharledkey[10][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},//3
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},//4
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},//5
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},//6
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},//7
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},//8
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}//9
};
//主函数
main()
{
inti,nCount=0,nBW=0;定义变量
CTRGR=0;//初始化ICETEK-CTR
CTRGR=0x80;
CTRGR=0;
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
TurnOnLCD();//子函数调用,打开显示
LCDCLS();//子函数调用,清除显示内存
CTRLCDCMDR=LCDCMDSTARTLINE;//设置显示起始行
CTRLCDCR=0;
for(;;)//设置无限循环,行列初始化,并输出要显示的内容
{
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);//延时
CTRLCDCR=0;
Delay(LCDDELAY);//延时
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);//延时
CTRLCDCR=0;
Delay(LCDDELAY);//延时
for(i=0;i<8;i++)//设置八次循环,每次循环显示一个数
{
CTRLCDLCR=(nBW==0)?
(ledkey[nCount][i]):
(~ledkey[nCount][i]);//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
nBW=0则取原数字,十个数显示完nBW取反,则对数据取反
Delay(LCDDELAY);//延时
CTRLCDCR=0;
Delay(LCDDELAY);//延时
}
Delay(512);//延时
nCount++;//显示完一个数则加一,显示下一个数
if(nCount==10)
{
nCount=0;//十个数显示完则对nCount赋值为0,重新开始显示
nBW=1-nBW;//nBW为字节定义,十个数显示完则取反
}
}
}
//延时子函数
voidDelay(unsignedintnDelay)
{
intii,jj,kk=0;
for(ii=0;ii{
for(jj=0;jj<1024;jj++)
{
kk++;
}
}
}
//液晶屏打开
voidTurnOnLCD()
{
CTRLCDCMDR=LCDCMDTURNON;//赋值0x3f
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDSTARTLINE;//赋值0x3e
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
//清除液晶屏幕内容
voidLCDCLS()
{
inti,j;
CTRLCDCMDR=LCDCMDSTARTLINE;//从第0行开始
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(i=0;i<8;i++)//共8页,一页一页的清屏
{
CTRLCDCMDR=LCDCMDPAGE+i;//清完一页进入下一页
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(j=0;j<64;j++)//每页64列,一列一列清屏
{
CTRLCDLCR=0;
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDPAGE+i;
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(j=0;j<64;j++)
{
CTRLCDRCR=0;
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
}
六、实验结果和分析
6.1、原程序实验结果如图一所示
图一
6.2、将程序中CTRLCDLCR=(nBW==0)?
(ledkey[nCount][i]):
(~ledkey[nCount][i]);语句改为“CTRLCDRCR=(nBW==0)?
(ledkey[nCount][i]):
(~ledkey[nCount][i]);”后,数字应该显示在右半屏的第0行、第0列,实验结果如下
图二
6.3、将LCDCMDSTARTLINE的值改为0xcf,LCDCMDPAGE0xbc3,显示结果如下图所示
图三
6.4、将主函数中的if语句前添加语句:
LCDCMDVERADDRESS++;
if(LCDCMDVERADDRESS==63)LCDCMDVERADDRESS=0;
结果显示如下图所示
图四
七、设计收获及体会
通过这次课程设计让我们更多的了解了更多关于DSP的知识和协作的重要,也看清了现代电子科技对我们的生活的影响,同时也巩固了我们的专业知识。
此次课程设计也会是我们在大学时期的很好的一次实践和锻炼机会。
让我们在以后的学习中更加努力刻苦。