键盘输入控制LED灯设计.docx
《键盘输入控制LED灯设计.docx》由会员分享,可在线阅读,更多相关《键盘输入控制LED灯设计.docx(19页珍藏版)》请在冰豆网上搜索。
![键盘输入控制LED灯设计.docx](https://file1.bdocx.com/fileroot1/2023-1/8/9dd58652-2243-4b02-9d98-c60a8beab72b/9dd58652-2243-4b02-9d98-c60a8beab72b1.gif)
键盘输入控制LED灯设计
DSP原理及应用
课程设计
键盘输入设计
学院 :
电气信息工程学院
专业 电子信息工程
班级 电子一班
分组成员
联系方式
指导教师
2012年6月
摘要
DSP技术一般指将DSP处理器用于完成数字信号处理的方法与技术。
目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。
许多领域对于数字信号处理器的应用都是围绕美国德州仪器所开发的DSP处理器来进行的。
DSP芯片是一种特别适合于进行数字信号处理运算的微处理器。
关键词:
DSP;TMS320VC5416;键盘;指示灯
一.设计目的
DSP课程设计是对课程所学理论知识的深化和提高。
目的是能综合应用所学知识,设计与制造出具有简单功能的小型键盘输入发声装置。
能够较全面地巩固和应用DSP课程中所学的基本理论和基本方法,初步掌握小型DSP系统设计的基本方法,并学会用C语言对DSP系统进行编程及DSP试验箱和相关软件的运用。
培养独立思考、独立收集资料、独立设计规定功能的单片机系统的能力;培养分析、总结及撰写技术报告的能力,本次课程设计目的在于:
1、学习用键盘控制DSP管脚输出,从而控制LED灯的闪亮。
2、学习DSP的C语言编程方法。
3、学习DSP程序的调试及编写,及运用观察变量的方法查看程序的运行情况。
二.设计原理
1.扩展IO接口:
ICETEK-VC5416-A是一块以TMS320VC5416DSP为核心的DSP扩展评估板,它通过扩展IO接口与实验箱的显示/控制模块连接,可以控制其各种外围设备,也可以接收外设发送的各种数据、信息。
2.键盘的扫描码
由DSP的扩展寄存器CTRKEY给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0。
各按键的扫描码排列如下所示(scancode.h)。
#defineSCANCODE_11
#defineSCANCODE_22
#defineSCANCODE_33
#defineSCANCODE_44
#defineSCANCODE_55
#defineSCANCODE_66
#defineSCANCODE_77
#defineSCANCODE_88
#defineSCANCODE_99
3.控制模块共有8个寄存器
如表1-1定义:
表1-1控制和状态寄存器列表
名称
地址
功能
属性
CTRGR
Port8000
全局控制寄存器
W
CTRLCDCR
Port8002
液晶控制寄存器
W
CTRLCDCMDR
Port8001
液晶命令寄存器
W
CTRLCDLCR
Port8003
液晶左半屏控制寄存器
W
CTRLCDRCR
Port8004
液晶右半屏控制寄存器
W
CTRLR
Port8007
辅助控制寄存器
W
CTRKEY
Port8002
键盘数据回读寄存器
R
CTRSPEED
Port8003
电机速度回读寄存器
R
显示控制模块有一个全局控制寄存器CTRGR,地址映射在TMS320VC5416的IO扩展空间上,地址为0x8000。
其各位上的定义如表1-2:
表1-2全局控制寄存器CTRGR
Bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
GS
保留
保留
保留
BUZZE
PWME
IOPE
DCME
GS:
全局控制标志位;
BUZZE:
蜂鸣器使能;
PWME:
PWM控制使能;
IOPE:
通用I/O端口(PA-LED)直接控制交通灯北方向红灯使能;
DCME:
直流电机使能;
例如需要使能直流电机,可以用以下C语言语句:
CTRGR=1;
4、发光二极管编程控制:
显示/控制模块上的发光二极管是由连接在5416DSP扩展地址接口上的寄存器EWR和SNR控制的。
这两个寄存器均为6位寄存器,其位定义参见表1-3、表1-4:
表1-3寄存器EWR
Bit7
Bit6
bit5
bit4
bit3
bit2
bit1
bit0
0
0
东-红
东-黄
东-绿
西-红
西-黄
西-绿
表1-4寄存器SNR
Bit7
Bit6
Bit5
bit4
bit3
bit2
bit1
bit0
0
1
南-红
南-黄
南-绿
北-红
北-黄
北-绿
两个寄存器的地址均映射到5416DSP的IO扩展空间,CTRLR地址为0x8007,DSP通过对该地址的写操作来修改两个寄存器上各位的状态,当寄存器某位取‘1’值时,相应指示灯被点亮,取‘0’值则熄灭。
当写入CTRLR的数据(8位有效值)的高两位为‘00’时,数据的低6位将写入EWR寄存器;当高两位的值为‘01’时,写入SNR寄存器。
例如:
需要点亮东、西方向的红灯和南、北方向的绿灯,其它灯均熄灭时,可以用下面C语句完成。
对于高速DSP,可能需要在两个语句之间加入延时语句。
CTRLR=0x024;CTRLR=0x49;
5、发光二极管显示阵列编程控制:
发光二极管显示阵列的显示是由I/O扩展端口控制,DSP须将显示的图形按列的顺序存储起来(8×8点阵,8个字节,高位在下方,低位在上方),然后定时刷新控制显示。
具体方法是,将以下控制字按先后顺序,每两个为一组发送到全局控制寄存器的第6-4位和端口CTRLA,地址是0x8005发送完毕后,隔不太长的时间(以人眼观察不闪烁的时间间隔)再发送一遍。
由于位值为“0”时点亮,所以需要将显示的数据取反。
000B,第8列数据取反;001B,第7列数据取反;
010B,第6列数据取反;011B,第5列数据取反;
100B,第4列数据取反;101B,第3列数据取反;
110B,第2列数据取反;111B,第1列数据取反。
注意:
在使用前须在I/O端口CTRLR写入控制字0x0C1,以打开此设备。
关闭时写0x0C0。
6.键盘输入编程控制:
键盘的扫描码由DSP的CTRKEY扩展地址0x8001给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0。
CTRCLKEY地址为0x8002。
读取的方法如下:
nScanCode=CTRKEY;nnn=CTRCLKEY;//nScanCode中为扫描码
三.设置CCS
1、设置CCS(通过ICETEK-5100USB仿真器连接ICETEK-VC5416-A硬件环境进行软件调试和开发)
(1)单击桌面上图标:
进入CCS设置窗口。
(2)在出现的窗口中按标号顺序进行如下设置:
(3)接着在下面的窗口中按标号顺序进行如下选择:
(4)在出现的窗口按标号顺序进行如下设置:
(5)在出现的窗口按标号顺序进行如下设置:
以上设置完成后,CCS已经被设置成Emulator的方式(用仿真器连接硬件板卡的方式),并且指定通过ICETEK-5100USB仿真器连接ICETEK-VC5416-A评估板。
如果您需要一直使用这一方式就不需要重新进行以上设置操作了。
四、实验步骤
1.启动Simulator方式
双击桌面上图标:
2.启动Emulator方式
(1)首先将实验箱电源关闭。
连接实验箱的外接电源线。
(2)检查ICETEK-5100USB仿真器的黑色JTAG插头是否正确连接到ICETEK-VC5416-A板的J3插头上。
注:
仿真器的插头中有一个孔加入了封针,与J3插头上的缺针位置应重合,保证不会插错。
(3)检查是否已经用电源连接线连接了ICETEK-VC5416-A板上的POW1插座和实验箱底板上+5V电源插座。
(4)检查其他连线是否符合实验要求。
检查实验箱上三个拨动开关位置是否符合实验要求。
(5)打开实验箱上电源开关(位于实验箱底板左上角),注意开关边上红色指示灯点亮。
ICETEK-VC5416-A板上指示灯D5和D6点亮。
如果打开了ICETEK-CTR的电源开关,ICETEK-CTR板上指示灯L1、L2和L3点亮。
如果打开了信号源电源开关,相应开关边的指示灯点亮。
(6)用实验箱附带的USB信号线连接ICETEK-5100USB仿真器和PC机后面的USB插座,注意ICETEK-5100USB仿真器上指示灯Power和Run灯点亮。
(7)双击桌面上仿真器初始化图标:
如果出现下面提示窗口,表示初始化成功,按一下空格键进入下一步操作。
如果窗口中没有出现“按任意键继续…”,请关闭窗口,关闭实验箱电源,再将USB电缆从仿真器上拔出,返回第
(2)步重试。
如果窗口中出现“Theadapterreturnedanerror.”,并提示“按任意键继续…”,表示初始化失败,请关闭窗口重试两三次,如果仍然不能初始化则关闭实验箱电源,再将USB电缆从仿真器上拔出,返回第
(2)步重试。
(8)双击桌面上图标:
启动CCS2.21。
(9)如果进入CCS提示错误,先选“Abort”,然后用“初始化ICETEK-5100USB2.0仿真器”初始化仿真器,如提示出错,可多做几次。
如仍然出错,拔掉仿真器上USB接头(白色方形),按一下ICETEK-VC5416-A板上S1复位按钮,连接USB接头,再做“初始化ICETEK-5100USB2.0仿真器”。
(10)如果遇到反复不能连接或复位仿真器、进入CCS报错,请打开Windows的“任务管理器”,在“进程”卡片上的“映像名称”栏中查找是否有“cc_app.exe”,将它结束再试。
3.选择菜单Debug→ResetCPU。
4.打开工程文件:
工程目录:
C:
\ICETEK\VC5416AES61\VC5416AES61\Lab0404-key\Key.pjt。
浏览key.c文件的内容,理解各语句作用。
5.编译并下载程序。
6.运行程序观察结果:
运行程序后,按小键盘上的数字键1到8,可以看到有相应的发光二极管点亮。
7.退出程序:
在小键盘上按“9”键,程序会退出并停止运行。
五、系统程序设计
1.程序流程图
开始
初始化:
DSP时钟、ICETEK-CTR
选通发光二极管显示阵列
有键盘输入?
适当延时
否
是
输入“9”键?
否
是
点亮相应的指示灯
关闭打开的ICETEK-CTR设备
结束
2.参数变量解读
(1)函数指针定义:
函数类型(*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int(*f)(intx);
double(*ptr)(doublex);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
(2)访问I/O空间:
I/O空间地址声明
要在程序中访问io空间地址,必须首先用关键字“ioport”对要访问的地址进行定义。
语法:
ioporttypeporthex_num
ioport声明io空间端口变量的关键字;
type变量类型,可以为char,short,int或unsignedint;
porthex_num端口号,port后面接16进制数字。
ioportunsignedintport10;
注:
声明io空间地址必须在C文件起始声明,不允许在函数中使用ioport声明io空间地址。
3.源程序逐段逐句功能解读
#include"scancode.h"
#defineREGISTERCLKMD(*(unsignedint*)0x58)
//定义指REGISTERCLKMD并存放在0x58单元中
//CTR扩展寄存器定义
ioportunsignedintport8000;//访问I/O口8000空间
ioportunsignedintport8001;//访问I/O口8001空间
ioportunsignedintport8002;访问I/O口8002空间
ioportunsignedintport8003;//访问I/O口8003空间
ioportunsignedintport8004;//访问I/O口8004空间
ioportunsignedintport8005;//访问I/O口8005空间
ioportunsignedintport8007;//访问I/O口8006空间
#defineCTRGRport8000
#defineCTRLCDCMDRport8001
#defineCTRKEYport8001
#defineCTRCLKEYport8002
#defineCTRLCDCRport8002
#defineCTRLCDLCRport8003
#defineCTRLCDRCRport8004
#defineCTRLAport8005
#defineCTRLRport8007
voidDelay(unsignedintnTime);//声明延时子程序
voidRefreshLEDArray();//刷新显示
voidSetLEDArray(intnNumber);//修改显示内容
charConvertScanToChar(unsignedcharcScanCode);//将键盘扫描码转换为字符
unsignedcharledbuf[8],ledx[8];
//字库0-9
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},
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}
};
main()
{
unsignedintnKeyCode;//定义无符号整形变量nKeyCode
unsignedchartKey;//定义无符号字符变量tKey
tKey=0;//初始化tKey
REGISTERCLKMD=0;//初始化REGISTERCLKMD
CTRGR=0;//初始化ICETEK-CTR
CTRGR=0x80;//开启全局控制标志位
CTRGR=0;//不需要使能直流电机
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
CTRLR=0x0c1;//写入控制字0x0C1,以打开I/O设备
tKey=CTRCLKEY;//清键盘缓冲区
for(;;)
{
nKeyCode=CTRLCDCMDR;
nKeyCode&=0x0ff;
tKey=CTRCLKEY;
if(nKeyCode!
=0&&nKeyCode!
=0x0ff)
{
if(nKeyCode==SCANCODE_9)
{
break;//当按9的时候关闭打开的ICETEK-CTR设备,程序结束
}
else
{
switch(nKeyCode)
{
case1:
CTRLR=0x1;
CTRLR=0x40;//当按1时点亮西方的绿灯
break;//退出程序
case2:
CTRLR=0x2;
CTRLR=0x40;//当按2时点亮西方的黄灯
break;
case3:
CTRLR=0x4;
CTRLR=0x40;//当按3时点亮西方的红灯
break;
case4:
CTRLR=0x0;
CTRLR=0x48;//当按4时点亮南方的绿灯
break;
case5:
CTRLR=0x0;
CTRLR=0x50;//当按5时点亮南方的黄灯
break;
case6:
CTRLR=0x0;
CTRLR=0x60;//当按6时点亮南方的红灯
break;
case7:
CTRLR=0x8;
CTRLR=0x40;//当按7时点亮东方的绿灯
break;
case8:
CTRLR=0x10;
CTRLR=0x40;//当按8时点亮东方的黄灯
break;
}
}
}
Delay(16);//点亮相应的灯后适当延时
}
CTRLR=0;
CTRLR=0x40;//关闭所有的灯
exit(0);
}
voidDelay(unsignedintnDelay)//定义的延时函数
{
intii,jj,kk=0;//定义三个整形变量,并且kk=0
for(ii=0;ii{
for(jj=0;jj<64;jj++)//每一次的nDelay循环中有64次循环
{
kk++;
}
}
}
charConvertScanToChar(unsignedcharcScanCode)//定义将键盘扫描码转换为字符
{
charcReturn;//定义一个字符型变量cRerturn
cReturn=0;//赋初始值为0
switch(cScanCode)
{
caseSCANCODE_1:
cReturn='1';break;//把键盘“1”转换为字符型“1”
caseSCANCODE_2:
cReturn='2';break;//把键盘“2”转换为字符型“2”
caseSCANCODE_3:
cReturn='3';break;//把键盘“3”转换为字符型“3”
caseSCANCODE_4:
cReturn='4';break;//把键盘“4”转换为字符型“4”
caseSCANCODE_5:
cReturn='5';break;//把键盘“5”转换为字符型“5”
caseSCANCODE_6:
cReturn='6';break;//把键盘“6”转换为字符型“6”
caseSCANCODE_7:
cReturn='7';break;//把键盘“7”转换为字符型“7”
caseSCANCODE_8:
cReturn='8';break;//把键盘“8”转换为字符型“8”
caseSCANCODE_9:
cReturn='9';break;//把键盘“9”转换为字符型“9”
}
returncReturn;//把转换的字符返回到主函数
}
4.修改程序并实现相应的现象,部分程序如下:
main()
{
unsignedintnKeyCode;//定义无符号整形变量nKeyCode
unsignedchartKey;//定义无符号字符变量tKey
tKey=0;//初始化tKey
REGISTERCLKMD=0;//初始化REGISTERCLKMD
CTRGR=0;//初始化ICETEK-CTR
CTRGR=0x80;//开启全局控制标志位
CTRGR=0;//不需要使能直流电机
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
CTRLR=0x0c1;//写入控制字0x0C1,以打开I/O设备
tKey=CTRCLKEY;//清键盘缓冲区
for(;;)
{
nKeyCode=CTRLCDCMDR;
nKeyCode&=0x0ff;
tKey=CTRCLKEY;
if(nKeyCode!
=0&&nKeyCode!
=0x0ff)
{
if(nKeyCode==SCANCODE_9)
{
break;//当按9的时候关闭打开的ICETEK-CTR设备,程序结束
}
else
switch(nKeyCode)
{
case1:
CTRLR=0x09;
CTRLR=0x48;//当按1时点亮东西南三方的绿灯
break;
case2:
CTRLR=0x12;
CTRLR=0x50;//当按2时点亮东西南三方的黄灯
break;
case3:
CTRLR=0x24;
CTRLR=0x60;//当按3时点亮东西南三方的红灯
break;
case4:
CTRLR=0x09;
CTRLR=0x60;//当按4时点亮南方的红灯
break;
case5:
CTRLR=0x24;
CTRLR=0x48;//当按5时点亮东西方的红灯
break;
case6:
CTRLR=0x07;
CTRLR=0x40;//当按6时点亮西方的黄灯
break;
case7:
CTRLR=0x38;
CTRLR=0x40;//当按7时点亮东方的黄灯
break;
case8:
CTRLR=0x00;
CTRLR=0