让51单片机的数码管逐个显示数字2001

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,如果大家有更好的建议欢迎在评论区告诉我,谢谢!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Initial.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值