提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、数码管介绍
1.数码管简介
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为 1 位、 2 位、 3 位、 4 位、 5 位、 6 位、7 位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。内部电路如下图所示:
共阴和共阳数码管的0-F段码数据表:
//共阴数码管码表
unsigned char smg_duan_yin[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};//0~F 数码管段选数据
//共阳数码管码表
unsigned char smg_duan_yang[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E,};//0~F 数码管段选数据
2.动态显示原理
动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
3.74HC164芯片介绍
二、硬件设计
本实验使用到硬件平台是普中dsp28335开发板,硬件资源如下:
(1)D1指示灯
(2)数码管显示模块
二、软件设计
本章所要实现的功能是: 将数据显示在数码管上, 同时控制 D1 指示灯闪烁,
指示系统运行状态。 程序框架如下:
(1) 数码管初始化函数
(2) 编写数码管显示函数
(3) 编写主函数
1.数码管初始化函数
要使用数码管, 我们必须先对它进行初始化, 即 IO 口的配置等操作。 其初始化代码如下:
void SMG_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//SMG数据控制端口配置
GpioCtrlRegs.GPBMUX2.bit.GPIO56=0;
GpioCtrlRegs.GPBDIR.bit.GPIO56=1;
GpioCtrlRegs.GPBPUD.bit.GPIO56=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO54=0;
GpioCtrlRegs.GPBDIR.bit.GPIO54=1;
GpioCtrlRegs.GPBPUD.bit.GPIO54=0;
GpioCtrlRegs.GPCMUX1.bit.GPIO70=0;
GpioCtrlRegs.GPCDIR.bit.GPIO70=1;
GpioCtrlRegs.GPCPUD.bit.GPIO70=0;
GpioCtrlRegs.GPCMUX1.bit.GPIO71=0;
GpioCtrlRegs.GPCDIR.bit.GPIO71=1;
GpioCtrlRegs.GPCPUD.bit.GPIO71=0;
GpioCtrlRegs.GPCMUX1.bit.GPIO72=0;
GpioCtrlRegs.GPCDIR.bit.GPIO72=1;
GpioCtrlRegs.GPCPUD.bit.GPIO72=0;
GpioCtrlRegs.GPCMUX1.bit.GPIO73=0;
GpioCtrlRegs.GPCDIR.bit.GPIO73=1;
GpioCtrlRegs.GPCPUD.bit.GPIO73=0;
EDIS;
GpioDataRegs.GPCCLEAR.bit.GPIO70=1;
GpioDataRegs.GPCCLEAR.bit.GPIO71=1;
GpioDataRegs.GPCCLEAR.bit.GPIO72=1;
GpioDataRegs.GPCCLEAR.bit.GPIO73=1;
}
该函数功能非常简单, 首先使能 GPIO 时钟, 然后将数码管相应的控制 IO 配置为普通 IO 口模式、 输出方向、 使能上拉等功能。
2.数码管显示函数
//数码管显示整数函数
//num:整数
void SMG_DisplayInt(Uint16 num)
{
unsigned char buf[4];
unsigned char i=0;
buf[0]=smg_duan_yin[num/1000];
buf[1]=smg_duan_yin[num%1000/100];
buf[2]=smg_duan_yin[num%1000%100/10];
buf[3]=smg_duan_yin[num%1000%100%10];
for(i=0;i<4;i++)
{
HC164SendData(buf[i]);
switch(i)
{
case 0: SEG1_SETH;SEG2_SETL;SEG3_SETL;SEG4_SETL;break;
case 1: SEG1_SETL;SEG2_SETH;SEG3_SETL;SEG4_SETL;break;
case 2: SEG1_SETL;SEG2_SETL;SEG3_SETH;SEG4_SETL;break;
case 3: SEG1_SETL;SEG2_SETL;SEG3_SETL;SEG4_SETH;break;
}
DELAY_US(5000);
}
}
从函数名可知, 该函数是用于显示整数, 函数有一个入口参数函数 num, 将num 值的各位取出存储当数组 buf 内, buf[0]是整数的千位, buf[1]是整数的百位, 后面依次类推。 然后采用动态扫描原理将 buf 各位数据发送到数码管上显示,其中 DELAY_US(5000)就是扫描时间, 为 5ms, 每循环一次数码管选通一位。 函数内又调用了 HC164SendData()函数用于数据的传输。
//74HC164数据发送函数
//dat:所要发送的数据
void HC164SendData(unsigned char dat)
{
char i=0;
for(i=0;i<8;i++)
{
SPICLKA_SETL;
if(dat&0x80)
SPISIMOA_SETH;
else
SPISIMOA_SETL;
SPICLKA_SETH;
dat<<=1;
}
}
3.主函数
void main()
{
int i=0;
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,100000);
SMG_Init();
while(1)
{
i=100;
while(i--)
{
SMG_DisplayInt(1314);
}
}
}