倒數計時的問題 |
答題得分者是:oYueno
|
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
我的倒數計時最多已經可以正常倒數9分鐘了
倒數10分鐘時,一開始式正常的,10:00=>09:59 但是倒數到09:00又重複一次09:59,重複了七次後才能 正常倒數到08:59,20分鐘也一樣,一開始20:00=>19:59 但是倒數到19:00又重複一次19:59,重複了七次後才能到18:59 我現在想知道的是我的分鐘個位數遇到0的時候該怎麼寫判斷式,我試寫過跟秒 一樣的判斷式,就是先取個位數,判斷是否等於#0FH,是的話把個位數變9 但是問題好像出在這,就是我10減一也是0F,所以搞不清楚,請各位大大指點一下 這是最多倒數9分鐘的時間運算,但是倒數10分鐘或20分鐘就會變上面的情況 時間運算程式如下: TIMER0 PUSH PSW ; PUSH A ; SETB RS0 ;\使用BANK3 SETB RS1 ;/ MOV TL0,#<(65536-50000) ;計時器初始值50MS中斷一次 MOV TH0,#>(65536-50000) ; MOV A,TIMEUP0 ;TIMER0 每50MS中斷一次 DEC A ;20次中斷遞減 MOV TIMEUP0,A ; CJNE A,#10,GODOWN ; GODOWN CJNE A,#0,OUT MOV TIMEUP0,#20 ;20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來X:00-->X:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. DEC TIME_M ; SS1: MOV B,A ;SAVE A 修正秒的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A ;/ ANL A,#F0H ;取十位數值 CJNE A,#F0H,G20 ;判斷十位數是否為F MOV A,B ; ANL A,#0FH ;\ ORL A,#50H ;|等於F則十位數設5 MOV B,A ;/ G20 MOV A,B ; MOV TIME_S,A ;轉回修正好的時間回TIME_S MOV R0,TIME_M ;讀取分鐘 CJNE R0,#00H,OUT ;判斷分鐘是否倒數完 否則跳出 CJNE A,#00H, OUT ;判斷秒鐘是否倒數完 否則跳出 MOV TIME_M,#0 MOV TIME_S,#0 CLR TR0 ;暫停計時 ;--------------------------------------- OUT POP A ; POP PSW ; RETI
------
滴滴儒 編輯記錄
㊣ 重新編輯於 2009-08-25 11:08:35, 註解 無‧
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
TIMER0 PUSH PSW ; PUSH A ; SETB RS0 ;\使用BANK3 SETB RS1 ;/ MOV TL0,#<(65536-50000) ;計時器初始值50MS中斷一次 MOV TH0,#>(65536-50000) ; MOV A,TIMEUP0 ;TIMER0 每50MS中斷一次 DEC A ;20次中斷遞減 MOV TIMEUP0,A ; CJNE A,#10,GODOWN ; GODOWN CJNE A,#0,OUT MOV TIMEUP0,#20 ;20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來X:00-->X:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. MOV R1,A :SAVE秒的數值 MOV A,TIME_M ,分鐘減一 DEC A MOV B,A ;SAVE A 修正分鐘的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G02 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 G02 MOV TIME_M,A ;轉回修正好的時間回TIME_M MOV A,R1 秒的數值 ;==================================== 重點來了 設"時間"時注意 如果是 10:00 TIME_M要SET "MOV TIME_M,#10H" 如果是 20:00 TIME_M要SET "MOV TIME_M,#20H 這樣倒數時間才20H-1==>1FH修正===>19H ...........................10H=1==>0FH修正====>09H ;================================== SS1: MOV B,A ;SAVE A 修正秒的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A ;/ ANL A,#F0H ;取十位數值 CJNE A,#F0H,G20 ;判斷十位數是否為F MOV A,B ; ANL A,#0FH ;\ ORL A,#50H ;|等於F則十位數設5 MOV B,A ;/ G20 MOV A,B ; MOV TIME_S,A ;轉回修正好的時間回TIME_S MOV R0,TIME_M ;讀取分鐘 CJNE R0,#00H,OUT ;判斷分鐘是否倒數完 否則跳出 CJNE A,#00H, OUT ;判斷秒鐘是否倒數完 否則跳出 MOV TIME_M,#0 MOV TIME_S,#0 CLR TR0 ;暫停計時 ;--------------------------------------- OUT POP A ; POP PSW ; RETI |
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
抱歉~是顯示08:59
程式如下: TIMEUP0 EQU 30H TIME_S EQU 31H TIME_M EQU 32H TMP0 EQU 33H TMP1 EQU 34H BUFR0 EQU 3AH BUFR1 EQU 3BH BUFR2 EQU 3CH BUFR3 EQU 3DH BUFR4 EQU 3EH BUFR5 EQU 3FH BUFR6 EQU 40H BUFR7 EQU 41H BUFA EQU 42H BUFDPH EQU 43H BUFDPL EQU 44H BUFSO1 EQU 45H BUFSO2 EQU 46H ;****************** SEG_0 EQU 3FH SEG_1 EQU 06H SEG_2 EQU 5BH SEG_3 EQU 4FH SEG_4 EQU 66H SEG_5 EQU 6DH SEG_6 EQU 7DH SEG_7 EQU 07H SEG_8 EQU 7FH SEG_9 EQU 6FH ;***************************************** ORG 0000H ; LJMP START ; ;------------------------------------------------------------- ORG 000BH ; AJMP TIMER0 ;####################################### START: MOV P0,#00H ; MOV P1,#FFH ; MOV P2,#00H ; MOV P3,#00H ; MOV SP,#50H ; MOV TIMEUP0,#20 ; CLR RS0 ; CLR RS1 ; MOV TIME_S,#00H ; MOV TIME_M,#00H MOV TMOD,#00010001B ; MOV IE,#10001010B ; CLR TR0 ; ;--------------------------------------- MAIN1: CALL ADJ_T1 ; ;--------------------------------------- NO1: CALL TESTSW ; LJMP MAIN1 ;******************************************* TIMER0: PUSH PSW ; PUSH A ; SETB RS0 ;\使用BANK3 SETB RS1 ;/ MOV TL0,#<(65536-50000) ;計時器初始值50MS中斷一次 MOV TH0,#>(65536-50000) ; MOV A,TIMEUP0 ;TIMER0 每50MS中斷一次 DEC A ;20次中斷遞減 MOV TIMEUP0,A ; CJNE A,#10,GODOWN ; GODOWN: CJNE A,#0,OUT MOV TIMEUP0,#20 ;20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來X:00-->X:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. MOV R1,A MOV A,TIME_M DEC A MOV B,A ;SAVE A 修正分鐘的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G02 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A G02: MOV TIME_M,A ;轉回修正好的時間回TIME_M MOV A,R1 ; SS1: MOV B,A ;SAVE A 修正秒的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A ;/ ANL A,#F0H ;取十位數值 CJNE A,#F0H,G20 ;判斷十位數是否為F MOV A,B ; ANL A,#0FH ;\ ORL A,#50H ;|等於F則十位數設5 MOV B,A ;/ G20: MOV A,B ; MOV TIME_S,A ;轉回修正好的時間回TIME_S MOV R0,TIME_M ;讀取分鐘 CJNE R0,#00H,OUT ;判斷分鐘是否倒數完 否則跳出 CJNE A,#00H, OUT ;判斷秒鐘是否倒數完 否則跳出 MOV TIME_M,#0 MOV TIME_S,#0 CLR TR0 ;暫停計時 ;--------------------------------------- OUT: POP A ; POP PSW ; RETI ;-------------------------------------------- TESTSW: JB P2.4,SET_THREE ; JB P2.5,SET_FIVE ; JB P2.6,SET_SEVEN ; JB P2.7,SET_NINE ; RET ;--------------------------------------- SET_THREE: JNB P2.4,$ MOV TIME_S,#00H MOV TIME_M,#03H SETB TR0 CALL ADJ_T1 RET ;---------------------------------------------- SET_FIVE: JNB P2.5,$ MOV TIME_S,#00H MOV TIME_M,#05H SETB TR0 CALL ADJ_T1 RET ;---------------------------------------------- SET_SEVEN: JNB P2.6,$ MOV TIME_S,#00H MOV TIME_M,#10H SETB TR0 CALL ADJ_T1 RET ;--------------------------------------------- SET_NINE: JNB P2.7,$ MOV TIME_S,#00H MOV TIME_M,#20H SETB TR0 CALL ADJ_T1 RET ;--------------------------------------------- DELAY : MOV R6,#06H ; DEY : MOV R7,#FFH $1: DJNZ R7,$1 DJNZ R6,DEY MOV P1,#FFH ; MOV P0,#00H MOV R6,#20H $2: NOP DJNZ R6,$2 RET ;-------------------------------------------- REGSAVE: MOV BUFR0,R0 ; MOV BUFR1,R1 MOV BUFR2,R2 MOV BUFR3,R3 MOV BUFR4,R4 MOV BUFR5,R5 MOV BUFR6,R6 MOV BUFR7,R7 MOV BUFA,A MOV BUFDPH,DPH MOV BUFDPL,DPL RET ;------------------------------------------------ REGBACK: MOV R0,BUFR0 ; MOV R1,BUFR1 MOV R2,BUFR2 MOV R3,BUFR3 MOV R4,BUFR4 MOV R5,BUFR5 MOV R6,BUFR6 MOV R7,BUFR7 MOV A,BUFA MOV DPH,BUFDPH MOV DPL,BUFDPL RET ;---------------------------------------- GET_7: CJNE A,#0,$1 ; MOV A,#SEG_0 ; RET ; $1: CJNE A,#1,$2 ; MOV A,#SEG_1 ; RET ; $2 : CJNE A,#2,$3 ; MOV A,#SEG_2 ; RET ; $3 : CJNE A,#3,$4 ; MOV A,#SEG_3 ; RET ; $4 : CJNE A,#4,$5 ; MOV A,#SEG_4 ; RET ; $5 : CJNE A,#5,$6 ; MOV A,#SEG_5 ; RET ; $6 : CJNE A,#6,$7 ; MOV A,#SEG_6 ; RET ; $7: CJNE A,#7,$8 ; MOV A,#SEG_7 ; RET ; $8: CJNE A,#8,$9 ; MOV A,#SEG_8 ; RET ; $9: MOV A,#SEG_9 ; RET ; ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ADJ_T1: MOV TMP0,TIME_S ; MOV TMP1,TIME_M ; JB P2.4,ADJ ; JB P2.5,ADJ ; JB P2.6,ADJ ; JB P2.7,ADJ ; CALL REGSAVE ; MOV R1,#03H ; AJMP LOOP ; ADJ: CALL REGSAVE ; MOV R1,#10H ; LOOP: MOV A,TMP0 ; ANL A,#0FH ; CALL GET_7 ; MOV P1,A ; MOV P0,#01H ; CALL DELAY ; ;--------------------------------------- MOV A,TMP0 ; SWAP A ; ANL A,#0FH ; CALL GET_7 ; MOV P1,A ; MOV P0,#02H ; CALL DELAY ; ;----------------------------------------- MOV A,TMP1 ; ANL A,#0FH ; CALL GET_7 ; MOV P1,A ; MOV P0,#04H ; CALL DELAY ; ;--------------------------------------- MOV A,TMP1 ; SWAP A ; ANL A,#0FH ; CALL GET_7 ; MOV P1,A ; MOV P0,#08H ; CALL DELAY ; ;--------------------------------------- DJNZ R1,LOOP CALL REGBACK RET End
------
滴滴儒 |
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
你好:
請使用jc,jnc指令判斷進位旗標, 使用da指令做十進制調整。 參考以下程式碼: ;-------------- mov R1,#099H ;秒數減1 mov A,TIME_S add a,R1 da a mov TIME_S,A jnc EXIT ;沒有借位,離開 mov a,#059H ;有借位,秒數設59 mov TIME_S,A mov R1,#099H ;分鐘減1 mov A,TIME_M add a,R1 da a mov TIME_M,A EXIT: ;判斷倒數完 ;-------------- 阿信~
編輯記錄
阿信 重新編輯於 2009-08-25 13:40:12, 註解 無‧
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
KEIL C51 是個好好的程序用了他好好DEBUG
MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來X:00-->X:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. MOV R1,A MOV A,TIME_M DEC A MOV B,A ;SAVE A 修正分鐘的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G02 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A G02: A,B 就是這句了呵呵 ;======================= G02: MOV TIME_M,A 有錯的句子 ;======================== MOV TIME_M,A ;轉回修正好的時間回TIME_M MOV A,R1 ; SS1: MOV B,A ;SAVE A 修正秒的時間 ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A ;/ ANL A,#F0H ;取十位數值 CJNE A,#F0H,G20 ;判斷十位數是否為F MOV A,B ; ANL A,#0FH ;\ ORL A,#50H ;|等於F則十位數設5 MOV B,A ;/ G20: MOV A,B ; MOV TIME_S,A ;轉回修正好的時間回TIME_S MOV R0,TIME_M ;讀取分鐘 CJNE R0,#00H,OUT ;判斷分鐘是否倒數完 否則跳出 CJNE A,#00H, OUT ;判斷秒鐘是否倒數完 否則跳出 MOV TIME_M,#0 MOV TIME_S,#0 CLR TR0 ;暫停計時 |
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
板主出了手了 但他的倒數時間的 RAM和顯示時的RAM 用了同一個 這個用法我不太喜 如他倒到00:59 TIME_S=59H 在這做減數沒什麼問題 ..............................................58 ..............................................57 ................................................: 但到00:49 TIME_S=4FH 在這要做修正 轉做"49H" 倒數的和顯示的的時間值分開 就不用煩了 TIME_S=5910 ==> TIME_S減一===> 轉十進制 ====>輸出到顯示暫存====.輸出顯示 |
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
MOV A,TIME_S ;讀秒數 A=00H TIME_S=00H TIME_M=19H
DEC A ;秒數減一 A=0FFH TIME_S=00H TIME_M=19H CJNE A,#0FFH,SS1 ;本來X:00-->X:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. MOV R1,A ; A=FFH R1=FFH MOV A,TIME_M ; A==19H TIME_M=19H DEC A ;A=18H MOV B,A ;SAVE A 修正分鐘的時間 A=18H ,B=18H ANL A,#0FH ;取個位數值 A=08H CJNE A,#0FH,G02 因為A不等於0FH 跳到G02 A=08H B=18H MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則個位數設9 MOV B,A G02: MOV A,B 就是這句了呵呵 B=18H, A=18H MOV TIME_M,A ;轉回修正好的時間回TIME_M 所以TIME_M=18H ========================================== 一個一個數代入就知哪裡出錯了 ========================================== MOV A,R1 ; R1=FFH ,A=FFH SS1: MOV B,A ;A=FFH B=FFH ANL A,#0FH ;A=0FH CJNE A,#0FH,G20 因為A=0FH 做下一句 MOV A,B ;B=FFH,A=FFH ANL A,#F0H ;A=F0H ORL A,#09H ;A=F9H MOV B,A ;A=F9H B=F9H ANL A,#F0H ;A=F0H CJNE A,#F0H,G20 ;因為A=F0H做下一句 MOV A,B ;B=F9H A=F9H ANL A,#0FH ;A=09H ORL A,#50H ;A=59H MOV B,A ;A=59H B=59H G20: MOV A,B ;B=59H A=59H MOV TIME_S,A A=59H TIME_S=59H TIME_M=18H TIME_S=59H 所以出來的不可能是08:59
編輯記錄
oYueno 重新編輯於 2009-08-27 01:25:13, 註解 G02: A,B 就是這句了呵呵 B=18H, A=18H‧
|
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
|
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |