;有位網友寫了一個倒計時秒表的程序,程序中的變量,采用了逐次加一的方法。;變量加一,怎么能夠倒計時呢?;原來,程序中段碼的排列次序,反過來了。;于是:;當變量是0的時候,查找出來9的段碼,送去顯示;;當變量是1的時候,查找出來8的段碼,送去顯示;;……;當變量是9的時候,查找出來1的段碼,送去顯示。
;更改一下七段碼表的次序,竟然可以使程序由正計時,變成倒計時!;構思極為巧妙。;PROTEUS 仿真截圖如下:
11.png (20.93 KB, 下載次數: 58)
下載附件
2018-7-15 21:42 上傳
;程序使用匯編語言編寫,原程序的結構有些凌亂,沒有達到預期的效果。;做而論道稍加整理,可以正常工作了,全部程序如下。;硬件中,設置了一個按鍵,用以控制計時器的啟動、暫停和復位。
SECOND EQU 30H
TCOUNT EQU 31H
KCOUNT EQU 32H
KEY BIT P3.7
ORG 00H
SJMP START
ORG 0BH
LJMP T0_INT
;----------------------------------------
START:
MOV P0, #6FH ;開始, 數碼管顯示"99"
MOV P2, #6FH MOV TMOD, #01H ;T0定時方式1
MOV TH0, #(65536 - 50000) / 256
MOV TL0, #(65536 - 50000) MOD 256
MOV IE, #82H MOV SECOND, #0
MOV TCOUNT, #0
MOV KCOUNT, #0
;----------------------------------------
K0:
JB KEY, $ ;等待按鍵按下
CALL DELAY ;延時
JB KEY, K0 ;沒有按下,就是抖動
JNB KEY, $ ;等待按鍵松開
INC KCOUNT ;按鍵次數值加1
;----------------------
MOV A, KCOUNT ;判斷按鍵次數
K1:
CJNE A, #1, K2
SETB TR0 ;第1次按鍵, 啟動定時器
JMP K0
;----------------------
K2:
CJNE A, #2, START
CLR TR0 ;第2次按鍵, 關閉定時器
JMP K0
;----------------------------------------
T0_INT:
MOV TL0, #(65536 - 50000) MOD 256
MOV TH0, #(65536 - 50000) / 256
INC TCOUNT
MOV A, TCOUNT
; CJNE A, #2, T0_END ;是否計0.1秒?
CJNE A, #10, T0_END ;2, 速度太快,不便觀察,暫用10
MOV TCOUNT, #0
INC SECOND
MOV A, SECOND
CJNE A, #100, DISP ;是否夠10秒?
MOV SECOND, #0
DISP:
MOV DPTR, #TABLE
MOV A, SECOND
MOV B, #10
DIV AB
MOVC A, @A+DPTR ;顯示時間
MOV P0, A
MOV A, B
MOVC A, @A+DPTR
MOV P2, A
T0_END:
RETI
;----------------------------------------
TABLE:
;9~0的段碼, 反序排序。使用反序,可顯示倒計時
DB 6FH, 7FH, 07H, 7DH, 6DH
DB 66H, 4FH, 5BH, 06H, 3FH
;0~9的段碼, 正序
; DB 3FH, 06H, 5BH, 4FH, 66H
; DB 6DH, 7DH, 07H, 7FH, 6FH
;----------------------------------------
DELAY:
MOV R6, #20
D1: MOV R7, #250
DJNZ R7, $
DJNZ R6, D1
RET
;----------------------------------------
END
|