
《DSP键盘接口实验》赵志浩.doc
12页《DSP键盘接口实验》赵志浩———————————————————————————————— 作者:———————————————————————————————— 日期: 湖南涉外经济学院DSP实验报告课程名称:DSP实验报告报告题目:键盘接口实验学生姓名:赵志浩所在学院:信息科学与工程学院专业班级:电子信息1102学生学号:指导教师:康钦清2021 年 6 月 5 日 目 录1 . 实验目的……………………………………………………………………………………12 . 实验设备……………………………………………………………………………………1 3 . 实验原理……………………………………………………………………………………14 . 实验步骤和内容……………………………………………………………………………15 . 实验程序框图………………………………………………………………………………26 . 实验原程序…………………………………………………………………………………47 . 总结 …………………………………………………………………………………………88 . 参考文献……………………………………………………………………………………9—、实验目的1. 了解DSP开发系统的组成和构造2. 了解键盘的根本编程方法3. 内存观察工具的使用二、实验设备计算机,版本软件,DSP 仿真器,E300 实验箱,2812CPU板三、实验原理本实验程序由二局部组成:1.由外部中断2产生中断信号2.键值读取程序:该局部有两种方法进展键值的判断。
方法1:利用内存观察工具进展观察方法2:利用LED1-LED8 的亮灭对应显示键值a) 外部中断2的应用参照实验二;b) 内存观察键值:程序中定义了三个变量“W〞“row〞和“col〞W〞代表是CPLD 中键盘的扫描数值,“row〞和“col〞分别代表键盘的行和列,由行和列可以判定按键的位置上述三个变量可以在观察窗口中观察的c) 利用LED 灯显示键值原理,参看实验一具体的LED 灯显示值以查表的形式读出,请参看“〞库文件本实验的CPLD地址译码说明: 基地址:0x2000,当底板片选CS1为低时,分配有效 CPU的数据空间:基地址+0x0200 LED灯 output8外部中断用XINT2:由CPLD分配,中断信号由键盘产生 中断下降沿触发KEY_DAY_REG(R):基地址+0x0004;四、实验步骤和内容 1. 2812CPU板JUMP1的1和2脚短接,拨码开关SW1的第二位ON; 2.E300 板上的开关SW4 的第一位置ON,其余OFF;SW3 的第四位置ON 其余的SW 置OFF;3.运行Code Composer Studio (CCS)〔需要“DEBUG→Connect〞 〕;4.翻开系统工程文件\e300.test\ normal\ DSP281x_examples\e300_06_key interface \Example_281x_;5.编译全部文件并装载“〞文件;6.单击“Debug\Go Main〞跳到主程序的开场;7.指定位置设置断点;8. View--〉Watch Window 翻开变量观察窗口; 将变量“w〞“ row〞和“ col〞添加到观察窗口中,改变变量观察窗口的显示方式为HEX 显示; 点击“Debug--〉Animate〞全速运行,然后点击E300 板上键盘按键,观察窗口中变量变化,同时LED1-LED8 灯也相应变化,指示键值。
〔注意程序中KEY_E和KEY_F分别代表键盘上的“*〞和“#〞键值十六进制数代表的意义为:高4 位为按键的行值,低4 位为按键的列值注意:“w〞中的低八位表; 9.关闭所有窗口,本实验完毕五、实验程序框图六、实验原程序#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File#include "e300_codec.h"void init_xint2(void);interrupt void xint2_isr(void); //中断2中断子程序void read_data ();//读取数据子函数void conv(void);//键盘数值转换子函数interrupt void cpu_timer0_isr(void);void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period);unsigned int row,col,w;int a=0;unsigned int temp=0;void init_xint2() { XIntruptRegs.XINT2CR.all=0x0001; //低电平触发中断 }interrupt void xint2_isr() //中断2中断子程序 { a=1; //开总中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }interrupt void cpu_timer0_isr(void){ CpuTimer0.InterruptCount++;more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }void main(void){ClocksDSP281x_SysCtrl.c file. InitSysCtrl(); DINT;default state.disabled and flags InitPieCtrl();CPU interrupt flags: IER = 0x0000; IFR = 0x0000;to the shell Interrupt InitPieVectTable(); EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.XINT2 = &xint2_isr; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; InitCpuTimers(); // For this example, only initialize the Cpu Timerssecond:uSeconds) ConfigCpuTimer(&CpuTimer0, 100, 100000); StartCpuTimer0(); init_xint2(); PieCtrlRegs.PIEIER1.all = 0x0050; IER |= M_INT1 ; EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM for(;;) { if(a==1)//加软件断点 { temp = *(int *)0x2200&0x0001;if (temp==0){ if(CpuTimer0.InterruptCount<1) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; } else if(CpuTimer0.InterruptCount<2) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; } else if(CpuTimer0.InterruptCount<3) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; } else if(CpuTimer0.InterruptCount<4) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; } else if(CpuTimer0.InterruptCount<5) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; } else if(CpuTimer0.InterruptCount<6) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; } else if(CpuTimer0.InterruptCount<7) { asm(" nop "); asm(" nop "); *(int *)0x2200=0x00f7; *(int *)0。












