51单片机控制数码管显示时钟,独立按键怎么弄?

2019-07-15 21:16发布

程序已写好,现在想加个独立按键怎么弄?
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned long int
uint num;
uchar cunt;        //全局变量
uchar tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//高电平有效
uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//低电平有效
void display(uint num);
void delay();
void init()           //中断
        {                                                                  
                TMOD=0x01;
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                EA=1;          //开总中断
                ET0=1;          //开定时器
                TR0=1;          //启动定时器,计数
                cunt=0;          //中断初始化
                num=0;          //计数初始化
                        }
void main()
        {
                init();           //函数初始化
                while(1)
                {
                        if(cunt==20)
                        {
                                cunt=0;
                                num++;
                        }
                        if(num>86400)           //计时24小时清零
                                num=0;
                        display(num);      //时分秒显示
                }
        }                               
void timer()  interrupt 1           //中断
{
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        cunt++;
}
void display(uint num)          
        {
                uchar hou1,hou2,min1,min2,sec1,sec2;
                sec1=num%10;
                sec2=num%60/10;
                min1=num%600/60%10;
                min2=num%3600/600%10;
                hou1=num/3600%10;
                hou2=num/36000;

                P0=tab1[sec1]; //段选
                P2=tab2[7];           //位选
                delay();
                P2=0xff;

                P0=tab1[sec2];
                P2=tab2[6];       
                delay();
                P2=0xff;

                P0=tab1[min1];
                P2=tab2[4];
                delay();
                P2=0xff;

                P0=tab1[min2];
                P2=tab2[3];
                delay();
                P2=0xff;

                P0=tab1[hou1];
                P2=tab2[1];
                delay();
                P2=0xff;

                P0=tab1[hou2];
                P2=tab2[0];
                delay();
                P2=0xff;
}
void delay()
        {
                uchar i,j;
                for(i=100;i>0;i--)                 //延时1MS
                        for(j=10;j>0;j--);
        }
//单片机工作频率是12MHZ,定时器12分频后累加计数,也就是1us计数一次。
//定时一秒,定时器装入初值50000,则需进入中断20次,才能实现(50000*20=100000=1s)!
//数码管动态显示,要求控制显示延时时间和消隐。累计计数转换成时、分、秒,转换思路是计数分割。一分等于60,秒,一小时等于60分。
//计数累加,计数一次,秒加1,;计数60次,分加1,;计数3600次,时加1.计数86400次,24小时满,而后计数清零。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
曦瑞
2019-07-15 21:24
杨韧 发表于 2013-12-18 13:06
按键要弄什么功能?

我加了一个独立按键,想实现按一下暂停,再按一下继续工作的功能,但是有问题
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned long int
sbit key1=P3^4;
uint num;
uchar cunt;        //全局变量
uchar tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//高电平有效
uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//低电平有效
void display(uint num);
void delay();
void delay1(uint z)
{
        while(z--);
}
void init()           //中断
        {                                                                  
                TMOD=0x01;
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                EA=1;          //开总中断
                ET0=1;          //开定时器
                TR0=1;          //启动定时器,计数
                cunt=0;          //中断初始化
                num=0;          //计数初始化
                        }
void main()
        {
                init();           //函数初始化
                while(1)
                {
                        if(cunt==20)
                        {
                                cunt=0;
                                num++;
                        }
                        if(num>86400)           //计时24小时清零
                                num=0;
                        display(num);      //时分秒显示
                        if(key1==0)
                                {
                                        if(key1==0)
                                        {
                                                delay1(50);
                                                while(!key1);
                                                ET0=0;
                                                 cunt=0;
                                                num++;
                                                if(num==10)
                                                        num=0;
                                        }       
                                }
                         if(key1==0)
                                 {
                               
                                        if(key1==0)
                                        {         delay1(50);
                                                 while(!key1);
                                                ET0=1;
                                                cunt=0;
                                                num++;
                                                if(num==10)
                                                        num=0;
                                        }
                                }


                }
        }                               
void timer()  interrupt 1           //中断
{
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        cunt++;
}
void display(uint num)          
        {
                uchar hou1,hou2,min1,min2,sec1,sec2;
                sec1=num%10;
                sec2=num%60/10;
                min1=num%600/60%10;
                min2=num%3600/600%10;
                hou1=num/3600%10;
                hou2=num/36000;

                P0=tab1[sec1]; //段选
                P2=tab2[7];           //位选
                delay();
                P2=0xff;

                P0=tab1[sec2];
                P2=tab2[6];       
                delay();
                P2=0xff;

                P0=tab1[min1];
                P2=tab2[4];
                delay();
                P2=0xff;

                P0=tab1[min2];
                P2=tab2[3];
                delay();
                P2=0xff;

                P0=tab1[hou1];
                P2=tab2[1];
                delay();
                P2=0xff;

                P0=tab1[hou2];
                P2=tab2[0];
                delay();
                P2=0xff;
}
void delay()
        {
                uchar i,j;
                for(i=100;i>0;i--)                 //延时1MS
                        for(j=10;j>0;j--);
        }

一周热门 更多>