?? 2051做的4位電子鐘.txt
字號:
S_1 EQU 30H ;秒寄存器
M_1 EQU 31H ;分寄存器
H_1 EQU 32H ;時寄存器
ORG 00H
LJMP START
ORG 0000BH ;定時器T0中斷入口
LJMP TIMER
ORG 30H
START:
MOV S_1, #0 ;秒寄存器清0
MOV M_1, #0;分清0
MOV H_1, #0;時清0
MOV 20H, #10 ;0.5秒鐘中斷次數,0.5s=500ms=50msx10
MOV 21H, #2 ;2個0.5秒即為1秒
MOV SP, #40H ;堆棧設置
MOV IE, #82H ;開定時器0中斷及總中斷
MOV TMOD, #01H ;定時器T0模式1
MOV TH0, #03CH ;50ms初值
MOV TL0, #0B0H
SETB TR0 ;啟動定時器器
LOOP:
ACALL DISP ;調用顯示
JNB P3.2, MT ;查詢分調整鍵
JNB P3.3, HT ;查詢時調整鍵
AJMP LOOP
MT: ;分調整
ACALL DISP
JNB P3.2, MT ;鍵消抖
INC M_1 ;分加1
MOV A, M_1
CJNE A, #60, LOOP;沒到60分返回,到60分清0
MOV M_1, #0
AJMP LOOP
HT: ;時調整
ACALL DISP
JNB P3.3, HT
INC H_1
MOV A, H_1
CJNE A, #24, LOOP
MOV H_1 , #0
AJMP LOOP
DISP: ;顯示子程序
MOV DPTR, #NUMTAB ;表地址送數據指針
MOV A, M_1 ;分送A
MOV B, #10
DIV AB ;十進制調整
ADD A, R0 ;查表偏移量調整
MOVC A, @A+DPTR ; 查表
MOV P0, A ;分十位送p1口顯示
CLR P2.1 ;開分十位顯示
ACALL D1MS ;延時1ms
SETB P2.1 ;關顯示
MOV A, B ;分個位p1口顯示
ADD A, R0
MOVC A, @A+DPTR
MOV P0, A
CLR P2.0
ACALL D1MS
SETB P2.0
MOV A, H_1 ;時送A
MOV B, #10
DIV AB
ADD A, R0
MOVC A, @A+DPTR
MOV P0, A
CLR P2.5 ;顯示時十位
ACALL D1MS
SETB P2.5
MOV A, B
ADD A, R0
MOVC A, @A+DPTR
MOV P0, A
CLR P2.4 ;顯示時個位
ACALL D1MS
SETB P2.4
RET ;返回
TIMER: ;定時中斷程序
PUSH ACC ;數據保護
PUSH PSW
MOV TL0, #0B9H ;重置50ms定時值
MOV TH0, #03CH
DJNZ 20H, RETI_1 ;到0.5秒了嗎?
MOV 20H, #10
CPL 25H.0 ;取反秒點閃爍標志位
JNB 25H.0,T_1 ;標志位為0轉T_1
MOV R0, #0 ;查表偏移量寄存器置0(不顯示秒點)
AJMP T_2
T_1:
MOV R0,#10;查表偏移量寄存器置10(顯示秒點,秒點每秒閃爍1次)
T_2:
DJNZ 21H ,RETI_1 ;到1秒了嗎?
MOV 21H,#2
INC S_1 ;秒加1
MOV A, S_1
CJNE A, #60, RETI_1;到60秒了嗎?
MOV S_1, #0 ;到60秒清0
INC M_1 ;分加1
MOV A, M_1
CJNE A, #60, RETI_1 ;到60分了嗎?
MOV M_1, #0
INC H_1 ;時加1
MOV A, H_1
CJNE A,#24,RETI_1 ;24小時到了嗎
MOV H_1, #0
RETI_1:
POP PSW
POP ACC
RETI
D1MS: ;1毫秒延時
MOV R7, #2
D_1:
MOV R6, #250
DJNZ R6, $
DJNZ R7,D_1
RET
NUMTAB:
DB 0C0H,0F3H,89H,0A1H,0B2H,0A4H,84H,0F1H,80H,0A0H
;不顯示秒點
DB 40H,73H,09H,21H,32H,24H,04H,71H,00H,20H
;顯示秒點
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -