蓝桥杯单片机组-05共阳数码管的动态显示

静态显示和动态显示的区别

动态显示实质上就是轮流点亮单个数码管,实现多位数码管整体显示的效果。

静态显示:通过位选控制哪几个数码管亮,位选选通的所有数码管上显示的数字始终都是一样的

动态显示:位选控制亮不亮,而段选控制显示数字,显示的数字不一样。

对于一组4位数码管来说,动态显示和静态显示都能实现同样的效果,但需要的IO端口是不同的。

要求

在单片机综合训练平台上实现数码管的动态显示。

1.前4位显示年份“2024”,接着是分位符“--”

2.最后两位是月份,从1月份开始,每隔一段时间增加一个月份,直到12月,又返回1月份递增。

代码

必要部分

   这部分的代码是涉及到数码管显示都必备需要的。

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};

2.38译码器

    这部分代码是通过38译码器选择锁存器,使数码管正常使用。

void SelectHC537(unsigned char channel)       //38译码器
{
	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;
	}
}

3.数码管的显示

    数码管的显示,首先要位选,然后再段选。

void DisplaySMG_Bit(unsigned char value,unsigned char pos)    //数码管的显示
{
	SelectHC537(6);        //位选
	P0 = 0x01 << pos;
	SelectHC537(7);        //显示数字
	P0 = value;
}

4.延时函数

void Delay(unsigned char t)
{
	while(t--);
	while(t--);
}

 题目完成

1.数码管动态显示:2024--

void Display_Dynamic()
{
	DisplaySMG_Bit(SMG_duanma[2],0);   //在第0位,显示2
	Delay(500);
	DisplaySMG_Bit(SMG_duanma[0],1);   //在第1位,显示0
	Delay(500);
	DisplaySMG_Bit(SMG_duanma[2],2);   //在第2位,显示2
	Delay(500);
	DisplaySMG_Bit(SMG_duanma[4],3);   //在第3位,显示4
	Delay(500);
	
	DisplaySMG_Bit(SMG_duanma[16],4);   //在第4位,显示-
	Delay(500);
	DisplaySMG_Bit(SMG_duanma[16],5);   //在第5位,显示-
	Delay(500);
}

    注意要写延时函数!

2.月份的累加显示

void Display_Dynamic()
{
	DisplaySMG_Bit(SMG_duanma[2],0);   //在第0位,显示2
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[0],1);   //在第1位,显示0
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[2],2);   //在第2位,显示2
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[4],3);   //在第3位,显示4
	Delay(5000);
	
	DisplaySMG_Bit(SMG_duanma[16],4);   //在第4位,显示-
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[16],5);   //在第5位,显示-
	Delay(5000);
	
	DisplaySMG_Bit(SMG_duanma[yue/10],6);   //在第6位,显示月份的十位
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[yue%10],7);   //在第7位,显示月份的个位
	Delay(5000);
}

    直接在显示函数后面写第6、7位,注意十位的写法,以及个位的写法

while(1)
	{
		Display_Dynamic();
		yue++;
		if(yue>12)
		{
			yue = 1;
		}
		Delay_yue(500);
	}

    这是主函数的写法。

3.月份延时函数

void Delay_yue(unsigned char t)
{
	while(t--)
		{
			Display_Dynamic();
		}
}

完整代码

#include"reg52.h"
//前4位显示年份“2024”,接着是分位符“--”
//最后两位是月份,从1月份开始,每隔一段时间增加一个月份,直到12月,又返回1月份递增。

unsigned char yue = 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};    //段码显示

void SelectHC537(unsigned char channel)       //38译码器
{
	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 Delay(unsigned char t)
{
	while(t--);
	while(t--);
}



void DisplaySMG_Bit(unsigned char value,unsigned char pos)    //数码管的显示
{
	SelectHC537(6);        //位选
	P0 = 0x01 << pos;
	SelectHC537(7);        //显示数字
	P0 = value;
}

void Display_Dynamic()
{
	DisplaySMG_Bit(SMG_duanma[2],0);   //在第0位,显示2
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[0],1);   //在第1位,显示0
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[2],2);   //在第2位,显示2
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[4],3);   //在第3位,显示4
	Delay(5000);
	
	DisplaySMG_Bit(SMG_duanma[16],4);   //在第4位,显示-
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[16],5);   //在第5位,显示-
	Delay(5000);
	
	DisplaySMG_Bit(SMG_duanma[yue/10],6);   //在第6位,显示月份的十位
	Delay(5000);
	DisplaySMG_Bit(SMG_duanma[yue%10],7);   //在第7位,显示月份的个位
	Delay(5000);
}


void Delay_yue(unsigned char t)
{
	while(t--)
		{
			Display_Dynamic();
		}
}


void main()
{
	while(1)
	{
		Display_Dynamic();
		yue++;
		if(yue>12)
		{
			yue = 1;
		}
		Delay_yue(500);
	}

}

我在写代码的时候想用for循环写,代码如下。但结果月份显示:08,效果不好还请大佬解答。

 

 

 

 

 

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值