前言
鄙人本次主要介绍一下做的关于DSP的第二次实验:七段数码管设计,主要包括七段数码管的设计原理、运行代码、硬件结果以及心得体会。
一、设计内容
1.1 设计原理
本学习板使用的是两个共阳极四位七段数码管,段码与位码直接与DSP的I/O连接,当给位码高电平时,相应的段码设低电平时则对应的段 码就会被点亮,通过不同的组合从而实现不同数字的显示。数码管内部原理图如下所示:
2.2 实验要求
把八位数码管按照流程点亮并且实现动态扫描显示,并依次循环显示下述流程。数码管显示流程:从最左侧两位数码管00开始计数,依次右移一位,直到最右侧数码管显示66,然后八位数码管同时点亮显示7,最后从最右侧的一位数码管8开始计数,依次左移一位,一直到 F。
二、设计代码
代码如下(示例):
#include "stdio.h"
#include "evm5515.h"
#include "evm5515_emif.h"
int *SEG_souraddr;
int SEG_DATA[]={0x0c81,0x06F3,0x0349,0x8161,0xc033,0x6025,0x3005,0xFFF1,
0x1001,0x2021,0x4011,0x8007,0x018D,0x0243,0x040D,0x081D};
//七段数码管的显示数字,0亮1灭,前两位为位码,后两位是段码
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; //七段数码管的地址
while(1)
{
for(i=0;i<16;i++)
{
*SEG_souraddr = SEG_DATA[i];
EVM5515_waitusec(350000);
}
}
}
三、 硬件验证结果
下图是七段数码管实物仿真的四个过程:四个过程依次显示的是33,66,77777777,e。
四、遇到问题
问题1:按照老师给定的程序试验时,数码管显示的数字2有问题。
解决办法:程序中给定的2对应的是 0xFF43,后来我按照数码管的原理图,重新编写了,发现2对应的是0xFF49。
问题2:我修改后的程序与我预测的位码显示总是不一致。
解决办法:我发现是我弄混了二组数码管显示位码在地址中的顺序,数码管显示地址的4位中,例如0x1243,1是板子上右边一组数码管的位码,不是左边的那组数码管,2对应的是边的那组数码管的位码。
总结
这是我第二次接触CCS,也是遇到了很多问题,但是最终都顺利的解决了,也是感触良多。
首先我先了解了一下数码管的显示原理,发现了这是共阳极数码管,其中低电平‘0’亮,高电平‘1’灭。后来我又认真探求了数码管显示地址的(例如0xFF43)的原理,发现了0x后面前两位FF显示的是位码,后两位43显示的是段码。需要注意的一点是0x后面第一位对应的是板子上右边一组数码管的位码,不是左边的那组数码管。
之后在按照老师给定的程序进行试验时,发现数码管显示的数字2有问题。我发现:程序中给定的2对应的是 0xFF43,后来我按照数码管的原理图,重新编写了,发现数字2对应的是0xFF49。
最后按照数码管的显示原理,我修改了其中的位码,使其按照我的想法进行,具体的要求参见实验要求,成功完成了实验。