DSP实验六:拨码开关控制数码管


前言

  本次主要介绍一下做的关于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,进而显示对应的二进制数。
  总之,这次的实验对我来说难度还是比较大的,也是遇到了很多问题,主要是第二部分的用数码管显示二进制数字的方法花费了很长时间,但是最终都顺利完成了实验,收获很多。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道无方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值