倒數計時器問題 |
答題得分者是:oYueno
|
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
小弟又要來請教各位大大了,希望各位大大指點迷津。
小弟現在寫了一個倒數計時器,只有分跟秒,要顯示在七段顯示器上,有四個彈跳按鈕,功能如下: P2。4倒數3分鐘(03:00) P2。5倒數5分鐘(05:00) P2。6倒數10分鐘(10:00) P2。7倒數20分鐘(20:00) 一開始未按下任何按鍵時,七段顯示器顯示(00:00),當我按下任何一個鍵時,照理講會開始倒數, 但是現在有狀況,例如我按P2。4,正常來說是倒數3分鐘,但是我現在按下了P2。4,一開始七段顯 示器顯示(03:00),之後不知道為什麼變成(03:65)在倒數,且倒數到(03:60)時,又變 成(03:65)一直重複下去,小弟不知到哪裡錯,懇請各位大大幫我 程式如下: TIMEUP0 EQU 30H ;變數定義區 TIME_S EQU 31H TIME_M EQU 32H TMP0 EQU 37H TMP1 EQU 38H 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,#08H ; MOV P3,#40H ; MOV SP,#50H ; MOV TIMEUP0,#20 ; CLR RS0 ; CLR RS1 ; MOV TIME_S,#00H ; MOV TIME_M,#00H ; MOV TMOD,#00010001B ;使用模式1 MOV IE,#10001010B ; CLR TR0 ; ;--------------------------------------- MAIN1 CALL ADJ_T1 ; ;--------------------------------------- NO1 CALL TESTSW ;偵測按鈕 LJMP MAIN1 ;******************************************* TSS_END AJMP TS_END TOO_END AJMP T1_END TMM_END AJMP TM_END TIMER0 PUSH PSW ;時間運算副程式 PUSH A ; SETB RS0 ; SETB RS1 ; MOV TL0,#<(65536-50000) ; MOV TH0,#>(65536-50000) ; MOV A,TIMEUP0 ; DEC A ; MOV TIMEUP0,A ; CJNE A,#10,GODOWN ; GODOWN CJNE A,#0,TOO_END ; MOV TIMEUP0,#20 ; ;---------------------------------------- MOV A,TIME_S ; DEC A ; DA A ; CJNE A,#00H,TSS_END ; MOV TIME_S,#59 ; MOV A,TIME_M ; DEC A ; DA A ; CJNE A,#00H,TMM_END ; MOV TIME_M,#0 ; ;---------------------------------------- TS_END MOV TIME_S,A ; AJMP T1_END ; TM_END MOV TIME_M,A ; AJMP T1_END ; T1_END CLR RS0 ; CLR RS1 ; POP A ; POP PSW ; RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; 按鈕副程式 JB P2.5,SET_FIVE ; JB P2.6,SET_TEN ; JB P2.7,SET_TWENTY ; 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_TEN JNB P2.6,$ MOV TIME_S,#00H MOV TIME_M,#10H SETB TR0 CALL ADJ_T1 RET ;------------------------------------------- SET_TWENTY 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.0,ADJ ; JB P2.1,ADJ ; JB P2.2,ADJ ; JB P2.3,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
------
滴滴儒 | ||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
P0,P1,P2,P3不是按鈕的定義,按鈕的定義只有P2
P0阜有七個接腳分別接到七段顯示器的abcdefg P1阜也是七個接腳,但我只用四個,因為四個七段顯示器 接到接七段顯示器的電晶體,P3則沒用到,至於P2為什麼 是08H,是因為我的SP在50H,因為之前我不是用08H,但是 按鍵按了幾次之後就會重新一次,沒辦法繼續往上,是問別人 才知道堆疊爆了.你說的:我會改進,因為我朋友也說應該是 要再標頭檔後加冒號,至於PUSH A的用法我看過書了,也可以 這樣寫,至於為什麼你用keil51會出錯,我就不知道了,因為我用的 x8051組譯並沒錯,不知道大大你是寫keilC還式組合語言
------
滴滴儒 |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
我用了KEIL C51
做了測試 MOV A#0 ;A=00H DEC A ;A=0FFH //當A=0時減1=255// DA A ;A=65H 和你出來的結果相同 所以我想是這樣吧 TSS_END AJMP TS_END TOO_END AJMP T1_END TMM_END AJMP TM_END TIMER0 PUSH PSW ;時間運算副程式 PUSH A ; SETB RS0 ; SETB RS1 ; MOV TL0,#<(65536-50000) ; MOV TH0,#>(65536-50000) ; MOV A,TIMEUP0 ; DEC A ; MOV TIMEUP0,A ; CJNE A,#10,GODOWN ; GODOWN CJNE A,#0,TOO_END ; MOV TIMEUP0,#20 ; ;---------------------------------------- MOV A,TIME_S ; DEC A ; DA A ; CJNE A,#65H,J1 MOV A,#59 J1: CJNE A,#00H,TSS_END ; MOV TIME_S,#59 ; MOV A,TIME_M ; DEC A ; DA A ; CJNE A,#00H,TMM_END ; MOV TIME_M,#0 ; |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
[code delphi] int_val DATA 22H ;中斷次數存放RAM scan_ptr DATA 23H dis_ptr DATA 24H ; 顯示器掃描指標 TIME DATA 25H ;25H,26H=分秒 D_RAM DATA 27H ;顯示器存放RAM27H~30H ORG 00H JMP START ;主程式 ORG 0BH ;TIMER0中斷向量 JMP T0_int ;TIMER0中斷副程式 START: MOV SP,#60H ;堆疊指標 MOV TMOD,#01H ;TIMER0工作在MODE1 MOV TH0,#HIGH (65536-4000) ;中斷掃描時間4ms MOV TL0,#LOW (65536-4000) MOV IE,#82H ;TIMER0中斷致能 MOV int_val,#250 ;中斷250次=1秒 MOV dis_ptr,#0 ;顯示器掃描指標 MOV scan_ptr,#0EEH MOV TIME,#3 ;預設時間03:00 MOV TIME 1,#00 CALL NOW_TIME ;更新時間 SETB TR0 MOV A,TIME X1: CJNE A,#FF,X1 JMP START NOW_TIME: ;更新現在時間 MOV A,TIME 1 ;處理秒 CJNE A,#0FFH,NOL ;當要借位時 ,TIME(分)減一 MOV A,#59 MOV TIME 1,A DEC TIME NOL: MOV B,#10 DIV AB ;個位數分離 //秒/10,餘數給B轉入D_RAM 3,商給A MOV D_RAM 3,B ;EX A=59 B=10 A/B>>>>A=5 B=9 MOV D_RAM 2,A MOV A,TIME ;處理分 MOV B,#10 DIV AB MOV D_RAM 1,B MOV D_RAM,A RET T0_int: PUSH ACC PUSH PSW SETB RS0 ;暫存器庫1 CLR RS1 MOV TH0,#HIGH (65536-4000) ;重設中斷時間4ms MOV TL0,#LOW (65536-4000) DJNZ int_val,TI1 ;中斷次數減1,判斷是否為0? MOV int_val,#250 ;是則1秒時間到,重設中斷次數 DEC TIME 1 ;1秒時間到 "秒"減一 CALL NOW_TIME ;更新時間 TI1: MOV A,dis_ptr ;是否掃描完4個顯示器?是則重設指標為0 CJNE A,#4,TI2 MOV dis_ptr,#0 TI2: MOV A,dis_ptr ;R0=掃描指標 27H(D_RAM)定址 ADD A,#D_RAM MOV R0,A MOV A,@R0 MOV DPTR,#KK MOVC A,@A DPTR MOV P0,A ;輸出掃描顯示 MOV A,scan_ptr MOV P1,A RL A MOV scan_ptr,A ;掃描下一個顯示器 INC dis_ptr POP PSW POP ACC RETI KK: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H ;0,1,2,3,4,5,6,7,8,9 END [/code] 寫了個 到數計時 修改"TIME"和"TIME 1" 可以改變 開始到數的時間 但想不到如可可以今他停下來 這是用KEIL C51寫的
編輯記錄
oYueno 重新編輯於 2009-08-21 22:35:44, 註解 無‧
|
||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
這位oYueno大大,小弟大概知道哪錯了,但是弄了很久還是沒辦法
我試過如果只倒數秒,我給9秒的話,它可以正常倒數,但是 我給10秒的話,就不行了,小弟也懂你說的DA A的意思,他在做BCD調整時會加6 所以小弟試了一個想法,就是現在我只要倒數59秒,倒數到50秒時減一會變4F, 如果用原來的方式寫了話,會變成4F加6,出來的值是55,又倒數到50秒時又變55,一直下去 所以小弟寫了一個程試判斷,就是當我50減一變4F時,去加上一F9的值,應該要49且繼續減一 也就是說50-1=>4F,40-1=3F,30-1=2F,20-1=1F,10-1=0F 當我遇到4F,3F,2F,1F,0F時,會去加F9的值變成49,39,29,19,09 如果小弟想法沒錯的話,正常是可以的,但是還是不行,變亂跳 我想它倒數到50時變49,40變39,30變29,20變19,10變9,現在卡在這裡 如果大大會的話,請教我,小弟剛寫組合語言不久,還不太會,小弟謝謝這位大大的耐心指教 程是片段: MOV A,TIME_S DEC A DA A CJNE A,#4FH,TSS_END ADD A,#F9H DEC A DA A CJNE A,#3FH,TSS_END ADD A,#F9H DEC A DA A CJNE A,#2FH,TSS_END ADD A,#F9H DEC A DA A CJNE A,#1FH,TSS_END ADD A,#F9H DEC A DA A CJNE A,#0FH,TSS_END ADD A,#F9H DEC A DA A CJNE A,#00,TSS_END MOV TIME_S,#0 CLR TR0
------
滴滴儒 |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
抱歉害大大看不懂,我才剛寫不到一個月,哈哈
對了!。樓上的大大,59秒的我已經成功,現在我想做一分鐘的 也就是七段顯示器顯示(01:00),但有一點我現在不太懂, 就是一開始也秒數也00,和結束時也00,我該如何判斷阿,還有00怎麼變59, 希望大大指點迷津,我先把59秒的程式重貼,大部分沒變,只變時間運算部分, 按鈕我現在只設一個,時間運算部分我會註解清楚點。 程式如下: TIMEUP0 EQU 30H TIME_S EQU 31H TMP0 EQU 37H 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 TMOD,#00010001B ; MOV IE,#10001010B ; CLR TR0 ; ;--------------------------------------- MAIN1 CALL ADJ_T1 ; ;--------------------------------------- NO1 CALL TESTSW ; LJMP MAIN1 ;******************************************* TSS_END AJMP TS_END TOO_END AJMP T1_END 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,TOO_END ; MOV TIMEUP0,#20 ;20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 MOV B,A ; ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則各位數設9 MOV B,A ;/ G20 MOV A,B ; CJNE A,#00H,TSS_END ;倒數是否為0 MOV TIME_S,#0 ;為0秒數值給0 CLR TR0 ;暫停計時器 ;---------------------------------------- TS_END MOV TIME_S,A ; AJMP T1_END ; T1_END CLR RS0 ; CLR RS1 ; POP A ; POP PSW ; RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; RET ;--------------------------------------- SET_THREE JNB P2.4,$ MOV TIME_S,#59H 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 ; JB P2.4,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 ; ;--------------------------------------- DJNZ R1,LOOP CALL REGBACK RET End
------
滴滴儒 |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
MOV A,TIME_S
DEC A DA A CJNE A,#4FH,TSS_END ADD A,#F9H----------------------------你做了修改應該是跳回原程序吧 DEC A------------------------------------這個又減一做什麼? 是 AJMP TSS_END吧 DA A CJNE A,#3FH,TSS_END ADD A,#F9H 我想的是這樣吧 MOV A,TIME_S DEC A ;時間減一 DA A ;轉十進數 CJNE A,#4FH,T3F ;A=4F 是則加#F9 後跳回TSS_END 否則再判斷 ADD A,#F9H AJMP TSS_END T3F: CJNE A,#3FH,T2F ;A=3F 是則加#F9 後跳回TSS_END 否則再判斷 ADD A,#F9H AJMP TSS_END T2F: CJNE A,#2FH,T1F ;A=2F 是則加#F9 後跳回TSS_END 否則再判斷 ADD A,#F9H AJMP TSS_END T1F: CJNE A,#1FH,T0F ;A=1F 是則加#F9 後跳回TSS_END 否則再判斷 ADD A,#F9H AJMP TSS_END T0F: CJNE A,#0FH,T00 ;A=0F 是則加#F9 後跳回TSS_END 否則再判斷 ADD A,#F9H AJMP TSS_END T00: CJNE A,#00,TSS_END MOV TIME_S,#0 CLR TR0 |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
抱歉害大大看不懂,我才剛寫不到一個月,哈哈
對了!。樓上的大大,59秒的我已經成功,現在我想做一分鐘的 也就是七段顯示器顯示(01:00),但有一點我現在不太懂, 就是一開始也秒數也00,和結束時也00,我該如何判斷阿,還有00怎麼變59, 希望大大指點迷津,我先把59秒的程式重貼,大部分沒變,只變時間運算部分, 按鈕我現在只設一個,時間運算部分我會註解清楚點。 開始是 SET時 1:00(你的TIME_M =01,TIME_S=00) 當時間到了TIME_S要減一,也就是00-1=255出現的時, 這時你把"TIME_M"減一和修改"TIME"_S MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來1:00-->0:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. DEC TIME_M MOV A,#59 ;修正0-1=59 SS1: MOV B,A ; ANL A,#0FH ;取個位數值 CJNE A,#0FH,G20 ;判斷個位數是否為F MOV A,B ; ANL A,#F0H ;\ ORL A,#09H ;|等於F則各位數設9 MOV B,A ;/ G20 MOV A,B ; CJNE A,#00H,TSS_END ;倒數是否為0 CJNE TIME_M,#0,TSS_END ; 倒數時"分鐘"有時間不要停止倒數 MOV TIME_S,#0 ;為0秒數值給0 CLR TR0 ;暫停計時器 |
||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
經過大大的提醒,加上我的一些修正,倒數一分鐘OK了
我又繼續寫了一個三分鐘(03:00),只改按鈕按下裡的變數 也就是說當我按下P2。4時,一開始七段顯示器要顯示倒數3分鐘 ,重03:00開始倒數,本來很正常倒數,但倒數到02:00時 直接變00:00,也就是說我的分只能減一,為什麼會這樣?? 程式如下: TSS_END AJMP TS_END TOO_END AJMP T1_END TMM_END AJMP TM_END 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,TOO_END ; MOV TIMEUP0,#20 ;20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;本來1:00-->0:59 TIME_S"00"-1 出現A=FF即是要借位這時分鐘減一. DEC TIME_M SS1: MOV B,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 MOV A,B ANL A,#0FH ORL A,#50H MOV B,A G20 MOV A,B ; CJNE A,#00H,TSS_END ;倒數是否為0 CJNE A,#00H,TMM_END MOV TIME_S,#0 ;為0秒數值給0 MOV TIME_M,#0 CLR TR0 ;暫停計時 ;---------------------------------------- TS_END MOV TIME_S,A ; AJMP T1_END ; TM_END MOV TIME_M,A AJMP T1_END T1_END CLR RS0 ; CLR RS1 ; POP A ; POP PSW ; RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; RET ;--------------------------------------- SET_THREE JNB P2.4,$ MOV TIME_S,#00H MOV TIME_M,#03H SETB TR0 CALL ADJ_T1 RET
------
滴滴儒 |
||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
|||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
SORRY 我的先後次序錯了
G20 MOV A,B ; CJNE TIME_M,#0,OUT ; 倒數時"分鐘"有時間不要停止倒數改這吧 CJNE TIME_M,#0,OUT ;先問 CJNE A,#00H,OUT ;分鐘 沒時間了再問有沒有時間 有的跳出 沒的停止"T0" CJNE TIME_M,#0,OUT ; ; CJNE A,#00H,OUT ;分鐘 沒時間了再問有沒有 時間 有的跳出 沒的停止"T0" . . . OUT: POP A ; POP PSW ; RETI |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
TSS_END AJMP TS_END ;這機句怪怪的
TOO_END AJMP T1_END ; 跳來跳去,不如直接一點??? TMM_END AJMP TM_END . . . 我覺得先轉回修正好的時間回TIME_S比較好 MOV TIME_S,A CJNE A,#00H,TSS_END ;倒數是否為0 CJNE A,#00H,TMM_END MOV TIME_S,#0 ;為0秒數值給0 MOV TIME_M,#0 CLR TR0 ;暫停計時 ;---------------------------------------- TS_END MOV TIME_S,A ; AJMP T1_END ; TM_END MOV TIME_M,A ;這個"A" 是秒的時間送回TIME_M有一點問題 AJMP T1_END T1_END CLR RS0 ;這兩句 用了POP PSW可以不用了,因為 RS0 RS1都在PWS內 CLR RS1 ; PWS內容
POP A ; POP PSW ; RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; RET ;--------------------------------------- SET_THREE JNB P2.4,$ MOV TIME_S,#00H MOV TIME_M,#03H SETB TR0 CALL ADJ_T1 RET |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
我想這樣吧
TIMER0: PUSH PSW ; TSS_END,TOO_END,T1_END三句取消 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,#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 R0,TIME_M ;X8051可以的話DEC TIME_M就最好了 DEC R0 ;一句頂三句 MOV TIME_M,R0 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 MOV A,B ANL A,#0FH ORL A,#50H 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_S,#0 ;為0秒數值給0 MOV TIME_M,#0 ;這兩句怪怪 ,如果TIME_S TIME_M不是都來不到這 CLR TR0 ;暫停計時 ;---------------------------------------- OUT: ;TS_END MOV TIME_S,A ; 這6句不用了 POP A ; : POP PSW ;CLR RS1 RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; RET ;--------------------------------------- SET_THREE JNB P2.4,$ MOV TIME_S,#00H MOV TIME_M,#03H SETB TR0 CALL ADJ_T1 RET |
||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
|||||||||||||||||||
oYueno
初階會員 發表:1 回覆:27 積分:25 註冊:2009-08-17 發送簡訊給我 |
時間轉十進制我 做修改了
TIME_SS EQU 47H ;KEIL C51 是 TIME_SS DATA 47H TIME_MM EQU 48H ; TIME_MM DATA 48H TIMER0: PUSH PSW ; TSS_END,TOO_END,T1_END三句取消 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,#0,OUT ;時間不到一秒跳出 MOV TIMEUP0,#20 ;時間到一秒,20中斷重算 ;-------------------------------------- MOV A,TIME_S ;讀秒數 DEC A ;秒數減一 CJNE A,#0FFH,SS1 ;修正00-1=255的問題 MOV A,#59 MOV TIME_S,A ;轉回修正好的時間回TIME_S MOV R0,TIME_M ;X8051可以的話DEC TIME_M就最好了 DEC R0 ;一句頂三句 MOV TIME_M,R0 SS1: MOV B,#10 ;SET B=10 DIV AB ;把A除10 SWAP A ;因為上方修正了A最大是59 ...........................................;A=5X, A /10,A=5,A=4X,A/10,A=4 ...........................................;如果 A=5 AWAP A之後 A=50F ORL A,B ;把餘數補回 EX A=5910==>A=3BF==>A/10==>A=05F,B=09F ...........................................;SWAP A====>A=50F, ORL A,B==>A=59H ...........................................;問題來了, 這個是十進制的數字不是倒數用的59F是8910 ...........................................;所要置一個顯示的 RAM TIME_SS MOV TIME_SS,A ;轉回修正好的時間回TIME_SS 顯示時間的RAM ============================================= MOV A,TIME_M ;處理分鐘的 MOV B,#10 ;SET B=10 DIV AB ;把A除10 SWAP A ;因為上方修正了分最大是2010 ...........................................;A=5X, A /10,A=5,A=4X,A/10,A=4 ...........................................;如果 A=5 AWAP A之後 A=50F ORL A,B ;把餘數補回 EX A=2010==>A=14F==>A/10==>A=02F,B=00F ...........................................;SWAP A====>A=20F, ORL A,B==>A=20H ...........................................;問題來了, 這個是十進制的數字不是倒數用的, 20F是3210 ...........................................;所要置一個顯示的 RAM TIME_MM MOV TIME_MM,A ;轉回修正好的時間回TIME_MM 顯示時間的RAM ================================================================== MOV R0,TIME_M ;讀取分鐘 CJNE R0,#00H,OUT ;判斷分鐘是否倒數完 否則跳出 MOV A,TIME_S ;讀取秒鐘 CJNE A,#00H, OUT ;判斷秒鐘是否倒數完 否則跳出 MOV TIME_S,#0 ;為0秒數值給0 MOV TIME_M,#0 ;這兩句怪怪 ,如果TIME_S TIME_M不是都來不到這 CLR TR0 ;暫停計時 ;---------------------------------------- OUT: ;TS_END MOV TIME_S,A ; 這6句不用了 POP A ; : POP PSW ;CLR RS1 RETI ;-------------------------------------------- TESTSW JB P2.4,SET_THREE ; RET ;--------------------------------------- SET_THREE JNB P2.4,$ MOV TIME_S,#00H MOV TIME_M,#03H SETB TR0 CALL ADJ_T1 RET ADJ_T1 MOV TMP0,TIME_SS ; MOV TMP1,TIME_MM ; : : : |
||||||||||||||||||
albeeboy
一般會員 發表:7 回覆:20 積分:5 註冊:2009-08-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |