51 單片機(jī)匯編語言編程:從 99 到 0 倒計(jì)時(shí)
51 單片機(jī),求從 99 到 0 倒計(jì)時(shí)的匯編語言的程序。
再加入 3 個(gè)開關(guān)。
一個(gè)開關(guān)按下后,開始執(zhí)行倒計(jì)時(shí)程序,其他兩個(gè)用來暫停計(jì)時(shí)和停止計(jì)時(shí)(停止計(jì)時(shí)就顯示00吧)。
做而論道回答如下:
仿真電路圖:
程序:
? ? ORG 0000H
START:
? ? MOV ? P3, #0
? ? MOV ? DPTR, #TABLE
? ? MOV ? TMOD, #01H ? ? ?
? ? SETB ?TR0
LP0:MOV ? R4, #100
LP1:MOV ? R5, #20
LP2:MOV ? TH0, #3CH ? ? ?
? ? MOV ? TL0, #0B0H
LP3:CALL ?DISP
? ? JNB ? P1.0, K1
? ? JNB ? P1.1, K2
? ? JNB ? P1.2, K3
? ? JNB ? TF0, LP3
? ? CLR ? TF0
? ? DJNZ ?R5, LP2
? ? DJNZ ?R4, LP1
? ? JMP ? LP0
K1: CALL ?DISP
? ? JB ? ?P1.0, LP3
? ? SETB ?TR0
? ? JMP ? LP3
K2: CALL ?DISP
? ? JB ? ?P1.1, LP3
? ? CLR ? TR0
? ? JMP ? LP3
K3: CALL ?DISP
? ? JB ? ?P1.2, LP3
? ? CLR ? TR0
? ? MOV ? R4, #1
? ? JMP ? LP3
;---------------------------
DISP:
? ? MOV ? A, R4
? ? DEC ? A
? ? MOV ? B, #10
? ? DIV ? AB ? ? ? ? ? ?
? ? MOVC ?A, @A+DPTR
? ? MOV ? P2, A
? ? SETB ?P3.1
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? CLR ? P3.1
? ? MOV ? A, B
? ? MOVC ?A, @A+DPTR
? ? MOV ? P2, A
? ? SETB ?P3.0
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? CLR ? P3.0
? ? RET
TABLE:
? ? DB ? 0C0H, 0F9H, 0A4H, 0B0H, 99H
? ? DB ? 92H, 82H, 0F8H, 80H, 90H
END
02013-11-14 12:17
提問者評(píng)價(jià):行了,非常感謝你。
網(wǎng)友評(píng)論:(monengs2013-11-14 18:26)
這程序,實(shí)時(shí)性強(qiáng),省資源(只用了通用寄存器),有按鍵去抖,把重復(fù)功能的語句調(diào)整合并了。
確實(shí)這個(gè)是好答案!
============================
提問者在另一個(gè)問題中,提出了新要求:
幫我編一個(gè)99倒計(jì)時(shí)到0的匯編語言的程序,不要用DIV的。
前面使用 DIV,是用于分離計(jì)數(shù)值的十位、個(gè)位,以便分別進(jìn)行顯示。
現(xiàn)在不讓用 DIV,那么,十位個(gè)位在計(jì)數(shù)的時(shí)候,就應(yīng)該用兩個(gè)單元分別計(jì)數(shù),顯示的時(shí)候,就不用分離了。
做而論道編寫的程序如下:
? ? ORG 0000H
START:
? ? MOV ? 39H, #0C0H
? ? MOV ? 38H, #0F9H
? ? MOV ? 37H, #0A4H
? ? MOV ? 36H, #0B0H
? ? MOV ? 35H, #99H
? ? MOV ? 34H, #92H
? ? MOV ? 33H, #82H
? ? MOV ? 32H, #0F8H
? ? MOV ? 31H, #80H
? ? MOV ? 30H, #90H
? ? MOV ? P3, #0
? ? MOV ? TMOD, #01H
? ? SETB ?TR0
LP: MOV ? R0, #30H
LP0:MOV ? R1, #30H
LP1:MOV ? R5, #20
LP2:MOV ? TH0, #3CH
? ? MOV ? TL0, #0B0H
LP3:CALL ?DISP
? ? JNB ? P1.0, K1
? ? JNB ? P1.1, K2
? ? JNB ? P1.2, K3
? ? JNB ? TF0, LP3
? ? CLR ? TF0
? ? DJNZ ?R5, LP2
? ? INC ? R1
? ? CJNE ?R1, #3AH, LP1
? ? INC ? R0
? ? CJNE ?R0, #3AH, LP0
? ? JMP ? LP
K1:
? ? CALL ?DISP
? ? JB ? ?P1.0, LP3
? ? SETB ?TR0
? ? JMP ? LP3
K2: CALL ?DISP
? ? JB ? ?P1.1, LP3
? ? CLR ? TR0
? ? JMP ? LP3
K3: CALL ?DISP
? ? JB ? ?P1.2, LP3
? ? CLR ? TR0
? ? MOV ? R0, #39H
? ? MOV ? R1, #39H
? ? MOV ? R5, #01H
? ? JMP ? LP2
DISP:
? ? MOV ? P2, @R0
? ? SETB ?P3.1
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? CLR ? P3.1
? ? MOV ? P2, @R1
? ? SETB ?P3.0
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? CLR ? P3.0
? ? RET
END
本程序仿真執(zhí)行后,和前述截圖相同。