DSP实验报告
实验名称:矩阵键盘扫描实验系部:物理与机电工程学院专业班级:
学号:
学生姓名:
指导教师:
完成时间:2014-5-8
报告成绩:
矩阵键盘扫描实验
一、实验目的
1.掌握键盘信号的输入,DSP I/O的使用;
2.掌握键盘信号之间的时序的正确识别和引入。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP试验箱的TMS320F2812主控板;
3. DSP硬件仿真器。
三、实验原理
实验箱上提供一个 4 * 4的行列式键盘。
TMS320F2812的8个I / O口与之相连,这里按键的识别方法是扫描法。
当有键被按下时,与此键相连的行线电平将由此键相连的列线电平决定,而行线的电平在无法按键按下时处于高电平状态。
如果让所有的列线也处于高电平,那么键按下与否不会引起行线电平的状态变化,始终为高电平。
所以,在让所有的列线处于高电平是无法识别出按键的。
现在反过来,让所有的列线处于低电平,很明显,按键所在的行电平将被拉成低电平。
根据此行电平的变化,便能判断此行一定有按键被按下,但还不能确定是哪个键被按下。
假如是5键按下,为了进一步判定是哪一列的按键被按下,可在某一时刻只让一条列线处于低电平,而其余列线处于高电平。
那么按下键的那列电平就会拉成低电平,判断出哪列为低电平就可以判断出按键号码。
模块说明:
此模块共有两种按键,KEY1—KEY4是轻触按键,在按键未按下时为高电平输入FPGA,当按键按下后对FPGA输入低电平,松开按键后恢复高电平输入,KEY5—KEY8是带自锁的双刀双掷开关,在按键未按下时是低电平,按键按下时为高电平并且保持高电平不变,只有再次按下此按键时才恢复低电平输入。
每当按下一个按键时就对FPGA就会对此按键进行编码,KEY1—KEY8分别对应的是01H、02H、03H、04H、05H、06H、07H、08H。
在编码的同时对DSP产生中断INT1,这个时候DSP就会读取按键的值,具体使用方法可以参考光盘例程
key,prj。
实验流程图:
四、实验步骤
1.把2812 模块小板插到大板上;打开液晶模块的电源开关;
2.按下键盘按键,液晶会显示所按键的号码。
3.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行。
4.启动Code Composer Studio 2.21选择菜单Debug→Reset CPU。
5.打开工程文件打开本实验的工程编译Example_key.prj浏览Example_key.c文件的内容,理解各语句作用。
6.编译并下载程序,生成输出文件.OUT,通过仿真器把执行代码下载到DSP 芯片;
7.运行;按下键盘按键,液晶会显示所按键的号码。
五、实验结果及分析
矩阵键盘录入名字英文缩写、学号同时结合lcd显示汉字和学号
六、实验总结
运行程序后,在按下键盘上的按键时,会显示相对应的键号(键号为:0-9、A-D、#、* 共十六的键号),其显示是通过液晶显示器显示出来,显示格式为:“key is X”。
通过本次实验使我了解KEY 轻触按键的按键扫描及消除按键的机械抖动方法,4*4矩阵键盘的设定及其IO口的配置方式,进一步掌握用C语言编写DSP程序的方法,及编译、除错能力。
附页:实验原程序代码
#include"include/DSP281x_Device.h"// DSP281x Headerfile Include File
#include"include/DSP281x_Examples.h"// DSP281x Examples Include File
unsigned short key,keyvalue;
unsigned char nAsciiDot[] = // ASCII
{ //********************** };//ASCII字模的数据表-
void Gpio_select(void);
void delay(int time)
{ int i,j;
for(i=0;i<time;i++)
for(j=0;j<1200;j++);}
void wcom(unsigned char com)
{ Reg08=com; }
void wdata(unsigned char dat)
{ Reg07=dat; }
void lcdinit(void)
{ wcom(0xa4);
wcom(0xad);
wcom(0x03);
wcom(0xac);
wcom(0xe2); //initialize interal function
delay(10);
wcom(0xa2); //set nomal display
wcom(0xa0); //ADC select SEG1 to SEG132
wcom(0xc8); //set SHL COM1 to COM64 start page setup
wcom(0x2c); //power control(VB,VR,VF=1,1,1)
wcom(0x2e); //power control(VB,VR,VF=1,1,1)
wcom(0x2f); //power control(VB,VR,VF=1,1,1)
wcom(0x25); //
wcom(0x81); //set reference voltage mode
wcom(0x20); //set reference voltage
wcom(0x40); //Initial Display Line was first line
wcom(0xa6); //set nomal display
wcom(0xa4); //set nomal display
wcom(0xaf); //display on}
void clear(void)
{ unsigned char page;
unsigned char seg;
for(page=0xb0;page<0xb9;page++) //写页地址共页0xb0----0xb8 { wcom(page);
wcom(0x10);
wcom(0x00);
for(seg=0;seg<128;seg++) wdata(0x00); }
}
void lcdwritechar(char codenum ,char y ,char x ) { unsigned char seg;
unsigned int coden;
codenum-=0x20;
coden=codenum<<4;
wcom(0xb0|(y&0x0f));//
wcom(0x10|((x>>1)&0x0f));
wcom(0x00|((x<<3)&0x0f));
for(seg=0;seg<8;seg++)
wdata(nAsciiDot[coden++]);
wcom(0xb0|((y+1)&0x0f));
wcom(0x10|((x>>1)&0x0f));
wcom(0x00|((x<<3)&0x0f));
for(seg=0;seg<8;seg++)
wdata(nAsciiDot[coden++]);
}
main()
{ InitSysCtrl();
EALLOW; EDIS;
Gpio_select(); DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitXintf(); // For this example, init the Xintf lcdinit();
clear();
while(1)
{ keyvalue=0;
GpioDataRegs.GPADAT.all =0xefff;
Reg05=0x00;
key=GpioDataRegs.GPADAT.all;
if(key!=0xefff)
{ if(key==0xe7ff) keyvalue='D';
if(key==0xebff) keyvalue='#';
if(key==0xef7f) keyvalue='0';
if(key==0xefbf) keyvalue='*'; }
Reg05=0x00;
GpioDataRegs.GPADAT.all =0xdfff;
Reg05=0x00;
key=GpioDataRegs.GPADAT.all;。