51单片机完成时钟形式显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiaoCaiDaYong/article/details/71514229

题目要求:
用四个数码管完成时钟形式显示。
如显示1 2. 0 0
然后一个按键控制暂停并闪烁,另一个按键控制分钟加1
要求:当第一个按键不按下时,第二个按键无法完成加1动作。
仿真图,如下:
这里写图片描述
按键K1控制暂停闪烁,开始,K2加1
这里需要说明一下,因为没有教到时钟,时钟部分,将在下一个微博实现,其实很简单,用时钟中断即可完成,那样的时钟比较准确。

写代码之前,要仔细看仿真的接口问题,这样才能写好代码,代码如下:

#include <reg51.h>
/*  按下key1 暂停并闪烁,再按一下 继续,  key2按下加1,但是key2必须在key1按下后操作*/
unsigned char c[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; // 0-9

sbit key1=P1^0;
sbit key2=P1^1;

int hour;   //  小时
int min;    //  分钟

void delay()
{
    int i,j;
    for(i=1;i<10;i++)
    {
        for(j=1;j<100;j++);
    }
}

void display()
{
    P2=0X7F;
    P0=c[hour/10];
    delay();
    P2=0XBF;
    P0=c[hour%10]&0X7F; //  第二个数码管显示时,需要有点,要注意
    delay();
    P2=0XDF;
    P0=c[min/10];
    delay();
    P2=0XEF;
    P0=c[min%10];
    delay();
    P2=0XFF;    
}

void delay_2()
{
    int i,j;
    for(i=1;i<2;i++)
    {
        for(j=1;j<10;j++)
        {
            display();
        }
    }
}

void delay_3()
{
    int i,j;
    for(i=1;i<20;i++)
    {
        for(j=1;j<200;j++);
    }
}

void delay_4()
{
    int i,j;
    for(i=1;i<100;i++)
    {
        for(j=1;j<100;j++);
    }
}

void display_2()
{
    for(hour=0;hour<24;hour++)
    {
        for(min=0;min<60;min++)
        {
            display();
            if(0 == key1)
            {
                delay_3(); // 消抖
                if(0 == key1)
                {
                    while(1)
                    {
                        display();
                        delay_4();
                        if(0 == key1)
                        {
                            delay_3();//消抖
                            if(0 == key1)
                            {
                                break; // 再按key1退出闪烁
                            }
                        }
                        if(0 == key2)
                        {
                            delay_3();//消抖
                            if(0 == key2)
                            {
                                min++;// 分钟加1
                                if(60 == min)
                                {
                                    min=0;
                                }
                            }   
                        }   
                    }
                }   
            }
            delay_2();

        }
    }
}
void main()
{
    while(1)
    {
        display_2();            
    }
}

结果如下:
这里写图片描述

实验结果,不要截图,希望大家下载运行实现

猜你喜欢

转载自blog.csdn.net/XiaoCaiDaYong/article/details/71514229