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