全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3596
推到 Plurk!
推到 Facebook!

倒數計時器問題

答題得分者是:oYueno
albeeboy
一般會員


發表:7
回覆:20
積分:5
註冊:2009-08-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-21 01:23:50 IP:114.40.xxx.xxx 訂閱
小弟又要來請教各位大大了,希望各位大大指點迷津。
小弟現在寫了一個倒數計時器,只有分跟秒,要顯示在七段顯示器上,有四個彈跳按鈕,功能如下:
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-21 03:09:21 IP:203.186.xxx.xxx 訂閱
0.0好多錯處   copy到keil 51  組譯不了


START: 沒了":"

是PUSH ACC 不是 PUSH A

太少註釋 沒心機看了


我路過的不用理我!
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-21 03:41:46 IP:203.186.xxx.xxx 訂閱
我想問:START:   MOV     P0,#00H                 ;
MOV P1,#0FFH ;
MOV P2,#08H P2 SET #08 有什麼用意???

多數 INPUT 是SET 00或是FF 但你 P2.4SET"1" 但P2.5 2.6 2.7SET "0"


DEFINED LABEL 重複用不太好吧 $1 $2
albeeboy
一般會員


發表:7
回覆:20
積分:5
註冊:2009-08-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-21 10:07:01 IP:114.40.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-21 15:12:28 IP:203.186.xxx.xxx 訂閱
     MOV     A,TIME_S                ;    開始時time_s 是 "00" 秒
DEC A ; 這樣 A=00-1 出來的是255(8BIT 256進制)
DA A ; DA 高和低 4位元大於9 運算會出錯的
CJNE A,#00H,TSS_END


我只想到這
編輯記錄
oYueno 重新編輯於 2009-08-21 15:35:09, 註解 無‧
oYueno 重新編輯於 2009-08-21 15:35:53, 註解 無‧
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-21 15:33:52 IP:203.186.xxx.xxx 訂閱
我用了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 重新編輯於 2009-08-21 16:03:39, 註解 無‧
oYueno 重新編輯於 2009-08-21 16:09:53, 註解 無‧
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-21 22:20:38 IP:203.186.xxx.xxx 訂閱

[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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-22 13:15:31 IP:114.40.xxx.xxx 訂閱
這位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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-22 17:49:24 IP:203.186.xxx.xxx 訂閱
我都只是學了8051 才兩個月
希望你可以把修正好的程式重貼, 只有一段看不明
albeeboy
一般會員


發表:7
回覆:20
積分:5
註冊:2009-08-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-08-22 18:35:58 IP:114.40.xxx.xxx 訂閱
抱歉害大大看不懂,我才剛寫不到一個月,哈哈
對了!。樓上的大大,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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-08-22 18:50:31 IP:203.186.xxx.xxx 訂閱
        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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-08-22 19:19:14 IP:203.186.xxx.xxx 訂閱
抱歉害大大看不懂,我才剛寫不到一個月,哈哈
對了!。樓上的大大,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 ;暫停計時器
編輯記錄
oYueno 重新編輯於 2009-08-22 19:29:49, 註解 無‧
oYueno 重新編輯於 2009-08-22 19:36:03, 註解 無‧
oYueno 重新編輯於 2009-08-22 19:38:04, 註解 無‧
oYueno 重新編輯於 2009-08-22 20:09:30, 註解 無‧
albeeboy
一般會員


發表:7
回覆:20
積分:5
註冊:2009-08-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-08-23 02:12:49 IP:114.40.xxx.xxx 訂閱
經過大大的提醒,加上我的一些修正,倒數一分鐘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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-08-23 02:17:04 IP:114.40.xxx.xxx 訂閱
補充一下,我說錯了一點,是倒數到02:01時,
直接變00:00
------
滴滴儒
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-08-23 07:23:42 IP:203.186.xxx.xxx 訂閱
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 重新編輯於 2009-08-23 07:25:35, 註解 無‧
oYueno 重新編輯於 2009-08-23 07:28:53, 註解 無‧
oYueno 重新編輯於 2009-08-23 07:30:50, 註解 無‧
oYueno 重新編輯於 2009-08-23 07:34:48, 註解 無‧
oYueno 重新編輯於 2009-08-23 07:35:22, 註解 無‧
oYueno 重新編輯於 2009-08-23 07:46:10, 註解 無‧
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-08-23 08:06:26 IP:203.186.xxx.xxx 訂閱
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內容
76543210BIT
CYACF0RS1RS0OV-P


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-08-23 09:04:21 IP:203.186.xxx.xxx 訂閱
我想這樣吧
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 重新編輯於 2009-08-23 09:05:21, 註解 無‧
oYueno 重新編輯於 2009-08-23 09:10:27, 註解 無‧
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-08-23 09:18:29 IP:203.186.xxx.xxx 訂閱
你還有10:00 和20:0的時用做!
10和20分的分鐘數你也要做修正喔
祝你好運
oYueno
初階會員


發表:1
回覆:27
積分:25
註冊:2009-08-17

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-08-23 10:27:53 IP:203.186.xxx.xxx 訂閱
時間轉十進制我 做修改了

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 ;
:
:
:
編輯記錄
oYueno 重新編輯於 2009-08-23 10:31:32, 註解 無‧
oYueno 重新編輯於 2009-08-23 10:32:49, 註解 無‧
oYueno 重新編輯於 2009-08-23 10:36:09, 註解 無‧
albeeboy
一般會員


發表:7
回覆:20
積分:5
註冊:2009-08-02

發送簡訊給我
#20 引用回覆 回覆 發表時間:2009-08-23 10:59:48 IP:114.40.xxx.xxx 訂閱
真的很謝謝你這麼耐心的教我,我非常的感謝
我現在幾乎都懂了
很謝謝你,大大。
------
滴滴儒
系統時間:2024-05-06 20:04:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!