/**************************************************************************
独立按键数码管时钟显示程序
***************************************************************************/
#include <REGX52.H>
#include "Nixie.h"
#include "Delay.h"
#include "Key.h"
#include "Timer0.h"
bit TimeSetFlashFlag=0;//闪烁标志位
unsigned char KeyNum;//按键值
unsigned char MODE=0;//模式切换
unsigned char TimeSetSelect;//时间设置
unsigned char Hour=8,Min=30,Sec=00;//时分秒
void TimeShow(void)//时间显示功能
{
while(1)
{
if(TimeSetSelect==0 && TimeSetFlashFlag==1){Nixie(1,11);}
else {Nixie(1,Hour/10);}
if(TimeSetSelect==1 && TimeSetFlashFlag==1){Nixie(2,11);}
else {Nixie(2,Hour%10);}
Nixie(3,10);
if(TimeSetSelect==2 && TimeSetFlashFlag==1){Nixie(4,11);}
else {Nixie(4,Min/10);}
if(TimeSetSelect==3 && TimeSetFlashFlag==1){Nixie(5,11);}
else {Nixie(5,Min%10);}
Nixie(6,10);
if(TimeSetSelect==4 && TimeSetFlashFlag==1){Nixie(7,11);}
else {Nixie(7,Sec/10);}
if(TimeSetSelect==5 && TimeSetFlashFlag==1){Nixie(8,11);}
else {Nixie(8,Sec%10);}
}
}
void main()
{
Timer0Init();
while(1)
{
KeyNum=Key();//读取键码
TimeShow();//调用显示
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count,T1Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
T1Count++;
KeyNum=Key();//读取键码
if(T0Count>=300)//每500ms进入一次
{
T0Count=0;
if(MODE==1)
{
TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
}
}
if(KeyNum==2&&MODE==1)
{
TimeSetSelect++;//设置选择位加1
TimeSetSelect%=6;//越界清零
}
switch(TimeSetSelect)
{
case 0: //数码管1
if(KeyNum==3&&MODE==1)
{
if(Hour<20)
{
Hour+=10;}
else{Hour+=3;}
if(Hour>23){Hour=0;}
if(Hour<0){Hour=23;}
}
else if(KeyNum==4&&MODE==1)
{
Hour-=10;
if(Hour>23){Hour=0;}
if(Hour<0){Hour=23;}
}
break;
case 1: //数码管2
if(KeyNum==3&&MODE==1)
{Hour++;
if(Hour>23){Hour=0;}
if(Hour<0){Hour=23;}
}
else if(KeyNum==4&&MODE==1)
{Hour--;
if(Hour>23){Hour=0;}
if(Hour<0){Hour=23;}
}
break;
case 2: //数码管4
if(KeyNum==3&&MODE==1)
{
if(Min<50)
{Min+=10;}
else{Min+=9;}
if(Min>59){Min=0;}
if(Min<0){Min=59;}
}
else if(KeyNum==4&&MODE==1)
{Min-=10;
if(Min>59){Min=0;}
if(Min<0){Min=59;}
}
break;
case 3: //数码管5
if(KeyNum==3&&MODE==1)
{Min++;
if(Min>59){Min=0;}
if(Min<0){Min=59;}
}
else if(KeyNum==4&&MODE==1)
{Min--;
if(Min>59){Min=0;}
if(Min<0){Min=59;}
}
break;
case 4: //数码管7
if(KeyNum==3&&MODE==1)
{
if(Sec<50)
{Sec+=10;}
else{Sec+=9;}
if(Sec>59){Sec=0;}
if(Sec<0){Sec=59;}
}
else if(KeyNum==4&&MODE==1)
{Sec-=10;
if(Sec>59){Sec=0;}
if(Sec<0){Sec=59;}
}
break;
case 5: //数码管8
if(KeyNum==3&&MODE==1)
{Sec++;
if(Sec>59){Sec=0;}
if(Sec<0){Sec=59;}
}
else if(KeyNum==4&&MODE==1)
{Sec--;
if(Sec>59){Sec=0;}
if(Sec<0){Sec=59;}
}
break;
}
if(KeyNum==1)//判断模式
{
MODE++;
MODE%=2;}
if(MODE==0)
{
if(T1Count>=1000) //定时器分频,1s
{
T1Count=0;
Sec++; //1秒到,Sec自增
if(Sec>=60)
{
Sec=0; //60秒到,Sec清0,Min自增
Min++;
if(Min>=60)
{
Min=0; //60分钟到,Min清0,Hour自增
Hour++;
if(Hour>=24)
{
Hour=0; //24小时到,Hour清0
}
}
}
}
}
}
完整代码私信我
如果觉得《51单片机独立按键数码管可调时钟显示程序》对你有帮助,请点赞、收藏,并留下你的观点哦!