一、动态数码管的原理
动态数码管可以理解为多个数码管的集合,通过逐位扫描的方式将多位数字依次显示出来。它能够实现多位数字同时显示,并且通过控制每个位的显示来实现更加灵活的数字显示效果。
动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。
#include <STC15F2K60S2.H> //头文件
//延时函数,t为延时时间
void DelaySMG(unsigned int t)
{
while(t--);
while(t--);
while(t--);
while(t--);
while(t--);
while(t--);
while(t--);
while(t--);
while(t--);
}
//138译码器
void hc138(unsigned char i)
{
switch(i)
{
case 4:
P2 = (P2&0x1f)|0x80;
case 5:
P2 = (P2&0x1f)|0xa0;
break;
case 6:
P2 = (P2&0x1f)|0xc0;
break;
case 7:
P2 = (P2&0x1f)|0xe0;
break;
}
}
//关闭蜂鸣器
void buzz()
{
hc138(5);
P0 = 0x00;
P2 = 0x1f;
}
//显示单个数字,value为需要显示的数字,pos为数字显示的位置
void displaySMG_Bit(unsigned char value,unsigned char pos)
{
hc138(6);
P0 = 0x01 << pos;
hc138(7);
P0 = value;
}
//依次显示数字
void displaySMG_di()
{
displaySMG_Bit(SMG_duanma[2],0); //显示第1位数字
DelaySMG(500);
displaySMG_Bit(SMG_duanma[0],1); //显示第2位数字
DelaySMG(500);
displaySMG_Bit(SMG_duanma[1],2); //显示第3位数字
DelaySMG(500);
displaySMG_Bit(SMG_duanma[8],3); //显示第4位数字
DelaySMG(500);
}
//主函数
void main()
{
buzz(); //打开数码管的小数点的显示
while(1) //进入一个无限循环
{
displaySMG_di(); //不断调用函数显示数字
}
}
1.头文件:<STC15F2K60S2.H> 是单片机STC15F2K60S2的头文件,
2.延时函数 DelaySMG():程序中用到了很多的延时,这个函数就是用来实现延时功能的。通过 while 循环实现。
3.138译码器 hc138():"HC138译码器"是将"地址码"转换为对应的"输出码",提供了不同的输出端口选择,方便调用。
4.关闭蜂鸣器 buzz():蜂鸣器一般在数字时钟等场合中作为报时提示音使用,该函数是用来关闭蜂鸣器的。
5.显示单个数字 displaySMG_Bit():该函数通过选择一个输出端口和一个数字位置(也就是第几位),将要显示的数字通过 P0 端口写入控制数码管的显示。程序中通过调用 hc138() 函数选择输出端口,然后再通过 P0 端口控制该位数码管的显示。
6.依次显示数字 displaySMG_di():该函数是将需要显示的数字一个一个依次显示,通过调用 displaySMG_Bit() 函数来实现。
7.主函数 main():程序中主要调用了 buzz() 和 displaySMG_di() 函数,并且进入了一个无限循环,不断地执行 displaySMG_di() 函数,从而实现数字的连续显示。