//////////////主程序/////////////////
void main()//主程序開始
{
chushi();//初始化
while(1)//大循環
{
if(g!=1)//如果g不等于1,就執行下一句,否則跳過下一句
disy(fen,shi);//調用走時顯示子程序
key11();//調用按鍵子程序
bbbt();//調用鬧鐘子程序
}
}
/////////////按鍵執行的子程序/////////////
void key11()//按鍵子函數
{
if(a!=0)//如果a不等于0,則執行大括號語句,否則跳過
{
dian=0;//將中間兩個小數點打開
delay(10);//延時一會兒
dian=1;//將點關掉
delay(10);//延時一會兒,以上即是動態顯示
disy(fen,shi);//調用顯示子程序
delay(4000);//延時,使它閃爍
}
if(b!=0)//如果b不等于0,則執行大括號語句
{
disy1(shi);//調用小時顯示子程序,此程序在前面聲明
delay(2000);//延時,即使它閃爍
if(key1==0)//如果+按鍵有按下,則執行大括號內容
{
delay(10);//去抖
if(key1==0)//再次判斷
{
shi++;//確實按下了就將小時時間+1
disy1(shi);//加1后調用小時顯示子程序
delay(10);//延時一會兒
if(shi==24)//如果小時加到了24就執行下一個語句,否則跳過
shi=0;//到了24就清0
}
}
if(key2==0)//如果-按鍵有按下,則執行大括號內容
{
delay(10);//去抖動
if(key2==0)//再次確認
{
shi--;//確實按下就將小時減1
disy1(shi);//調用顯示程序
delay(10);//延時
if(shi==(0-1))//如果小時到了(0-1)時,就給23
shi=23;//給23
}
}
}
if(c!=0)//如果b不等于0,則執行大括號語句
{
disy2(fen);//調用調分分顯示子程序
delay(2000);//使它閃動
if(key1==0)//判斷+按鍵是否有按下
{
delay(10);//延時
if(key1==0)//再次確認按下情況
{
fen++;//將分加1
disy2(fen);//調用顯示子程序
delay(10);//延時一會兒
if(fen==60)//如果分到了60,則執行下一語句
fen=00;//清0
}
}
if(key2==0)//如果減按鍵按下了執行下一語句
{
delay(10);//延時一會兒
if(key2==0)//再次判斷
{
fen--;//將分減1
disy2(fen);//調用顯示子程序
delay(10);//延時
if(fen==(0-1))//如果分等于(0-1),則給59
fen=59;//給59
}
}
}
if(d!=0)//如果b不等于0,則執行大括號語句
{
ndisy(nshi,nfen);//調用鬧鐘顯示程序
delay(2000);//使它閃
if(key1==0)//如果+按鍵按下了則執行括號內語句
{
delay(10);//去抖
if(key1==0)//再次判斷
{
nshi++;//將鬧鐘時加1
ndisy(nshi,nfen);//調用顯示子程序
delay(10);//延時
if(nshi==24)//如果等24就執行下一句話
nshi=0;//到了24,清0
}
}
if(key2==0)//如果-按鍵按下了,則執行括號內容
{
delay(10);//去抖
if(key2==0)//再次判斷
{
nshi--;//自減1
ndisy(nshi,nfen);//調用顯示程序
delay(10);//延時
if(nshi==(0-1))//如果小時等于(0-1),就執行下一句
nshi=23;//給23
}
}
}
if(e!=0)//如果b不等于0,則執行大括號語句
{
ndisy(nshi,nfen);//調用顯示子程序
delay(2000);//閃爍
if(key1==0)//+按鍵按下了沒?
{
delay(10);//去抖
if(key1==0)//再次確認
{
nfen++;//將分加1
ndisy(nshi,nfen);//調用顯示子程序
delay(10);//延時
if(nfen==60)//到了60?
nfen=00;//清0
}
}
if(key2==0)//-按鍵有按下嗎?
{
delay(10);//延時
if(key2==0)//再次確認
{
nfen--;//分減1
disy(nfen,nshi);//調用顯示
delay(10);//延時
if(nfen==(0-1))//如果分等于(0-1),則執行下一句
nfen=59;//給59
}
}
}
}
/////////////鬧鐘子子程序/////////////
void bbbt()//鬧鐘子程序
{
if(ding1==2)//如果計數器ding1到了2次中斷?就執行括號內容
{
ding1=0;//清0計數器
if(shi==nshi)//走時小時時間與鬧鐘小時時間相等嗎?
{
if(fen==nfen)//走時分鐘時間與鬧鐘分鐘時間相等嗎?
{
bbt=~bbt;//將蜂嗚器取反,使它發聲
}
}
}
else
bbt=1;//否則將蜂嗚器關掉
}
/////////////初始化子程序/////////////
void chushi()//初始化子函數
{
TMOD=0x11;//兩個定時器工作在方式1方式下
EA=1;//開總中斷
ET0=1;//開定時器0中斷允許
ET1=1;//開定時器1中斷允許
TR0=1;//開定時器0
TR1=1;//開定時器0
TH0=(65536-50000)/256;//定時器0高位賦值
TL0=(65536-50000)%256;//定時器0低位賦值
TH1=(65536-10000)/256;//定時器1高位賦值
TL1=(65536-10000)%256;//定時器1低位賦值
shi=23;//開機小時顯示23
fen=59;//開機分鐘顯示59
nshi=12;//開機鬧鐘小時顯示12
nfen=00;//開機鬧鐘分鐘顯示00
}
/////////////走時顯示子程序/////////////
void disy(uchar shi,uchar fen)//走時顯示子程序
{
P1=table[shi%10];//小時個位賦值
ge=0;//開個位位選
delay(5);//延時
ge=1;//關個位位選
P1=table[shi/10];//小時十位賦值
shi4=0;//開小時位選端
delay(5);//延時
shi4=1;//關小時位選端
P1=table[fen%10];//分鐘個位賦值
bai=0;//將百位打開
delay(5);//延時
bai=1; //將百位關閉
P1=table[fen/10];//分鐘十位賦值
qian=0;//打開千位位選
delay(5);//延時
qian=1; //關閉千位
}
/////////////調時顯示子程序/////////////
void ndisy(uchar nshi,uchar nfen)//調時顯示子程序
{
P1=table[nshi%10&0x7f];//賦值給小時個位
bai=0;//開位選
delay(30);//延時
bai=1;//關位選
P1=table[nshi/10];//賦值給小時十位
qian=0;//開位選
delay(30);//延時
qian=1;//關位選
P1=table[nfen%10];//賦值分十位
ge=0;//開位選
delay(30);//延時
ge=1; //關位選
P1=table[nfen/10];//送分個位
shi4=0;//開位選
delay(30);//延時
shi4=1; //關位選
dian=0;//小數點打開
delay(10);//延時
dian=1;//關閉
}
/////////////調時小時顯示子函數/////////////
void disy1(uchar fen)//調時小時顯示子函數
{
P1=table[shi%10];//送小時個位
bai=0;//打開小時個位位選
delay(40);//延時
bai=1;//關閉位選
P1=table[shi/10];//關十位代碼
qian=0;//打開十位位選
delay(40);//延時
qian=1;//關閉千位
shi4=1; //關閉十位數碼管
ge=1; //關閉個位數碼管
}
/////////////調時分鐘顯示子函數/////////////
void disy2(uchar fen)//調時分鐘顯示子函數
{
P1=table[fen%10];//送分鐘個位
ge=0;//打開分個位位選
delay(30);//關閉位選
ge=1;//關十位代碼
P1=table[fen/10];//送個位代碼
shi4=0;//打開位選
delay(30);//延時
shi4=1;//關閉位選
bai=1;//關閉百位數碼管
qian=1; //關閉千位數碼管
}
/////////////延時程序/////////////
void delay(uint z)//延時子函數
{
uint x,y;//定義局部變量
for(x=10;x>0;x--)//第一循環
for(y=z;y>0;y--);//內循環
}
/////////////T0中斷服務程序/////////////
void zhong() interrupt 1//T0中斷服務程序
{
TH0=(65536-50000)/256;//賦值給高位
TL0=(65536-50000)%256;//賦值給低位
ding++; //將走時計數器加1
ding1++;//將響鬧計數器加1
/////////////走時程序/////////////
if(ding==10)//走時計數器到了10次中斷0.5秒嗎?
{
ding=0;//清0
dian=~dian;//將小數點取反一次
mao++;//將秒變量加1
if(mao==120)//如果秒變量mao到了120次中斷(即1分鐘),就執行下語句
{
mao=0;//將秒mao變量清0
fen++;//將分變量加1
}
if(fen==60)//判斷分變量是否到了60
{
fen=0;//到了就清0
shi++;//將小時加1
if(shi==24)//如果小到了24就清0
shi=0;//清0
}
}
}
/////////////T1中斷服務程序/////////////
void zhong1() interrupt 3//T1中斷服務程序
{
TH1=(65536-10000)/256;//賦值給高位
TL1=(65536-10000)%256;//賦值給低位
ding3++;//將按鍵計數器加1
/////////////一鍵多功能控制程序/////////////
P1=0xff;//先置P1口為高位
switch(yin)//執行一鍵多功能程序
{
case 0:if(key==0)//如果0與yin比較相等,則執行break前的所有內容
{
delay(10);//延時
if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用的功能
{
ding3=0;//清0
if(key==0)//再次確認是否有按下
{
yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
a=1;//將a變為1,即打開按鍵程序中的第一段程序
g=1;//將g變1,關閉主程序中的顯示,只要按鍵按下的顯示
bbt=0;//將蜂嗚開
delay(100);//延時
bbt=1;//關蜂嗚器
TR0=0;//關時間定時器,讓時間停止運行,進入調整模式
disy(fen,shi);//調用調時顯示子函數
while(!key);//按鍵放開了嗎?
}
}
}
break;//退出開關語句
case 1: if(key==0)//如果1與yin比較相等,則執行大括號內容
{
delay(10);//延時
if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用的功能
{
ding3=0;//清0
if(key==0)//再次確認是否有按下
{
yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
b=1;//將b變為1,即打開按鍵程序中的第二段程序
a=0;//將a變為1,即關閉按鍵程序中的第一段程序
TR0=0;//關時間定時器,讓時間停止運行
bbt=0;//將蜂嗚開
delay(100);//延時
bbt=1;//關蜂嗚器
while(!key);//按鍵放開了嗎?
}
}
}
break;//退出開關語句
case 2: if(key==0)//如果2與yin比較相等,則執行大括號內容
{
delay(10);//延時
if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用
{
if(key==0)//再次確認是否有按下
{
yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
b=0;//將b變為0,即關閉上一次功能
a=0;//關閉上前面的功能
c=1;//打開第三次功能
TR0=0;//關閉定時器0
bbt=0;//開蜂嗚器
delay(100);//延時
bbt=1;//關蜂嗚器
while(!key);//按鍵放開了嗎?
}
}
}
break;//退出開關語句
case 3: if(key==0)//如果3與yin比較相等,則執行大括號內容
{
delay(10);//延時
if(ding3==3)//定時器時間到了?
{
if(key==0)//再次確認是否有按下
{
yin++;//將變量加1,以便執行第五次功能
b=0;//關閉上次功能
a=0;//關閉上次功能
c=0;//關閉上次功能
d=1;//打開第四次功能
TR0=0;////關閉定時器
bbt=0;//開響聲
delay(100);//延時
bbt=1;//關響
while(!key);//按鍵放開了嗎?
}
}
}
break;//退出開關語句
case 4: if(key==0)//如果4與yin比較相等,則執行大括號內容
{
delay(10);//延時
if(ding3==3)//定時器時間到了?
{
if(key==0)//再次確認是否有按下
{
yin++;//將變量加1,以便執行第五次功能
b=0;//關閉上次功能
a=0;//關閉上次功能
c=0;//關閉上次功能
d=0;//關閉上次功能
e=1;//打開第五次功能
TR0=0;////關閉定時器
bbt=0;//開響聲
delay(100);//延時
bbt=1;//關響
while(!key);//按鍵放開了嗎?
}
}
}
break;//退出開關語句
case 5: if(key==0)//如果5與yin比較相等,則執行大括號內容
{
delay(10);//延時
if(key==0)//定時器時間到了?
{
yin=0;//將變量清0,以復位按鍵功能
a=0;//關閉上次功能
b=0;//關閉上次功能
c=0;//關閉上次功能
g=0;//關閉上次功能
d=0;//關閉上次功能
e=0;//關閉上次功能
TR0=1;//開定時器0,使時間走
bbt=0;//開響聲
delay(100);//延時
bbt=1;//關響
while(!key);//按鍵放開了嗎?
}
}
break;//退出開關語句
}
}