51单片机动态数码管逐个显示数字效果
效果:2001四个数字逐个显示,且前一位显示的数字不会消失
*代码部分
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的数码表
/********************************************************************************/
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/********************************************************************************/
/*定义四个显示的函数 */
void Two0() //第0位数码管上显示一个2,其余都显示0
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=smgduan[2]; break;//显示第0 位
case(1):
LSA=1;LSB=0;LSC=0;P0=0x00; break;//显示第1 位
case(2):
LSA=0;LSB=1;LSC=0;P0=0x00; break;//显示第2 位
case(3):
LSA=1;LSB=1;LSC=0;P0=0x00; break;//显示第3 位
case(4):
LSA=0;LSB=0;LSC=1;P0=0x00; break;//显示第4 位
case(5):
LSA=1;LSB=0;LSC=1;P0=0x00; break;//显示第5 位
case(6):
LSA=0;LSB=1;LSC=1;P0=0x00; break;//显示第6 位
case(7):
LSA=1;LSB=1;LSC=1;P0=0x00; break;//显示第7 位
}
delay(50); //间隔一段时间扫描
P0=0x00; //消隐
}
}
void Zero1() //第1位数码管上显示一个0,其余都显示0
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=0x00; break;//显示第0 位
case(1):
LSA=1;LSB=0;LSC=0;P0=smgduan[0]; break;//显示第1 位
case(2):
LSA=0;LSB=1;LSC=0;P0=0x00; break;//显示第2 位
case(3):
LSA=1;LSB=1;LSC=0;P0=0x00; break;//显示第3 位
case(4):
LSA=0;LSB=0;LSC=1;P0=0x00; break;//显示第4 位
case(5):
LSA=1;LSB=0;LSC=1;P0=0x00; break;//显示第5 位
case(6):
LSA=0;LSB=1;LSC=1;P0=0x00; break;//显示第6 位
case(7):
LSA=1;LSB=1;LSC=1;P0=0x00; break;//显示第7 位
}
delay(50); //间隔一段时间扫描
P0=0x00; //消隐
}
}
void Zero2() //第2位数码管上显示一个0,其余都显示0
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=0x00; break;//显示第0 位
case(1):
LSA=1;LSB=0;LSC=0;P0=0x00; break;//显示第1 位
case(2):
LSA=0;LSB=1;LSC=0;P0=smgduan[0]; break;//显示第2 位
case(3):
LSA=1;LSB=1;LSC=0;P0=0x00; break;//显示第3 位
case(4):
LSA=0;LSB=0;LSC=1;P0=0x00; break;//显示第4 位
case(5):
LSA=1;LSB=0;LSC=1;P0=0x00; break;//显示第5 位
case(6):
LSA=0;LSB=1;LSC=1;P0=0x00; break;//显示第6 位
case(7):
LSA=1;LSB=1;LSC=1;P0=0x00; break;//显示第7 位
}
delay(50); //间隔一段时间扫描
P0=0x00; //消隐
}
}
void One3() //第3位数码管上显示一个1,其余都显示0
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=0x00; break;//显示第0 位
case(1):
LSA=1;LSB=0;LSC=0;P0=0x00; break;//显示第1 位
case(2):
LSA=0;LSB=1;LSC=0;P0=0x00; break;//显示第2 位
case(3):
LSA=1;LSB=1;LSC=0;P0=smgduan[1]; break;//显示第3 位
case(4):
LSA=0;LSB=0;LSC=1;P0=0x00; break;//显示第4 位
case(5):
LSA=1;LSB=0;LSC=1;P0=0x00; break;//显示第5 位
case(6):
LSA=0;LSB=1;LSC=1;P0=0x00; break;//显示第6 位
case(7):
LSA=1;LSB=1;LSC=1;P0=0x00; break;//显示第7 位
}
delay(50); //间隔一段时间扫描
P0=0x00; //消隐
}
}
/*****************************************************************************/
/*主函数*/
void main()
{
while(1) //显示2
{
u16 a=50; u16 b=50; u16 c=35; u16 d=50;
while(a>0)
{
Two0();
a--;
}
while(b>0) //显示20
{
Two0();
Zero1();
b--;
}
while(c>0) //显示200
{
Two0();
Zero1();
Zero2();
c--;
}
while(d>0) //显示2001
{
Two0();
Zero1();
Zero2();
One3();
d--;
}
delay(50000);
delay(50000);
}
}
原理
先定义四个显示的函数,每个函数都是让其中一个数码管显示一个数字,其余的数码管都不显示。
首先显示一个数字2,运用while让这个2停留一会,再显示两个20。再显示200,重复该操作,直到2001全部被显示出来。
个人刚入门51,如果大家有更好的建议欢迎在评论区告诉我,谢谢!