dsp28335数码管显示实验

本文介绍了数码管的基本概念,如七段和八段数码管的区别,动态显示原理以及74HC164芯片的作用。详细阐述了硬件设计中如何使用普中dsp28335开发板上的资源,包括数码管初始化和显示函数的编写,以及主函数中控制数码管显示整数的示例。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、数码管介绍

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, 0xF80x80, 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);
		}
	}
}
  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值