【蓝桥杯练习-数码管静态和动态】

数码管静态和动态练习

备战2022蓝桥杯大赛之静态-动态数码管学习
内容来自b站小蜜蜂老师
视频链接

一、静态数码管

在这里插入图片描述

对于74HC138优化版老师在后面几节视频会讲到,其实对于这个代码也很好理解
我们对138所进行操作的只是P2^7 P2^6 P2^5高三位所以将其他位保持不变只改变高三位进行锁存器相应的选通就好了

P2 = P2 | 0x1f  ----00011111  

高三位100 -----Y4    P2 = 0x80;
高三位101 -----Y5	P2 = 0xa0;
高三位110 -----Y6	P2 = 0xc0;
高三位111 -----Y7	P2 = 0xe0
#include "reg52.h"


/********************************************
Date:2022-1-10
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************/


//共阳数目管段码	 0-f
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
															   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

//简单延时函数
void delay(unsigned int t)
{
	while(t--);
	while(t--);
}

//#############################74hc138初始化#####################
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
	 	case 4: P2 = P2 | 0x1f; P2 = 0x80; break;
		case 5: P2 = P2 | 0x1f; P2 = 0xa0; break;
		case 6: P2 = P2 | 0x1f; P2 = 0xc0; break;
		case 7: P2 = P2 | 0x1f; P2 = 0xe0; break;
	}
}

//#############################################################


//#####################继电器蜂鸣器初始化######################	
//注意:由于ULN2003内部电路是取反输出 我们要关闭继电器和蜂鸣器就要是其输入高
//所以初始化为0 取反为1 关闭继电器和蜂鸣器
void InitSystem(void)
{
	Init_74HC138(5); //选通Y5 控制继电器和蜂鸣器
	P0 = 0x00;  //关闭继电器和蜂鸣器
}

//############################################################

//###########数码管安位选择 pos代表位置 dat代表数据############

void Show_SMGBit_Data(unsigned char pos ,unsigned char dat)
{
	Init_74HC138(6); //选通Y6 
	P0 = 0x01 << pos;	 //进行数码管位置选择
	Init_74HC138(7); //选通Y7
	P0 = dat;	 //进行数码管显示
}
//############################################################



//#######################数码管整体显示#######################
void SMG_Display(void)
{
 	unsigned char i,j;
	//每个数码管分别从0-9显示
	for(i = 0;i<8;i++)
	{
		for(j = 0;j<10;j++)
		{
				Show_SMGBit_Data(i,SMG_Duan[j]); //i 代表选择第几个数码管 j代表数码管段码数
				delay(1000);
				delay(1000);
		}
	}
	//每个数码管同时从0-f显示
	for(i =0;i<16;i++)
	{
		Init_74HC138(6); //选通Y6 
		P0 = 0xff;  //全部选通
		Init_74HC138(7); //选通Y7
		P0 = SMG_Duan[i];
		delay(1000);
		delay(1000);	 	 	
	}
}

//############################################################


void main(void)
{
	InitSystem();	//初始化系统关闭蜂鸣器和继电器
	while(1)
	{
			SMG_Display();			//功能显示
	}
}

二、动态数码管

在这里插入图片描述

#include "reg52.h"


/********************************************
Date:2022-1-10
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************/


//共阳数目管段码
unsigned char month = 0;	 //定义一个变量让其变化显示
//0-f  0xbf代表 -
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
															   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};

//简单延时函数
void delay(unsigned int t)
{
	while(t--);
}

//#############################74hc138初始化#####################
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
	 	case 4: P2 = P2 | 0x1f; P2 = 0x80; break;
		case 5: P2 = P2 | 0x1f; P2 = 0xa0; break;
		case 6: P2 = P2 | 0x1f; P2 = 0xc0; break;
		case 7: P2 = P2 | 0x1f; P2 = 0xe0; break;
	}
}

//#############################################################


//#####################继电器蜂鸣器初始化######################	
//注意:由于ULN2003内部电路是取反输出 我们要关闭继电器和蜂鸣器就要是其输入高
//所以初始化为0 取反为1 关闭继电器和蜂鸣器
void InitSystem(void)
{
	Init_74HC138(5); //选通Y5 控制继电器和蜂鸣器
	P0 = 0x00;  //关闭继电器和蜂鸣器
}

//############################################################

//###########数码管安位选择 pos代表位置 dat代表数据############

void Show_SMGBit_Data(unsigned char pos ,unsigned char dat)
{
	Init_74HC138(6); //选通Y6 
	P0 = 0x01 << pos;	 //进行数码管位置选择
	Init_74HC138(7); //选通Y7
	P0 = dat;	 //进行数码管显示
}
//############################################################


//#########################数码管功能显示#####################
void SMG_Display_Dynamic(void)
{
		Show_SMGBit_Data(0,SMG_Duan[2]);
		delay(1000);
		Show_SMGBit_Data(1,SMG_Duan[0]);
		delay(1000);
		Show_SMGBit_Data(2,SMG_Duan[2]);
		delay(1000);
		Show_SMGBit_Data(3,SMG_Duan[2]);
		delay(1000);
		Show_SMGBit_Data(4,SMG_Duan[16]);
		delay(1000);
		Show_SMGBit_Data(5,SMG_Duan[16]);
		delay(1000);
		Show_SMGBit_Data(6,SMG_Duan[month/10]);
		delay(1000);
		Show_SMGBit_Data(7,SMG_Duan[month%10]);
		delay(1000);
}


void delay_smg(unsigned int t)
{
	while(t--)
	{
		 SMG_Display_Dynamic();		  //延时的时候数码管也要一直显示
	}
}


void main(void)
{
	InitSystem();
	while(1)
	{
		 SMG_Display_Dynamic();
		 month++;
		 if(month>12)
		 {
				month = 0;
		 }
		 delay_smg(100);
	}
 	
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值