蓝桥杯基础模块3_2:数码管动态显示

一、模块题目

蓝桥杯基础模块3_2:数码管动态显示_第1张图片

二、原理简述

动态显示的基本原理与实现思路(转载)
动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流显示过程中,每位数码管点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
蓝桥杯基础模块3_2:数码管动态显示_第2张图片
蓝桥杯基础模块3_2:数码管动态显示_第3张图片

三、源码

//头文件
#include "reg52.h"
//F3461BH数码管的段码数组
unsigned char yu = 1;				//定义变量yu,赋初值1
unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};
//HC138、HC573选择函数
void SelectHC573(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}
//数码管初始函数
void DisplaySMG_Bit(unsigned char value, unsigned char pos)
{
	P0 = 0xff;				//初始化选择所有数码管
	SelectHC573(6);			//数码管位置
	P0 = 0x01 << pos;			//数码管逐个选择
	SelectHC573(7);			//数码管显示
	P0 = value;				
}
//延时函数
void DelaySMG(unsigned int t)
{
	while(t--);
}
//数码管显示函数
void Display_Dynamic()
{
	DisplaySMG_Bit(SMG_duanma[2],0);	//在第0位数码管处显示数字“2”
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[0],1);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[1],2);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[8],3);
	DelaySMG(500);
	
	DisplaySMG_Bit(SMG_duanma[16],4);
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[16],5);
	DelaySMG(500);						//以上是静态显示,下面动态显示
	
	DisplaySMG_Bit(SMG_duanma[yu/10],6);	//在第6位显示yu的十位数字
	DelaySMG(500);
	DisplaySMG_Bit(SMG_duanma[yu%10],7); 	//在第7位显示yu的个位数字
	DelaySMG(500);
}
//动态显示延时函数
void Delay(unsigned char t)
{
		while(t--)
		{
			Display_Dynamic();
		}
}				//使动态显示的数码管整体延时,注意与之前接触的延时函数的区别
//主函数框架
void main()
{
	while(1)
	{
		Display_Dynamic();
		yu++; 
		if(yu > 12)
		{
			yu = 1;
		}							//yu从1到12循环变化
		Delay(200);
	}
}

四、开发板烧录结果

如图,数码管前6位显示2018–,后两位显示从00到12的数字。
蓝桥杯基础模块3_2:数码管动态显示_第4张图片

五、思考

将主函数改成如下代码,可以实现同样效果。

void main()
{
	while(1)
	{
		Delay(200);
		yu++;
		if(yu > 12)
		{
			yu = 1;
		}
	}
}

你可能感兴趣的:(单片机)