前言
本次主要介绍一下做的关于DSP的第六次实验:拨码开关控制数码管,主要包括实验要求、运行代码、硬件结果以及心得体会。
一、实验要求
第一部分:当 SW0-SW3 其中任意一个轻触开关按键被按下时,在数码管上会显示对应的哪一个SW开关被按下了。
第二部分:用四位拨码开关在数码管上实现二进制的显示。
二、实验代码
代码如下(示例):
2.1 第一部分:
#include "stdio.h"
#include "evm5515.h"
#include "evm5515_emif.h"
int *SEG_souraddr;
int SEG_DATA[]={0x0881,0x04F3,0x0249,0x0161};
int sw0,sw1,sw2,sw3;
Int16 EMIF_init()
{
Uint16 i;
*(ioport volatile unsigned *)0x1C04=0x10;
*(ioport volatile unsigned *)0x1C05=0x2;
for(i=0;i<500;i++){;}
*(ioport volatile int *)0x1C02 &= 0x77FF; //打开EMIF时钟
*(ioport volatile unsigned *)0x1C04=0x020;
*(ioport volatile unsigned *)0x1C05=0x00fb;
for(i=0; i<50; i++);
EMIF_AWCCR1 = 0x0080;
EMIF_AWCCR2 = 0x00E4;
EMIF_ACS2CR1 = 0xFFF9;
return 0;
}
void main( void )
{
int i;
EVM5515_init(); //初始化
EMIF_init();
SEG_souraddr = (int *)0x600006; //七段数码管的地址
SYS_GPIO_DIR0=0X3C00;
SYS_GPIO_DIR1=0X081C;
while(1)
{
SYS_EXBUSSEL=0X6A3F;
EVM5515_waitusec(20000);
sw0=SYS_GPIO_DATAIN0&0x4000;
if (sw0==0x0000) *SEG_souraddr = SEG_DATA[0];
sw1=SYS_GPIO_DATAIN0&0x8000;
if (sw1==0x0000) *SEG_souraddr = SEG_DATA[1];
SYS_EXBUSSEL=0X2A3F;
EVM5515_waitusec(20000);
sw2=SYS_GPIO_DATAIN1&0x1000;
if (sw2==0x0000) *SEG_souraddr = SEG_DATA[2];
sw3=SYS_GPIO_DATAIN1&0x2000;
if (sw3==0x0000) *SEG_souraddr = SEG_DATA[3];
}
}
2.2 第二部分:
#include "stdio.h"
#include "evm5515.h"
#include "evm5515_emif.h"
int *SEG_souraddr;
int SEG_DATA[]={0x0881,0x08F3,0x0849,0x0861,0x0833,0x0825,0x0805, 0x08F1,0x0801,0x0821,0x0811,0x0807,0x088D,0x0843,0x080D,0x081D};
int dip0,dip1,dip2,dip3,dip4;
void main( void )
{
int a1,a2,a3,a4;
EVM5515_init(); //初始化
SEG_souraddr = (int *)0x600006; //七段数码管的地址
SYS_EXBUSSEL=0X6A3F;
SYS_GPIO_DIR0=0X3C00;
SYS_GPIO_DIR1=0X081C;
while(1)
{
a1=0; a2=0; a3=0; a4=0;
dip0=SYS_GPIO_DATAIN1&0x0001;
if (dip0==0x0000) a1=8;
dip1=SYS_GPIO_DATAIN1&0x0002;
if (dip1==0x0000) a2=4;
dip2=SYS_GPIO_DATAIN1&0x0400;
if (dip2==0x0000) a3=2;
dip3=SYS_GPIO_DATAIN1&0x0200;
if (dip3==0x0000) a4=1;
dip4=SYS_GPIO_DATAIN1&0x0100;
if (dip4==0x0000) *SEG_souraddr = SEG_DATA[a1+a2+a3+a4];
EVM5515_waitusec(20000);
}
}
三、 硬件验证结果
3.1 第一部分:
进入调试界面后,点击运行按钮,运行程序。通过依次按下拨码开关,我们可以看见数码管上依次显示出数字0,1,2,3,实验现象图如下所示:
3.1 第二部分:
进入调试界面后,点击运行按钮,运行程序。控制不同的四位拨码开关,在数码管上实现二进制的显示,实验现象(显示的是0,4,E,F)如下所示:
四、遇到问题
问题1:数码管显示对应的SW开关时,总是一直闪亮。
解决办法:我发现是*SEG_souraddr = SEG_DATA[0]这个语句没有直接跟着上一个if,导致程序中四个类似的语句直接运行。因此,我直接删去了printf(“sw0 pressed by you\n”)这一语句。如下图所示:
问题2:用数码管显示二进制数字时,不知道如何正确修改程序。
解决办法:我和查阅资料后,发现可以利用五个拨码开关dip实现。dip0,dip1,dip2,dip3分别为0x0000时,对应的a1~a4分别赋值为8,4,2,1,然后利用dip5,将数码管显示的数值对应上a1+a2+a3+a4,进而显示对应的二进制数。
总结
这次的实验分为两个部分:第一部分是用数码管显示对应按键;第二部分是用数码管显示拨码开关对应的二进制数。
我先做的第一部分,仿照之前用CCS Console显示对应轻触开关的程序,将显示部分的CCS Console换成了数码管。一开始我是直接在if (sw0==0x0000) printf(“sw0 pressed by you\n”);后面加的SEG_souraddr = SEG_DATA[0],但是出来的结果是数码管一直快速闪亮。我发现是SEG_souraddr = SEG_DATA[0]这个语句没有直接跟着上一个if,导致程序中四个类似的语句直接运行。因此,我直接删去了printf(“sw0 pressed by you\n”)这一语句。
在第二部分中,由于我们一开始做的是轻触开关,因此我们用重新用拨码开关做了一下第一部分。程序很快改好了,但是拨上开关时,数码管上并没有显示对应的数字。在这一部分我卡了好长时间,最后才发现拨码开关的方向弄反了,向下拨开关时,数码管才显示对应的数字。
同时在第二部分中,表示二进制也遇到了问题。开始我打算同16个if语句显示二进制数,但是程序太过复杂。后来我想了一个别的方法:利用五个拨码开关dip,将dip0,dip1,dip2,dip3分别为0x0000时,对应的a1~a4分别赋值为8,4,2,1,然后利用dip5,将数码管显示的数值对应上a1+a2+a3+a4,进而显示对应的二进制数。
总之,这次的实验对我来说难度还是比较大的,也是遇到了很多问题,主要是第二部分的用数码管显示二进制数字的方法花费了很长时间,但是最终都顺利完成了实验,收获很多。