用数码管实现一个二十四小时的时钟:定义三个按键K1(选择时分秒),K2(加一),K3(进入设置,再按一次则退出)。
代码:
//功能:用数码管二十四小时制的时钟//作者:刘建东//日期:2017.4.1#include<reg52.h>#define uchar unsigned charsbit K1=P3^1; //select hour /minute /secondsbit K2=P3^0; //add onesbit K3=P3^2; //into clock configurationuchar setplace; //set which place:0,1,2uchar timer;uchar hour=0,minute=0;second=0;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//*****************declare functionsvoid delayms(uchar);void TimerConfig();void IntConfig();void digiDisplay();//********************main()void main(){ TimerConfig(); IntConfig(); while(1) { if(TR0==0) { if(K1==0) { delayms(10); if(K1==0) { setplace++; if(setplace>=3) setplace=0; } while(~K1); } if(K2==0) { delayms(10); if(K2==0) { if(setplace==0) { second++; if(second>=60) second=0; }else if(setplace==1) { minute++; if(minute>=60) minute=0; }else hour++; if(hour>=24) hour=0; } while(~K2); } } //timer add one if(timer==20) { timer=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) hour=0; } } } digiDisplay(); }}//**********************digiDisplay()void digiDisplay(){ LSA=1;LSB=1;LSC=1; P0=table[hour/10]; delayms(1); P0=0x00; LSA=0;LSB=1;LSC=1; P0=table[hour]; delayms(1); P0=0x00; LSA=1;LSB=0;LSC=1; P0=0xa0; delayms(1); P0=0xa0; LSA=0;LSB=0;LSC=1; P0=table[minute/10]; delayms(1); P0=0xa0; LSA=1;LSB=1;LSC=0; P0=table[minute]; delayms(1); P0=0xa0; LSA=0;LSB=1;LSC=0; P0=0xa0; delayms(1); P0=0xa0; LSA=1;LSB=0;LSC=0; P0=table[second/10]; delayms(1); P0=0xa0; LSA=0;LSB=0;LSC=0; P0=table[second]; delayms(1); P0=0xa0;}//********************delayms(uchar)void delayms(uchar x){ uchar a,b; for(a=x;a>0;a--) { for(b=110;b>0;b--); }}//****************TimerConfig()void TimerConfig(){ TMOD=0X01; TH0=(65535-43539)/256; TL0=(65535-43539)%6; EA=1; ET0=1; TR0=1;}//*************Interrupt servicevoid TimerService() interrupt 1{ TMOD=0X01; TH0=(65535-43539)/256; TL0=(65535-43539)%6; timer++;}//*********************IntConfig()void IntConfig(){ EA=1; EX0=1; IT0=1;}//****************Intrupt servicevoid IntService() interrupt 0{ delayms(10); if(K3==0) { TR0=~TR0; setplace=0; //FIRST IS SECOND BIT }}
效果图:
转载于:https://www.cnblogs.com/ljd4you/p/6657686.html
相关资源:51单片机入门详细教程