让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
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是基于51单片机数码显示0~9999的代码示例: ```c #include <reg51.h> // 定义数码管段选引脚连接的端口 sbit DIG1 = P2^0; sbit DIG2 = P2^1; sbit DIG3 = P2^2; sbit DIG4 = P2^3; // 定义数码管位选引脚连接的端口 sbit SEG_A = P1^0; sbit SEG_B = P1^1; sbit SEG_C = P1^2; sbit SEG_D = P1^3; sbit SEG_E = P1^4; sbit SEG_F = P1^5; sbit SEG_G = P1^6; sbit SEG_DP = P1^7; // 数码显示0~9的编码 unsigned char code segNum[10] = { 0xC0, // 显示0 0xF9, // 显示1 0xA4, // 显示2 0xB0, // 显示3 0x99, // 显示4 0x92, // 显示5 0x82, // 显示6 0xF8, // 显示7 0x80, // 显示8 0x90 // 显示9 }; void delay(unsigned int t) { unsigned int i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display(unsigned int num) { unsigned int i, j; unsigned char digit[4]; digit[0] = num / 1000; // 千位 digit[1] = (num / 100) % 10; // 百位 digit[2] = (num / 10) % 10; // 十位 digit[3] = num % 10; // 个位 for (i = 0; i < 4; i++) { switch (i) { case 0: DIG1 = 1; break; case 1: DIG2 = 1; break; case 2: DIG3 = 1; break; case 3: DIG4 = 1; break; } P1 = segNum[digit[i]]; delay(1); // 延时一段时间保证数码管刷新 // 关闭所有位选,准备切换到下一位数码管 DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; delay(1); // 延时一段时间保证数码管刷新 } } void main() { unsigned int i; while (1) { for (i = 0; i < 10000; i++) { display(i); } } } ``` 这段代码使用了P1口连接数码管的段选引脚,P2口连接数码管的位选引脚。其中`display()`函数用于将一个四位数显示数码管上,`main()`函数中的循环将0~9999逐个显示数码管上。你可以根据自己的硬件连接情况进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Initial.M

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

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

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

打赏作者

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

抵扣说明:

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

余额充值