;*********************************************************************************************;
;以下程序能用于24小時(shí)計(jì)時(shí),能作為秒表使用,能定時(shí)鬧鈴1分鐘(也可關(guān)).
;使用方法:開(kāi)機(jī)后在00:00:00起開(kāi)始計(jì)時(shí),(1)長(zhǎng)按P1.0進(jìn)入調(diào)分狀態(tài):分單元閃爍
;按P1.0加1,按P1.1減1.再長(zhǎng)按P1.0進(jìn)入時(shí)調(diào)整狀態(tài),時(shí)單元閃爍,加減調(diào)整同調(diào)分.
;按長(zhǎng)按退出調(diào)整狀態(tài).(2)按下P1.1進(jìn)入秒表狀態(tài):按P1.2暫停,再按P1.2秒表清零,再按
;P1.2秒表又啟動(dòng),按P1.1退出秒表回到時(shí)鐘狀態(tài).(3)按P1.3進(jìn)入設(shè)定鬧時(shí)狀態(tài):00:00:-,可進(jìn)
;行分設(shè)定,按P1.2分加1,再按P1.3為時(shí)調(diào)整,00:00:-,按P1.2時(shí)加1,按P1.1鬧鈴有效,顯示為00:00:-0,再按
;P1.1鬧鈴無(wú)效(顯示00:00:-,),按P1.3調(diào)鬧鐘結(jié)束.在鬧鈴時(shí)可按P1.3停鬧,不按鬧鈴1分鐘.
;定時(shí)器T0、T1溢出周期為50MS,T0為秒計(jì)數(shù)用,T1為調(diào)整時(shí)閃爍及秒表定時(shí)用,
;P1.0、P1.1、P1.2、P1.3為調(diào)整按鈕,P0口為字符輸出口,P2為掃描口,P1.7為蜂嗚器口,采用共陽(yáng)顯示管。
;50H-55H為鬧鐘定時(shí)單元,60H-65H為秒表計(jì)時(shí)單元,70H-75H為顯示時(shí)間單元,76H-79H為分時(shí)計(jì)時(shí)單元。
;03H標(biāo)志=0時(shí)鐘閃爍,=1秒表,05H=0,不鬧鈴,=1要鬧鈴.07H每秒改變一次,用作間隔嗚叫.
;***********************************************************************************************;
DISPFIRSTEQU30H;顯示首址存放單元
BELLEQUP1.7;小喇叭
CONBSEQU2FH;存放報(bào)時(shí)次數(shù)
;
;****************************************
;;中斷入口程序;;
;****************************************
;
ORG0000H;程序執(zhí)行開(kāi)始地址
LJMPSTART;跳到標(biāo)號(hào)START執(zhí)行
ORG0003H;外中斷0中斷程序入口
RETI;外中斷0中斷返回
ORG000BH;定時(shí)器T0中斷程序入口
LJMPINTT0;跳至INTTO執(zhí)行
ORG0013H;外中斷1中斷程序入口
RETI;外中斷1中斷返回
ORG001BH;定時(shí)器T1中斷程序入口
LJMPINTT1;跳至INTT1執(zhí)行
ORG0023H;串行中斷程序入口地址
RETI;串行中斷程序返回
;
;****************************************
;;以下程序開(kāi)始;;
;****************************************
;整點(diǎn)報(bào)時(shí)用
QQQQ:MOVA,#10H
MOVB,79H
MULAB
ADDA,78H
MOVCONBS,A
BSLOOP:LCALLDS20MS
LCALLDL1S
LCALLDL1S
LCALLDL1S
DJNZCONBS,BSLOOP
CLR08H;清整點(diǎn)報(bào)時(shí)標(biāo)志
AJMPSTART1
;
;****************************************
;;主程序開(kāi)始;;
;****************************************
;
START:LCALLST;上電顯示年月日及班級(jí)學(xué)號(hào)
MOVR0,#00H;清00H-7FH內(nèi)存單元
MOVR7,#80H;
CLEARDISP:MOV@R0,#00H;
INCR0;
DJNZR7,CLEARDISP;
MOV20H,#00H;清20H(標(biāo)志用)
MOV7AH,#0AH;放入"熄滅符"數(shù)據(jù)
MOVTMOD,#11H;設(shè)T0、T1為16位定時(shí)器
MOVTL0,#0B0H;50MS定時(shí)初值(T0計(jì)時(shí)用)
MOVTH0,#3CH;50MS定時(shí)初值
MOVTL1,#0B0H;50MS定時(shí)初值(T1閃爍定時(shí)用)
MOVTH1,#3CH;50MS定時(shí)初值
SETBEA;總中斷開(kāi)放
SETBET0;允許T0中斷
SETBTR0;開(kāi)啟T0定時(shí)器
MOVR4,#14H;1秒定時(shí)用計(jì)數(shù)值(50MS×20)
MOVDISPFIRST,#70H;顯示單元為70-75H
;以下主程序循環(huán)
START1:LCALLDISPLAY;調(diào)用顯示子程序
JNBP1.0,SETMM1;P1.0口為0時(shí)轉(zhuǎn)時(shí)間調(diào)整程序
JNBP1.1,FUNSS;秒表功能,P1.1按鍵調(diào)時(shí)時(shí)作減1加能
JNBP1.2,FUNPT;秒表STOP,PUSE,CLR
JNBP1.3,TSFUN;定時(shí)鬧鈴設(shè)定
JB08H,QQQQ
AJMPSTART1;P1.0口為1時(shí)跳回START1
;
FUNPT:LJMPFUNPTT
;以下鬧鈴時(shí)間設(shè)定程序,按P1.3進(jìn)入設(shè)定
TSFUN:LCALLDS20MS
JBP1.3,START1;
WAIT113:JNBP1.3,WAIT113;等待鍵釋放
JB05H,CLOSESP;鬧鈴已開(kāi)的話,關(guān)鬧鈴
MOVDISPFIRST,#50H;進(jìn)入鬧鈴設(shè)定程序,顯示50-55H鬧鐘定時(shí)單元
MOV50H,#0CH;"-"鬧鈴設(shè)定時(shí)顯示格式00:00:-
MOV51H,#0AH;"黑"
;
DSWAIT:SETBEA
LCALLDISPLAY
JNBP1.2,DSFINC;分加1
JNBP1.0,DSDEC;分減1
JNBP1.3,DSSFU;進(jìn)入時(shí)調(diào)整
AJMPDSWAIT
;
CLOSESP:CLR05H;關(guān)鬧鈴標(biāo)志
CLRBELL
AJMPSTART1
DSSFU:LCALLDS20MS;消抖
JBP1.3,DSWAIT
LJMPDSSFUNN;進(jìn)入時(shí)調(diào)整
;
SETMM1:LJMPSETMM;轉(zhuǎn)到時(shí)間調(diào)整程序SETMM
;
DSFINC:LCALLDS20MS;消抖
JBP1.2,DSWAIT
DSWAIT12:LCALLDISPLAY;等鍵釋放
JNBP1.2,DSWAIT12
CLREA
MOVR0,#53H;
LCALLADD1;鬧鈴設(shè)定分加1
MOVA,R3;分?jǐn)?shù)據(jù)放入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#60H,ADDHH22;
ADDHH22:JCDSWAIT;小于60分時(shí)返回
ACALLCLR0;大于或等于60分時(shí)分計(jì)時(shí)單元清0
AJMPDSWAIT
DSDEC:LCALLDS20MS;消抖
JBP1.0,DSWAIT
DSWAITEE:LCALLDISPLAY;等鍵釋放
JNBP1.0,DSWAITEE
CLREA
MOVR0,#53H;
LCALLsub1;鬧鈴設(shè)定分減1
LJMPDSWAIT
;以下秒表功能/時(shí)鐘轉(zhuǎn)換程序
;按下P1.1可進(jìn)行功能轉(zhuǎn)換
FUNSS:LCALLDS20MS
JBP1.1,START11
WAIT11:JNBP1.1,WAIT11
CPL03H
JNB03H,TIMFUN
MOVDISPFIRST,#60H;顯示秒表數(shù)據(jù)單元
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
MOVTL1,#0F0H;10MS定時(shí)初值()
MOVTH1,#0D8H;10MS定時(shí)初值
SETBTR1
SETBET1
START11:LJMPSTART1
TIMFUN:MOVDISPFIRST,#70H;顯示時(shí)鐘數(shù)據(jù)單元
CLRET1
CLRTR1
START12:LJMPSTART1
;以下秒表暫停清零功能程序
;按下P1.2暫?;蚯?,按下P1.1退出秒表回到時(shí)鐘計(jì)時(shí)
FUNPTT:LCALLDS20MS
JBP1.2,START12
WAIT22:JNBP1.2,WAIT21
CLRET1
CLRTR1
WAIT33:JNBP1.1,FUNSS
JBP1.2,WAIT31
LCALLDS20MS
JBP1.2,WAIT33
WAIT66:JNBP1.2,WAIT61
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
WAIT44:JNBP1.1,FUNSS
JBP1.2,WAIT41
LCALLDS20MS
JBP1.2,WAIT44
WAIT55:JNBP1.2,WAIT51
SETBET1
SETBTR1
AJMPSTART1
;以下鍵等待釋放時(shí)顯示不會(huì)熄滅用
WAIT21:LCALLDISPLAY
AJMPWAIT22
WAIT31:LCALLDISPLAY
AJMPWAIT33
WAIT41:LCALLDISPLAY
AJMPWAIT44
WAIT51:LCALLDISPLAY
AJMPWAIT55
WAIT61:LCALLDISPLAY
AJMPWAIT66
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;1秒計(jì)時(shí)程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務(wù)程序
INTT0:PUSHACC;累加器入棧保護(hù)
PUSHPSW;狀態(tài)字入棧保護(hù)
CLRET0;關(guān)T0中斷允許
CLRTR0;關(guān)閉定時(shí)器T0
MOVA,#0B7H;中斷響應(yīng)時(shí)間同步修正
ADDA,TL0;低8位初值修正
MOVTL0,A;重裝初值(低8位修正值)
MOVA,#3CH;高8位初值修正
ADDCA,TH0;
MOVTH0,A;重裝初值(高8位修正值)
SETBTR0;開(kāi)啟定時(shí)器T0
DJNZR4,OUTT0;20次中斷未到中斷退出
ADDSS:MOVR4,#14H;20次中斷到(1秒)重賦初值
CPL07H;鬧鈴時(shí)間隔嗚叫用
MOVR0,#71H;指向秒計(jì)時(shí)單元(71H-72H)
ACALLADD1;調(diào)用加1程序(加1秒操作)
MOVA,R3;秒數(shù)據(jù)放入A(R3為2位十進(jìn)制數(shù)組合)
CLRC;清進(jìn)位標(biāo)志
CJNEA,#60H,ADDMM;
ADDMM:JCOUTT0;小于60秒時(shí)中斷退出
ACALLCLR0;大于或等于60秒時(shí)對(duì)秒計(jì)時(shí)單元清0
MOVR0,#77H;指向分計(jì)時(shí)單元(76H-77H)
ACALLADD1;分計(jì)時(shí)單元加1分鐘
MOVA,R3;分?jǐn)?shù)據(jù)放入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#60H,ADDHH;
ADDHH:JCOUTT0;小于60分時(shí)中斷退出
ACALLCLR0;大于或等于60分時(shí)分計(jì)時(shí)單元清0
LCALLDS20MS;正點(diǎn)報(bào)時(shí)
SETB08H
MOVR0,#79H;指向小時(shí)計(jì)時(shí)單元(78H-79H)
ACALLADD1;小時(shí)計(jì)時(shí)單元加1小時(shí)
MOVA,R3;時(shí)數(shù)據(jù)放入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#24H,HOUR;
HOUR:JCOUTT0;小于24小時(shí)中斷退出
ACALLCLR0;大于或等于24小時(shí)小時(shí)計(jì)時(shí)單元清0
OUTT0:MOV72H,76H;中斷退出時(shí)將分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移
MOV73H,77H;入對(duì)應(yīng)顯示單元
MOV74H,78H;
MOV75H,79H;
LCALLBAOJ
POPPSW;恢復(fù)狀態(tài)字(出棧)
POPACC;恢復(fù)累加器
SETBET0;開(kāi)放T0中斷
RETI;中斷返回
;
;****************************************
;;閃動(dòng)調(diào)時(shí)程序秒表功能程序;;
;****************************************
;T1中斷服務(wù)程序,用作時(shí)間調(diào)整時(shí)調(diào)整單元閃爍指示或秒表計(jì)時(shí)
INTT1:PUSHACC;中斷現(xiàn)場(chǎng)保護(hù)
PUSHPSW;
JB03H,MMFUN;=1時(shí)秒表
MOVTL1,#0B0H;裝定時(shí)器T1定時(shí)初值
MOVTH1,#3CH;
DJNZR2,INTT1OUT;0.3秒未到退出中斷(50MS中斷6次)
MOVR2,#06H;重裝0.3秒定時(shí)用初值
CPL02H;0.3秒定時(shí)到對(duì)閃爍標(biāo)志取反
JB02H,FLASH1;02H位為1時(shí)顯示單元"熄滅"
MOV72H,76H;02H位為0時(shí)正常顯示
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
INTT1OUT:POPPSW;恢復(fù)現(xiàn)場(chǎng)
POPACC;
RETI;中斷退出
FLASH1:JB01H,FLASH2;01H位為1時(shí),轉(zhuǎn)小時(shí)熄滅控制
MOV72H,7AH;01H位為0時(shí),"熄滅符"數(shù)據(jù)放入分
MOV73H,7AH;顯示單元(72H-73H),將不顯示分?jǐn)?shù)據(jù)
MOV74H,78H;
MOV75H,79H;
AJMPINTT1OUT;轉(zhuǎn)中斷退出
FLASH2:MOV72H,76H;01H位為1時(shí),"熄滅符"數(shù)據(jù)放入小時(shí)
MOV73H,77H;顯示單元(74H-75H),小時(shí)數(shù)據(jù)將不顯示
MOV74H,7AH;
MOV75H,7AH;
AJMPINTT1OUT;轉(zhuǎn)中斷退出
;
MMFUN:CLRTR1
MOVA,#0F7H;中斷響應(yīng)時(shí)間同步修正,重裝初值(10ms)
ADDA,TL1;低8位初值修正
MOVTL1,A;重裝初值(低8位修正值)
MOVA,#0D8H;高8位初值修正
ADDCA,TH1;
MOVTH1,A;重裝初值(高8位修正值)
SETBTR1;開(kāi)啟定時(shí)器T0
MOVR0,#61H;指向秒計(jì)時(shí)單元(71H-72H)
ACALLADD1;調(diào)用加1程序(加1秒操作)
CLRC;
MOVA,R3;
JZFSS1;加1后為00,C=0
AJMPOUTT01;加1后不為00,C=1
FSS1:ACALLCLR0;大于或等于60秒時(shí)對(duì)秒計(jì)時(shí)單元清0
MOVR0,#63H;指向分計(jì)時(shí)單元(76H-77H)
ACALLADD1;分計(jì)時(shí)單元加1分鐘
MOVA,R3;分?jǐn)?shù)據(jù)放入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#60H,ADDHH1;
ADDHH1:JCOUTT01;小于60分時(shí)中斷退出
LCALLCLR0;大于或等于60分時(shí)分計(jì)時(shí)單元清0
MOVR0,#65H;指向小時(shí)計(jì)時(shí)單元(78H-79H)
ACALLADD1;小時(shí)計(jì)時(shí)單元加1小時(shí)
OUTT01:
POPPSW;恢復(fù)狀態(tài)字(出棧)
POPACC;恢復(fù)累加器
RETI;中斷返回;
;****************************************
;;加1子程序;;
;****************************************
;
;
ADD1:MOVA,@R0;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到A
DECR0;指向前一地址
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ORLA,@R0;前一地址中數(shù)據(jù)放入A中低四位
ADDA,#01H;A加1操作
DAA;十進(jìn)制調(diào)整
MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位變0
MOV@R0,A;放回前一地址單元
MOVA,R3;取回R3中暫存數(shù)據(jù)
INCR0;指向當(dāng)前地址單元
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ANLA,#0FH;高四位變0
MOV@R0,A;數(shù)據(jù)放入當(dāng)削地址單元中
RET;子程序返回
;
;****************************************
;;分減1子程序;;
;****************************************
;
SUB1:MOVA,@R0;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到A
DECR0;指向前一地址
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ORLA,@R0;前一地址中數(shù)據(jù)放入A中低四位
JZSUB11
DECA;A減1操作
SUB111:MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位變0
CLRC;清進(jìn)位標(biāo)志
SUBBA,#0AH
SUB1111:JCSUB1110
MOV@R0,#09H;大于等于0AH,為9
SUB110:MOVA,R3;取回R3中暫存數(shù)據(jù)
INCR0;指向當(dāng)前地址單元
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ANLA,#0FH;高四位變0
MOV@R0,A;數(shù)據(jù)放入當(dāng)削地址單元中
RET;子程序返回
;
SUB11:MOVA,#59H
AJMPSUB111
SUB1110:MOVA,R3;移入R3寄存器
ANLA,#0FH;高四位變0
MOV@R0,A
AJMPSUB110
;****************************************
;;時(shí)減1子程序;;
;****************************************
;
SUBB1:MOVA,@R0;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到A
DECR0;指向前一地址
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ORLA,@R0;前一地址中數(shù)據(jù)放入A中低四位
JZSUBB11;00減1為23(小時(shí))
DECA;A減1操作
SUBB111:MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位變0
CLRC;清進(jìn)位標(biāo)志
SUBBA,#0AH;時(shí)個(gè)位大于9為9
SUBB1111:JCSUBB1110;
MOV@R0,#09H;大于等于0AH,為9
SUBB110:MOVA,R3;取回R3中暫存數(shù)據(jù)
INCR0;指向當(dāng)前地址單元
SWAPA;A中數(shù)據(jù)高四位與低四位交換
ANLA,#0FH;高四位變0
MOV@R0,A;時(shí)十位數(shù)數(shù)據(jù)放入
RET;子程序返回
;
SUBB11:MOVA,#23H
AJMPSUBB111
SUBB1110:MOVA,R3;時(shí)個(gè)位小于0A不處理
ANLA,#0FH;高四位變0
MOV@R0,A;個(gè)位移入
AJMPSUBB110
;****************************************
;;清零程序;;
;****************************************
;對(duì)計(jì)時(shí)單元復(fù)零用
CLR0:CLRA;清累加器
MOV@R0,A;清當(dāng)前地址單元
DECR0;指向前一地址
MOV@R0,A;前一地址單元清0
RET;子程序返回
;
;****************************************
;;時(shí)鐘時(shí)間調(diào)整程序;;
;****************************************
;當(dāng)調(diào)時(shí)按鍵按下時(shí)進(jìn)入此程序
SETMM:cLRET0;關(guān)定時(shí)器T0中斷
CLRTR0;關(guān)閉定時(shí)器T0
LCALLDL1S;調(diào)用1秒延時(shí)程序
LCALLDS20MS;消抖
JBP1.0,CLOSEDIS;鍵按下時(shí)間小于1秒,關(guān)閉顯示(省電)
MOVR2,#06H;進(jìn)入調(diào)時(shí)狀態(tài),賦閃爍定時(shí)初值
MOV70H,#00H;調(diào)時(shí)時(shí)秒單元為00秒
MOV71H,#00H
SETBET1;允許T1中斷
SETBTR1;開(kāi)啟定時(shí)器T1
SET2:JNBP1.0,SET1;P1.0口為0(鍵未釋放),等待
SETB00H;鍵釋放,分調(diào)整閃爍標(biāo)志置1
SET4:JBP1.0,SET3;等待鍵按下
LCALLDL05S;有鍵按下,延時(shí)0.5秒
LCALLDS20MS;消抖
JNBP1.0,SETHH;按下時(shí)間大于0.5秒轉(zhuǎn)調(diào)小時(shí)狀態(tài)
MOVR0,#77H;按下時(shí)間小于0.5秒加1分鐘操作
LCALLADD1;調(diào)用加1子程序
MOVA,R3;取調(diào)整單元數(shù)據(jù)
CLRC;清進(jìn)位標(biāo)志
CJNEA,#60H,HHH;調(diào)整單元數(shù)據(jù)與60比較
HHH:JCSET4;調(diào)整單元數(shù)據(jù)小于60轉(zhuǎn)SET4循環(huán)
LCALLCLR0;調(diào)整單元數(shù)據(jù)大于或等于60時(shí)清0
CLRC;清進(jìn)位標(biāo)志
AJMPSET4;跳轉(zhuǎn)到SET4循環(huán)
CLOSEDIS:SETBET0;省電(LED不顯示)狀態(tài)。開(kāi)T0中斷
SETBTR0;開(kāi)啟T0定時(shí)器(開(kāi)時(shí)鐘)
CLOSE:JBP1.0,CLOSE;無(wú)按鍵按下,等待。
LCALLDS20MS;消抖
JBP1.0,CLOSE;是干擾返回CLOSE等待
WAITH:JNBP1.0,WAITH;等待鍵釋放
LJMPSTART1;返回主程序(LED數(shù)據(jù)顯示亮)
SETHH:CLR00H;分閃爍標(biāo)志清除(進(jìn)入調(diào)小時(shí)狀態(tài))
SETB01H;小時(shí)調(diào)整標(biāo)志置1
SETHH1:JNBP1.0,SET5;等待鍵釋放
SET6:JBP1.0,SET7;等待按鍵按下
LCALLDL05S;有鍵按下延時(shí)0.5秒
LCALLDS20MS;消抖
JNBP1.0,SETOUT;按下時(shí)間大于0.5秒退出時(shí)間調(diào)整
MOVR0,#79H;按下時(shí)間小于0.5秒加1小時(shí)操作
LCALLADD1;調(diào)加1子程序
MOVA,R3;
CLRC;
CJNEA,#24H,HOUU;計(jì)時(shí)單元數(shù)據(jù)與24比較
HOUU:JCSET6;小于24轉(zhuǎn)SET6循環(huán)
LCALLCLR0;大于或等于24時(shí)清0操作
AJMPSET6;跳轉(zhuǎn)到SET6循環(huán)
SETOUT:JNBP1.0,SETOUT1;調(diào)時(shí)退出程序。等待鍵釋放
LCALLDS20MS;消抖
JNBP1.0,SETOUT;是抖動(dòng),返回SETOUT再等待
CLR01H;清調(diào)小時(shí)標(biāo)志
CLR00H;清調(diào)分標(biāo)志
CLR02H;清閃爍標(biāo)志
CLRTR1;關(guān)閉定時(shí)器T1
CLRET1;關(guān)定時(shí)器T1中斷
SETBTR0;開(kāi)啟定時(shí)器T0
SETBET0;開(kāi)定時(shí)器T0中斷(計(jì)時(shí)開(kāi)始)
LJMPSTART1;跳回主程序
SET1:LCALLDISPLAY;鍵釋放等待時(shí)調(diào)用顯示程序(調(diào)分)
AJMPSET2;防止鍵按下時(shí)無(wú)時(shí)鐘顯示
SET3:LCALLDISPLAY;等待調(diào)分按鍵時(shí)時(shí)鐘顯示用
JNBP1.1,FUNSUB;減1分操作
AJMPSET4;調(diào)分等待
SET5:LCALLDISPLAY;鍵釋放等待時(shí)調(diào)用顯示程序(調(diào)小時(shí))
AJMPSETHH1;防止鍵按下時(shí)無(wú)時(shí)鐘顯示
SET7:LCALLDISPLAY;等待調(diào)小時(shí)按鍵時(shí)時(shí)鐘顯示用
JNBP1.1,FUNSUBB;小時(shí)減1操作
AJMPSET6;調(diào)時(shí)等待
SETOUT1:LCALLDISPLAY;退出時(shí)鐘調(diào)整時(shí)鍵釋放等待
AJMPSETOUT;防止鍵按下時(shí)無(wú)時(shí)鐘顯示
;FUNSUB,分減1程序?
FUNSUB:LCALLDS20MS;消抖
JBP1.1,SET41;干擾,返回調(diào)分等待
FUNSUB1:JNBP1.1,FUNSUB1;等待鍵放開(kāi)
MOVR0,#77H;
LCALLSUB1;分減1程序
LJMPSET4;返回調(diào)分等待
;
SET41:LJMPSET4;
;FUNSUBB,時(shí)減1程序;
FUNSUBB:LCALLDS20MS;消抖
JBP1.1,SET61;干擾,返回調(diào)時(shí)等待
FUNSUBB1:JNBP1.1,FUNSUBB1;等待鍵放開(kāi)
MOVR0,#79H;
LCALLSUBB1;時(shí)減1程序
LJMPSET6;返回調(diào)時(shí)等待
;
SET61:LJMPSET6
;***************************************
;;顯示程序;;
;***************************************
;顯示數(shù)據(jù)在70H-75H單元內(nèi),用六位LED共陽(yáng)數(shù)碼管顯示,P0口輸出段碼數(shù)據(jù),P2口作
;掃描控制,每個(gè)LED數(shù)碼管亮1MS時(shí)間再逐位循環(huán)。
DISPLAY:MOVR1,DISPFIRST;指向顯示數(shù)據(jù)首址
MOVR5,#0FEH;掃描控制字初值
PLAY:MOVA,R5;掃描字放入A
MOVP2,A;從P2口輸出
MOVA,@R1;取顯示數(shù)據(jù)到A
MOVDPTR,#TAB;取段碼表地址
MOVCA,@A+DPTR;查顯示數(shù)據(jù)對(duì)應(yīng)段碼
MOVP0,A;段碼放入P1口
MOVA,R5;
JBACC.2,LOOP5;小數(shù)點(diǎn)處理
CLRP0.7;
LOOP5:JBACC.4,LOOP6;小數(shù)點(diǎn)處理
CLRP0.7;
LOOP6:LCALLDL1MS;顯示1MS
INCR1;指向下一地址
MOVA,R5;掃描控制字放入A
JNBACC.5,ENDOUT;ACC.5=0時(shí)一次顯示結(jié)束
RLA;A中數(shù)據(jù)循環(huán)左移
MOVR5,A;放回R5內(nèi)
MOVP0,#0FFH
AJMPPLAY;跳回PLAY循環(huán)
ENDOUT:MOVP2,#0FFH;一次顯示結(jié)束,P2口復(fù)位
MOVP0,#0FFH;P0口復(fù)位
RET;子程序返回
TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共陽(yáng)段碼表"0""1""2""3""4""5""6""7""8""9""不亮"“A”“-”
;
;****************************
;SDISPLAY,上電顯示子程序
;****************************
;不帶小數(shù)點(diǎn)顯示,有“A”“-”顯示功能
SDISPLAY:MOVR1,DISPFIRST
MOVR5,#0FEH;掃描控制字初值
SPLAY:MOVA,R5;掃描字放入A
MOVP2,A;從P2口輸出
MOVA,@R1;取顯示數(shù)據(jù)到A
MOVDPTR,#TABS;取段碼表地址
MOVCA,@A+DPTR;查顯示數(shù)據(jù)對(duì)應(yīng)段碼
MOVP0,A;段碼放入P1口
MOVA,R5;
LCALLDL1MS;顯示1MS
INCR1;指向下一地址
MOVA,R5;掃描控制字放入A
JNBACC.5,ENDOUTS;ACC.5=0時(shí)一次顯示結(jié)束
RLA;A中數(shù)據(jù)循環(huán)左移
MOVR5,A;放回R5內(nèi)
AJMPSPLAY;跳回PLAY循環(huán)
ENDOUTS:MOVP2,#0FFH;一次顯示結(jié)束,P2口復(fù)位
MOVP0,#0FFH;P0口復(fù)位
RET;子程序返回
TABS:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H
;顯示數(shù)"0123456789不亮C-A"
;內(nèi)存數(shù)"01234567890AH0BH0CH0DH"
;STAB表,啟動(dòng)時(shí)顯示2006年12月23日、C04-2-28(學(xué)號(hào))用
STAB:DB0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,04H,00H,0BH,0AH,0AH
DB03H,02H,0CH,02H,01H,0CH,06H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
;注:0A不亮,0B顯示“A”,0C顯示“-”
;
;***********************************************************
;ST,上電時(shí)顯示年月班級(jí)用,采用移動(dòng)顯示,先右移,接著左移.
;***********************************************************
ST:MOVR0,#40H;將顯示內(nèi)容移入40H-5FH單元
MOVR2,#20H;
MOVR3,#00H;
CLRA;
MOVDPTR,#STAB;
SLOOP:MOVCA,@A+DPTR;
MOV@R0,A;
MOVA,R3;
INCA;
MOVR3,A;
INCR0;
DJNZR2,SLOOP;移入完畢
MOVDISPFIRST,#40H;以下程序從左往右移
SSLOOP:MOVR2,#50;控制移動(dòng)速度
SSLOOP1:LCALLSDISPLAY;
DJNZR2,SSLOOP1;
INCDISPFIRST
MOVA,DISPFIRST
CJNEA,#5AH,SSLOOP;
MOVDISPFIRST,#5AH;以下程序從右往左移
MOVR3,#1BH;顯示27個(gè)單元
SSLOOP2:MOVR2,#32H;控制移動(dòng)速度
SSLOOP12:LCALLSDISPLAY;
DJNZR2,SSLOOP12;
DECDISPFIRST
DJNZR3,SSLOOP2;
RET
;*******************************************
;;延時(shí)程序;;
;*******************************************
;
;1MS延時(shí)程序,LED顯示程序用
DL1MS:MOVR6,#14H
DL1:MOVR7,#19H
DL2:DJNZR7,DL2
DJNZR6,DL1
RET
;20MS延時(shí)程序,采用調(diào)用顯示子程序以改善LED的顯示閃爍現(xiàn)象
DS20MS:CLRBELL
LCALLDISPLAY
LCALLDISPLAY
LCALLDISPLAY
SETBBELL
RET
;延時(shí)程序,用作按鍵時(shí)間的長(zhǎng)短判斷
DL1S:LCALLDL05S
LCALLDL05S
RET
DL05S:MOVR3,#20H;8毫秒*32=0.196秒
DL05S1:LCALLDISPLAY
DJNZR3,DL05S1
RET
;*************************************
;以下是鬧鈴時(shí)間設(shè)定程序中的時(shí)調(diào)整程序
;*************************************
DSSFUNN:LCALLDISPLAY;等待鍵釋放
JNBP1.3,DSSFUNN
MOV50H,#0AH;時(shí)調(diào)整時(shí)顯示為00:00:-.
MOV51H,#0CH
WAITSS:SETBEA
LCALLDISPLAY
JNBP1.2,FFFF;時(shí)加1鍵
JNBP1.0,DDDD;時(shí)減1
JNBP1.3,OOOO;鬧鈴設(shè)定退出鍵
JNBP1.1,ENA;鬧鈴設(shè)定有效或無(wú)效按鍵
AJMPWAITSS
OOOO:LCALLDS20MS;消抖
JBP1.3,WAITSS
DSSFUNNM:LCALLDISPLAY;鍵釋放等待
JNBP1.3,DSSFUNNM
MOVDISPFIRST,#70H
LJMPSTART1
ENA:LCALLDS20MS;消抖;
JBP1.1,WAITSS
DSSFUNMMO:LCALLDISPLAY;鍵釋放等待
JNBP1.1,DSSFUNMMO
CPL05H
JNB05H,WAITSS11
MOV50H,#00H;05H=1,鬧鈴開(kāi),顯示為00:00:0。
AJMPWAITSS
WAITSS11:MOV50H,#0aH;鬧鈴不開(kāi),顯示為00:00:-.
AJMPWAITSS
FFFF:LCALLDS20MS;消抖;
JBP1.2,WAITSS
DSSFUNMM:LCALLDISPLAY;鍵釋放等待
JNBP1.2,DSSFUNMM
CLREA
MOVR0,#55H
LCALLADD1
MOVA,R3;
CLRC;
CJNEA,#24H,ADDHH33N;
ADDHH33N:JCWAITSS;小于24點(diǎn)返回
ACALLCLR0;大于等于24點(diǎn)清零
AJMPWAITSS
DDDD:LCALLDS20MS;消抖;
JBP1.0,WAITSS
DSSFUNDD:LCALLDISPLAY;鍵釋放等待
JNBP1.0,DSSFUNDD
CLREA
MOVR0,#55H
LCALLSUBB1
LJMPWAITSS
;*********************
;以下是鬧鈴判斷子程序
;*********************
BAOJ:JNB05H,BBAO;05H=1,鬧鐘開(kāi),要比較數(shù)據(jù)
MOVA,79H;從時(shí)十位、個(gè)位、分十位、分個(gè)位順序比較
CJNEA,55H,BBAO
MOVA,78H
CLRC
BB3:CJNEA,54H,BBAO
MOVA,77H
CLRC
CJNEA,53H,BBAO
MOVA,76H
CLRC
BB2:CJNEA,52H,BBAO
JNB07H,BBAO;07H在1秒到時(shí)會(huì)取反
CLRBELL;時(shí)分相同時(shí)嗚叫(1秒間隔叫)
RET
;
BBAO:SETBBELL;不相同或鬧鈴不開(kāi)
RET
;********************************************************
END;程序結(jié)束