|
程序及操作指南:程序?qū)懭肷想姾?, 將在四個(gè)數(shù)碼管 上顯示 0000 ,然后每隔一分鐘,數(shù)碼管將從低位跳變,該 程序模擬的就是時(shí)鐘。用按鍵數(shù)顯鍵可將時(shí)間調(diào)至正確時(shí) 間。按按鍵數(shù)鍵一下,數(shù)碼管將在低位閃爍,然后依次按 一下,數(shù)碼管的閃爍位置就向前移一個(gè)數(shù)碼管,按到第五 下時(shí),退出。將對(duì)應(yīng)的數(shù)碼管按閃爍以后,長(zhǎng)按按鍵數(shù)顯 鍵,數(shù)碼管將會(huì)顯示從 1 至 9 ,顯示到所需時(shí)間,松開(kāi)按鍵 數(shù)顯鍵,數(shù)碼管顯示對(duì)應(yīng)所設(shè)時(shí)間,程序也會(huì)記下這個(gè)值。 例設(shè)置成 2334, 即晚上 11 點(diǎn) 34 分。設(shè)置步驟如下:按鍵一下長(zhǎng)按至 數(shù)碼管分低顯示到 4 時(shí)松開(kāi)按鍵一下長(zhǎng)按至 數(shù)碼管分高位顯示到 3 時(shí)松開(kāi)按鍵一下長(zhǎng)按 至數(shù)碼管時(shí)低位顯示到 3 時(shí)松開(kāi)按鍵一下長(zhǎng) 按至數(shù)碼管時(shí)高位顯示到 2 時(shí)松開(kāi)。 注意:如果小時(shí)設(shè)置超過(guò) 23 ,數(shù)碼管將顯示 ERR (錯(cuò) 誤),再按一下鍵恢恢復(fù)。 程序?qū)嵗?clock.asm ) : ORG 0000H AJMP MAIN ORG 0003H AJMP INT ; 外中斷 0 入口 ORG 000BH AJMP DIN0 ; 定時(shí)器 0 入口 MAIN : 92 DISML EQU 30H DISMH EQU 31H DISHL EQU 32H DISHH EQU 33H ; 顯示分,時(shí)的個(gè)時(shí)位 TFLAG EQU 34H ; 時(shí)間秒標(biāo)志,判是否到 50 個(gè) 0.2 秒,即 50*0.2=1 秒 SETFLAG EQU 35H ; 設(shè)置標(biāo)志,依次從個(gè)位到 十位到百位到千位 ADDFLAG EQU 36H MFLAG EQU 37H ; 時(shí)間分標(biāo)志,判是否到 60 個(gè)一秒,即一分 MOV DISML,#00H MOV DISMH,#00H MOV DISHL,#00H MOV DISHH,#00H ; 顯示分,時(shí)的個(gè)時(shí)位初值 MOV TFLAG,#00H ; 時(shí)間秒標(biāo)志初值 MOV SETFLAG,#00H ; 設(shè)置標(biāo)志初值 MOV ADDFLAG,#00H ; 設(shè)數(shù)加標(biāo)志 MOV MFLAG,#00H ; 時(shí)間分標(biāo)志 MOV SCON,#00H ; 串行口工作于方式 0 (同 步移位) MOV TMOD,#00000001B; 定時(shí)器 0 工作于方式 1 MOV TL0,#0EEH MOV TH0,#31H ; 設(shè)定時(shí)時(shí)間為 0.05 秒,定 時(shí) 20 次則一秒 SETB EA ; 開(kāi)總中斷 SETB ET0 ; 開(kāi)定時(shí)器 0 中斷允許 SETB EX0 ; 開(kāi)外中斷 0 允許 93 SETB TR0 ; 開(kāi)定時(shí) 0 運(yùn)行 SETB IT0 ; 外中斷 0 下降沿觸發(fā) DIS: ACALL DISPLAY ; 調(diào)用顯示時(shí)鐘程序 AJMP CRITERION ; 調(diào)判斷程序,按鍵是否按 了。 ; ACALL DELAY ; AJMP DIS DIN0: PUSH ACC ; 設(shè)置時(shí)是否出錯(cuò),比如小時(shí)設(shè)到超過(guò)了 23////////// MOV A,DISHH CJNE A,#02H,INCC MOV A,DISHL CLR C SUBB A,#04H JC INCC MOV SETFLAG,#06H AJMP RE ;///////////////////////////////////////////// ; 是否到一秒 /////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#19,RE MOV TFLAG,#00H ;///////////////////////////////////////////// ; 是否到一分 /////////////////////////////////// INC MFLAG 94 MOV A,MFLAG CJNE A,#60,RE MOV MFLAG,#00H ;///////////////////////////////////////////// ; 計(jì)分 ///////////////////////////////////////// INC DISML MOV A,DISML CJNE A,#0AH,RE MOV DISML,#00H INC DISMH MOV A,DISMH CJNE A,#06H,RE MOV DISMH,#00H ;///////////////////////////////////////////// ; 計(jì)時(shí) ///////////////////////////////////////// ; 計(jì)時(shí)分兩種情況,分為小時(shí)的高位到 2 和沒(méi)到 2 ,沒(méi)到 2 時(shí)時(shí) 低位是逢 10 進(jìn)位,到 2 后,時(shí)低位到 4 則全歸 0 MOV A,DISHH CJNE A,#02H,HJ ;///////////////////////////////////////////// ; 第一種情況 /////////////////////////////////// INC DISHL MOV A,DISHL CJNE A,#04H,RE MOV DISHL,#00H MOV DISHH,#00H AJMP RE ;///////////////////////////////////////////// 95 ; 第二種情況 /////////////////////////////////// HJ: INC DISHL MOV A,DISHL CJNE A,#0AH,RE MOV DISHL,#00H INC DISHH ;///////////////////////////////////////////// RE: MOV TL0,#0EEH MOV TH0,#31H ; 設(shè)定時(shí)時(shí)間為 0.02 秒,定 時(shí) 50 次則一秒 POP ACC RETI ; 退出中斷 INT: PUSH ACC JB P3.2,EXIT MOV R3,#0FFH DJNZ R3,$ JB P3.2,EXIT ; 判鍵抖 MOV A,SETFLAG CJNE A,#00H,ADD2 AJMP SETKEY ADD2: CJNE A,#06H,B0 ; 是錯(cuò)誤了嗎,是的,去恢 復(fù) MOV SETFLAG,#00H AJMP SETKEY B0: MOV R4,#15H ADD1: JB P3.2,SETKEY 96 ACALL DELAY DJNZ R4,ADD1 MOV ADDFLAG,#01H AJMP EXIT ; 狀態(tài)增值 ///////////////////////////////////// SETKEY: INC SETFLAG MOV A,SETFLAG CJNE A,#05H,EXIT MOV SETFLAG,#00H ;///////////////////////////////////////////// EXIT: POP ACC RETI |