数码管的基础知识已经讲解的差不多了,我们做道题目来结束本章的学习内容。

 

1.题目要求

开发板上电瞬间需要做到如下图的“0.00”所示

数码管5

右边两个数码管用来做60秒计时,带小数点显示的数码管用来做一分钟过后的累加,当还没到达10分钟时,最左端的数码管(也就是数码管3)不允许亮,计时到“59.59”之后再过一秒就要变为“0.00”。


2.程序分析

同样我们需要定义Second用来做秒数自增的变量,分钟的累加也需要一个Minute变量。

当Second等于60的瞬间,需要“Second=0; Minute++;”

同理当Minute等于60的瞬间,需要“Minute=0;”

我们也知道开发板一上电就需要三个数码管一起点亮,所以LedBuff[0]、LedBuff[1]、LedBuff[2]每次从头循环都需要实时更新状态值的,反倒是LedBuff[3]只有当Minute大于等于10时,才会去更新内容,才会改变之前的“LedBuff[3]=0xFF;”变成可点亮数码管的显示。


3.代码

#include <reg52.h> 
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓存区

void main()
{  
    unsigned int i=0,x;
    unsigned char Second=0,Minute=0;//定义一个秒数自增和一个分数自增的变量
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
    
    while(1)
    {   
        LedBuff[0]=LedChar[Second%10];   
        LedBuff[1]=LedChar[(Second/10)%10];
        LedBuff[2]=0x7F & LedChar[Minute%10];
        if(Minute>=10)LedBuff[3]=LedChar[(Minute/10)%10];//Minute没到达10之前不更新LedBuff[3]的初始值
   
        if(Minute==0)LedBuff[3]=0xFF;//Minute到达60就归0了,所以不显示Minute的十位了
        for(x=0;x<29480;x++)//循环持续1秒的时间
        { 
            P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用
            switch(i)
            {
                case 0:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;
      
                case 1:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;     
      
                case 2:
                ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break;  
      
                case 3:
                ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0=LedBuff[3];i=0;break; 
            }  
        } 
        Second++;//一秒之后变量自加1 
        if(Second>=60){Second=0;Minute++;}
        if(Minute>=60)Minute=0;
    }
}

这代码是让数码管显示按秒数自增的,大家想观察到了“59.59”之后数码管会怎么样显示但又不想等1个小时,那么把 “unsigned char Second=0,Minute=0;”初始时的Second改为50,Minute改为59看看10秒后数码管怎么显示。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)