這是我最近課上做的基于單片機開發(fā)板的匯編程序設(shè)計,內(nèi)容是電子鐘的控制。利用定時器每100ms中斷一次,中斷10次自以為基準(zhǔn),設(shè)計一個24小時制數(shù)字電子鐘,并在開發(fā)機上數(shù)碼管以時分秒的形式顯示。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT0
ORG 0100H
MAIN: MOV SP,#70H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R5,#14H
SETB EA
SETB TR0
SETB ET0
CLR C
MOV A,22H
SUBB A,#59H
JNC L11
CLR C
MOV A,23H
SUBB A,#59H
JNC L11
CLR C
MOV A,22H
SUBB A,#23H
CLR 20H.0
CLR 20H.1
CLR 20H.2
JNC L11
LJMP L12
L11: MOV 24H,#00H
MOV 23H,#00H
MOV 22H,#12H
L12: JB 20H.0,DO1
JB 20H.1,DO2
JB 20H.2,DO3
LCALL MOVE
LCALL DISP
LCALL KEY
SJMP L12
DO1: CLR TR0
MOV 30H,24H
LCALL MOVE
LCALL DISP
LCALL KEY
MOV A,30H
CJNE A,#60H,TO1
MOV 30H,#00H
TO1: MOV 24H,30H
SETB TR0
LJMP L12
DO2: CLR TR0
MOV 30H,23H
LCALL MOVE
LCALL DISP
LCALL KEY
MOV A,30H
CJNE A,#60H,TO2
MOV 30H,#00H
TO2: MOV 23H,30H
SETB TR0
LJMP L12
DO3: CLR TR0
MOV 30H,22H
LCALL MOVE
LCALL DISP
LCALL KEY
MOV A,30H
CJNE A,#24H ,TO3
MOV 30H,#00H
TO3: MOV 22H,30H
SETB TR0
LJMP L12
KEY: CLR A
MOV DPTR,#8002H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
ANL A,#0FH
CPL A
JZ EXIT1
CLR A ;只能用段碼來關(guān)
MOV DPTR,#8004H
MOVX @DPTR,A
MOV R3,#00H
MOV R4,#0FEH
MOV R7,#06H
LOOP1: MOV A,R4
MOV DPTR,#8002H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
MOV R1,A
CPL A
ANL A,#0FH
JNZ L0
INC R3
MOV A,R4
RL A
MOV R4,A
DJNZ R7,LOOP1
LJMP EXIT1
L0: MOV A,R1 ;開始行掃描并計數(shù)在R6
JB ACC.0,L1
MOV R6,#00H
LJMP L4
L1: JB ACC.1,L2
MOV R6,#01H
LJMP L4
L2: JB ACC.2,L3
MOV R6,#02H
LJMP L4
L3: JB ACC.3,EXIT1
MOV R6,#03H
L4: MOV B,#04H
MOV A,R3
MUL AB
ADD A,R6
MOV DPTR,#DATA0
MOVC A,@A+DPTR
CJNE A,#13H,COM2
CPL 20H.0
COM2: CJNE A,#12H,COM3
CPL 20H.1
COM3: CJNE A,#11H,COM4
CPL 20H.2
COM4: CJNE A,#16H,COM5
MOV A,30H
ADD A,#99H
DA A
MOV 30H,A
SJMP LOCK
COM5: CJNE A,#15H,LOCK
MOV A,30H
ADD A,#01H
DA A
MOV 30H,A
LOCK: CLR A
MOV DPTR,#8002H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
MOV R1,A
CPL A
ANL A,#0FH
JNZ LOCK
EXIT1: RET
INT0: PUSH A
PUSH PSW
CLR EA
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R5,EXIT
MOV R5,#14H
MOV A,24H
ADD A,#01H
DA A
MOV 24H,A
CJNE A,#60H,EXIT
MOV 24H,#00H
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#60H,EXIT
MOV 23H,#00H
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#24H,EXIT
MOV 22H,#00H
EXIT: POP PSW
POP A
SETB EA
SETB TR0
RETI
MOVE: MOV A,24H
ANL A,#0FH
MOV 55H,A
MOV A,24H
SWAP A
ANL A,#0FH
MOV 54H,A
MOV A,23H
ANL A,#0FH
MOV 53H,A
MOV A,23H
SWAP A
ANL A,#0FH
MOV 52H,A
MOV A,22H
ANL A,#0FH
MOV 51H,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 50H,A
RET
DISP: MOV R0,#50H
MOV R1,#06H
MOV R2,#20H
LOOP2: CLR A
MOV DPTR,#8002H
MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#DATA1
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,R2
MOVX @DPTR,A
LCALL DELAY1
INC R0
RR A
MOV R2,A
DJNZ R1,LOOP2
RET
DELAY1: MOV R3,#5
DELAY2: MOV R4,#100
DJNZ R4,$
DJNZ R3,DELAY2
RET
DATA0: DB 16H,15H,14H,0FFH,13H,12H,11H,10H,0DH,0CH,0BH,0AH,0EH,03H,06H,09H,0FH,02H,05H,08H,00H,01H,04H,07H
DATA1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH
DB 6FH,77H,7CH,39H,5EH,79H,71H,00H,0F6H,0F3H
END
|