数码管静态和动态练习
备战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);
}
}