分別通過數(shù)碼管顯示時分秒,key0按下停止計數(shù),進入調(diào)整時間狀態(tài),之后按下key1分鐘加1,按下key2小時加1,再按下key0繼續(xù)計數(shù)。
#include
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9共陰
#define dula P0//數(shù)碼管段選
#define wela P2 //數(shù)碼管位選
//定義按鍵
sbit Key0=P1^0;//時間停止等待調(diào)整,恢復計數(shù)
sbit Key1=P1^1;//調(diào)整分鐘,加1
sbit Key2=P1^2;//調(diào)整小時,加1
//定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
uchar sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;
uchar byCounter;//中斷次數(shù),20次為1s(500ms定時)
/*****************************函數(shù)聲明************************************/
void init();
void increase();
void disp();
void delay(uchar);
void time_modify();
/****************************主函數(shù)***************************/
void main()
{
init();//初始化
while(1)
{
TR0=1;//開定時器
disp();//顯示
time_modify();//調(diào)整時間
}
}
/*******************************初始化****************************/
void init()
{
wela=0;
sec_ge=sec_shi=0;
min_ge=min_shi=0;
hour_ge=hour_shi=0;
sec=min=hour=0;
byCounter=0;
TMOD=0x01;//定義定時器0工作與方式1
TH0=(65536-50000)/256; //定時器賦初值
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開T0中斷
}
/******************************延時**********************************/
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
/****************************中斷***********************************/
void t0()interrupt 1
{
TH0=(65536-50000)/256;//重賦初值
TL0=(65536-50000)%256;
byCounter++;
if(byCounter==20)//到了1s
{
byCounter=0;
increase();//計數(shù)加1
}
}
/****************************計數(shù)加1***********************************/
void increase()
{
sec++; //秒加1
if(sec==60)//如果秒為60,則清零,分加1
{
sec=0;
min++;
}
if(min==60)//如果分為60,則清零,時加1
{
min=0;
hour++;
}
if(hour==24)//如果時為24,則清零
{
hour=0;
}
}
/****************************顯示***********************************/
void disp()
{
sec_ge=sec%10;//秒的個位和十位
sec_shi=sec/10;
min_ge=min%10;//分的個位和十位
min_shi=min/10;
hour_ge=hour%10;//時的個位和十位
hour_shi=hour/10;
//循環(huán)掃描
wela=0xDF;
dula=table[hour_shi];//時的十位
delay(10);
wela=0xEF;
dula=table[hour_ge];//時的個位
delay(10);
wela=0xF7;
dula=table[min_shi];//分的十位
delay(10);
wela=0xFB;
dula=table[min_ge];//分的個位
delay(10);
wela=0xFD;
dula=table[sec_shi];//秒的十位
delay(10);
wela=0xFE;
dula=table[sec_ge];//秒的個位
delay(10);
}
/*****************************調(diào)整時間*********************************/
void time_modify()
{
uchar flag=0;
if(Key0==0)//如果Key0按下
{
while(Key0==0)//等待按鍵放開
{
disp();
}
flag=1;//標志位置1
while(flag)//當標志位為1時才能進行時間調(diào)整
{
TR0=0;//定時器停止
disp();//顯示停止時的時間
if(Key0==0)//如果Key0按下
{
while(Key0==0)//等待按鍵放開
{
disp();
}
flag=0;//標志位清零
}
if(Key1==0)//如果Key1按下
{
while(Key1==0)//等待按鍵放開
{
disp();
}
min++;
if(min==60)
min=0;
}
if(Key2==0)//如果Key2按下
{
while(Key2==0)//等待按鍵放開
{
disp();
}
hour++;
if(hour==24)
hour=0;
}
}
}
}