演示視頻:
電路原理圖:
匯編程序設(shè)計:
/**************************************************************
程序名稱:51單片機8位數(shù)碼管數(shù)字鐘匯編程序
簡要說明:實現(xiàn)24小時制電子鐘,8位數(shù)碼管顯示,顯示時分秒
顯示格式:23-59-59(小時十位如果為0則不顯示)
通過3只按鍵來調(diào)整時間
調(diào)整選擇鍵SET_KEY:P1.0;通過選擇鍵選擇調(diào)整位,選中位閃爍
增加鍵ADD_KEY:P1.1;按一次使選中位加1
減少鍵DEC_KEY;P1.2;按一次使選中位減1
如果長按ADD_KEY或DEC_KEY,識別后則進(jìn)行調(diào)時快進(jìn),此時停止閃爍
如果選中位是秒,則按增加鍵或減少鍵都是將秒清零
P0口輸出數(shù)碼管段選信號,P2口輸出數(shù)碼管位選信號。晶振12M
編 寫:JiangX.net
最后更新:08/12/31晚
**************************************************************/
ORG 0000H ;程序入口地址
LJMP START
ORG 000BH ;定時器0中斷入口地址
LJMP TIMER_0
ORG 0300H
/*****程序開始,初始化*****/
START:
SETB 48H ;使用一個bit位用于調(diào)時閃爍標(biāo)志
SETB 47H ;使用一個bit位用于產(chǎn)生脈沖用于調(diào)時快進(jìn)時基
MOV R1,#0 ;調(diào)整選擇鍵功能標(biāo)志:0正常走時、1調(diào)時、2調(diào)分、3調(diào)秒
MOV 20H,#00H ;用于控制秒基準(zhǔn)時鐘源的產(chǎn)生
MOV 21H,#00H ;清零秒寄存器
MOV 22H,#00H ;清零分寄存器
MOV 23H,#00H ;清零時寄存器
MOV 24H,#00H ;用于控制調(diào)時閃爍的基準(zhǔn)時鐘的產(chǎn)生
MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;設(shè)定定時器0工作方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;賦定時初值,定時50ms
SETB TR0 ;啟動定時器0
MOV SP,#40H ;重設(shè)堆棧指針
/*****主程序*****/
MAIN:
LCALL DISPLAY ;調(diào)用顯示子程序
LCALL KEY_SCAN ;調(diào)用按鍵檢測子程序
JZ MAIN ;無鍵按下則返回重新循環(huán)
LCALL SET_KEY ;調(diào)用選擇鍵處理子程序
JB 46H,MAIN ;如果已進(jìn)行長按調(diào)整(調(diào)時快進(jìn)),則不再執(zhí)行下面的單步調(diào)整
LCALL ADD_KEY ;調(diào)用增加鍵處理子程序,加一
LCALL DEC_KEY ;調(diào)用減少鍵處理子程序,減一
LJMP MAIN ;重新循環(huán)
/*****定時器中斷服務(wù)程序*****/
TIMER_0:
PUSH ACC
PUSH PSW ;保護(hù)現(xiàn)場
MOV TH0,#3CH
MOV TL0,#0B0H ;重新賦定時初值
CPL 47H ;產(chǎn)生脈沖用于調(diào)時快進(jìn)時基
INC 24H
MOV A,24H
CJNE A,#10,ADD_TIME ;產(chǎn)生0.5秒基準(zhǔn)時鐘,用于調(diào)時閃爍
CPL 48H ;取反調(diào)時閃爍標(biāo)志位
MOV 24H,#00H
ADD_TIME: ;走時
INC 20H
MOV A,20H
CJNE A,#20,RETI1 ;產(chǎn)生1秒基準(zhǔn)時鐘
MOV 20H,#00H ;一秒鐘時間到,清零20H
MOV A,21H
ADD A,#01H
DA A ;作十進(jìn)制調(diào)整
MOV 21H,A
CJNE A,#60H,RETI1
MOV 21H,#00H ;一分鐘到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小時到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
MOV 23H,#00H ;到24點,清零小時
RETI1:
POP PSW
POP ACC ;恢復(fù)現(xiàn)場
RETI ;中斷返回
/*****顯示處理*****/
DISPLAY:
MOV A,21H ;秒
ANL A,#0FH
MOV 2FH,A ;轉(zhuǎn)換出秒個位,存入2FH
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A ;轉(zhuǎn)換出秒十位,存入2EH
JB 46H,MIN ;如果長按按鍵(調(diào)時快進(jìn)),則跳過閃爍處理程序
CJNE R1,#3,MIN ;如果R1為3,閃爍秒位待調(diào)整
JB 48H,MIN
MOV 2FH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2EH,#0AH
MIN:
MOV A,22H ;分
ANL A,#0FH
MOV 2DH,A ;轉(zhuǎn)換出分個位,存入2DH
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A ;轉(zhuǎn)換出分十位,存入2CH
JB 46H,HOUR ;如果長按按鍵(調(diào)時快進(jìn)),則跳過閃爍處理程序
CJNE R1,#2,HOUR ;如果R1為2,閃爍分位待調(diào)整
JB 48H,HOUR
MOV 2DH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2CH,#0AH
HOUR:
MOV A,23H ;時
ANL A,#0FH
MOV 2BH,A ;轉(zhuǎn)換出時個位,存入2BH
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A ;轉(zhuǎn)換出時十位,存入2AH
JB 46H,DISP ;如果長按按鍵(調(diào)時快進(jìn)),則跳過閃爍處理程序
CJNE R1,#1,DISP ;如果R1為1,閃爍時位待調(diào)整
JB 48H,DISP
MOV 2BH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2AH,#0AH
/*****數(shù)碼管動態(tài)掃描顯示*****/
DISP:
MOV DPTR,#TABLE
MOV A,2FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
LCALL DELAY
SETB P2.7 ;顯示秒個位
MOV A,2EH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
LCALL DELAY
SETB P2.6 ;顯示秒十位
MOV A,#0BFH
MOV P0,A
CLR P2.5
LCALL DELAY
SETB P2.5 ;顯示“-”
MOV A,2DH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
LCALL DELAY
SETB P2.4 ;顯示分個位
MOV A,2CH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY
SETB P2.3 ;顯示分十位
MOV A,#0BFH
MOV P0,A
CLR P2.2
LCALL DELAY
SETB P2.2 ;顯示“-”
MOV A,2BH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY
SETB P2.1 ;顯示時個位
MOV DPTR,#TABLE1 ;該位使用TABLE1以消除前置0
MOV A,2AH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY
SETB P2.0 ;顯示時十位
RET
/*****按鍵檢測子程序*****/
KEY_SCAN:
CLR 46H ;關(guān)閉長按調(diào)整(調(diào)時快進(jìn))標(biāo)志
MOV P1,#0FFH ;將P1口設(shè)置成輸入狀態(tài)
MOV A,P1
CPL A
ANL A,#07H ;P1口低3位連接3個按鍵,只判斷該3位
JZ EXIT_KEY ;無鍵按下則返回
LCALL DELAY ;延時去抖動
MOV A,P1 ;重新判斷
CPL A
ANL A,#07H
JZ EXIT_KEY ;鍵盤去抖動
MOV R5,A ;臨時將鍵值存入R5
MOV R4,#00H ;用于控制調(diào)時快進(jìn)速度
;設(shè)置為00H是為了在進(jìn)入長按處理前加長延時區(qū)分用戶的長按與短按,防止誤快進(jìn)
LOOP: ;進(jìn)入長按處理
LCALL DISPLAY ;使長按時顯示正常
MOV A,P1
CPL A
ANL A,#07H
JB 47H,LOOP1
INC R4 ;調(diào)時快進(jìn)間隔時間基準(zhǔn)加1
LOOP1:
CJNE R1,#03H,LOOP2 ;如果調(diào)秒時長按,則不處理
LJMP LOOP3
LOOP2:
CJNE R4,#99H,LOOP3
MOV R4,#70H ;確認(rèn)用戶長按后,重新設(shè)定起始值,加快調(diào)時快進(jìn)速度
SETB 46H ;長按調(diào)整(調(diào)時快進(jìn))標(biāo)志
LCALL ADD_KEY
LCALL DEC_KEY
LOOP3:
JNZ LOOP ;等待鍵釋放
MOV A,R5 ;輸出鍵值
RET
EXIT_KEY:
RET
/*****延時子程序*****/
DELAY:
MOV R7,#150
DJNZ R7,$
RET
/*****選擇鍵處理子程序*****/
SET_KEY:
CJNE R5,#01H,EXIT ;選擇鍵鍵值
INC R1 ;調(diào)整選擇功能標(biāo)志加一
CJNE R1,#4,EXIT
MOV R1,#0
MOV 24H,#00H ;調(diào)時閃爍基準(zhǔn)清零
RET
/*****增加鍵處理子程序*****/
ADD_KEY:
CJNE R5,#02H,EXIT ;增加鍵鍵值
CJNE R1,#01H,NEXT1 ;選擇鍵功能標(biāo)志為1,調(diào)時,否則跳出
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,EXIT
MOV 23H,#00H
NEXT1:
CJNE R1,#02H,NEXT2 ;選擇鍵功能標(biāo)志為2,調(diào)分,否則跳出
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,EXIT
MOV 22H,#00H
NEXT2:
CJNE R1,#03H,EXIT ;選擇鍵功能標(biāo)志為3,調(diào)秒,否則跳出
MOV 21H,#00H ;如增加鍵按下直接清零秒
RET
/*****減少鍵處理子程序*****/
DEC_KEY:
CJNE R5,#04H,EXIT ;減少鍵鍵值
CJNE R1,#01H,NEXT3 ;選擇鍵功能標(biāo)志為1,調(diào)時,否則跳出
MOV A,23H
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,EXIT
MOV 23H,#23H
NEXT3:
CJNE R1,#02H,NEXT4 ;選擇鍵功能標(biāo)志為2,調(diào)分,否則跳出
MOV A,22H
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,EXIT
MOV 22H,#59H
NEXT4:
CJNE R1,#03H,EXIT ;選擇鍵功能標(biāo)志為3,調(diào)秒,否則跳出
MOV 21H,#00H ;如較少鍵按下直接清零秒
RET
/*****萬用返回子程序*****/
EXIT:
RET
/*****數(shù)碼管字形編碼表*****/
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形顯示編碼
TABLE1:
DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小時位的十位數(shù)編碼,該位如果為0則不顯示
END ;程序結(jié)束