静态显示和动态显示的区别
动态显示实质上就是轮流点亮单个数码管,实现多位数码管整体显示的效果。
静态显示:通过位选控制哪几个数码管亮,位选选通的所有数码管上显示的数字始终都是一样的
动态显示:位选控制亮不亮,而段选控制显示数字,显示的数字不一样。
对于一组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,效果不好还请大佬解答。