![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f9023b78fde5954b935fb64f9efd8446.png)
1、基础知识
左上:共用一个P0口,想要显示2024没有办法
左下:可以显示2024但是占用了太多的IO资源
右边:动态显示
每次只点亮一个,但是看起来像是一直都亮着
一开始 com1=1 com2=0 com3=0 com4=0 P0都显示2
然后1ms后 com1=0 com2=1 com3=0 com4=0 P0都显示0
2虽然熄灭了但是还有亮的感觉
2、代码实现
(1)定义段码
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
(2)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;
}
}
(3)动态显示
本质是按位显示,熄灭时间短,处在循环当中
按位显示
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SelectHC573(6);
P0=0x01 << pos; //显示的位置
SelectHC573(7);
P0=value; //显示的内容
}
动态显示
void Display_Dynamic()
{
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[2],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[4],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);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu%10],7);
DelaySMG(500);
}
(4)延时函数
数码管延时
只需要控制时间即可
void DelaySMG(unsigned int t)
{
while(t--);
}
月份变化延时
void Delay(unsigned char t)
{
while(t--)
{
Display_Dynamic();
}
}
问:为什么在月份变化延时函数里还有一个动态显示的函数?
答:数字一直能亮,是靠的循环,动态显示的函数里面没有循环,循环在主函数。主函数的循环,一方面让数字一直亮,另一方面让 yu(月份)++,但是循环太快,所以在最后加上了月份延时函数,一延时,就不能循环了,而且延时的时间超过了眼睛能感觉数字一直亮的时间,所以为了能在月份变化的时间里一直让年份亮,所以就在延时函数这个循环函数里面加上显示函数。
(5)主函数
void main()
{
while(1)
{
Display_Dynamic();
yu++;
if(yu>12)
{
yu=1;
}
Delay(100);
}
}
(6)整体代码
#include "reg52.h"
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char yu = 1;
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 DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SelectHC573(6);
P0=0x01 << pos; //ÏÔʾµÄλÖÃ
SelectHC573(7);
P0=value; //ÏÔʾµÄÄÚÈÝ
}
void Display_Dynamic()
{
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[2],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[4],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);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu%10],7);
DelaySMG(500);
}
void Delay(unsigned char t)
{
while(t--)
{
Display_Dynamic();
}
}
void main()
{
while(1)
{
Display_Dynamic();
yu++;
if(yu>12)
{
yu=1;
}
Delay(100);
}
}