数字钟1.asm
来自「自己做的单片机Proteus仿真实例」· 汇编 代码 · 共 332 行
ASM
332 行
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
ALARM_SECOND EQU 33H
ALARM_MINUTE EQU 34H
ALARM_HOUR EQU 35H
CLOCK_SECOND EQU 36H
CLOCK_MINUTE EQU 37H
CLOCK_HOUR EQU 38H
DAY EQU 41H
MONTH EQU 42H
YEARL EQU 43H
YEARH EQU 44H
TCNT EQU 45H
TIME1 BIT 20H
TIME2 BIT 21H
ORG 0000H
LJMP START
ORG 000BH
LJMP T00
ORG 0030H
START: MOV DPTR,#TAB
MOV TCNT,#0
CLR TIME1
CLR TIME2
MOV R3,#10
CLR P1.7
MOV CLOCK_HOUR,#7
MOV CLOCK_MINUTE,#59
MOV CLOCK_SECOND,#56
MOV ALARM_SECOND,#0
MOV ALARM_MINUTE,#0
MOV ALARM_HOUR,#7
MOV DAY,#28
MOV MONTH,#2
MOV YEARL,#00
MOV YEARH,#19
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000) MOD 256
MOV IE,#83H
SETB TR0
A1: LCALL DISPLAY
MOV P1,#0FFH
JNB P1.2,S1
JNB P1.3,S2
JNB P1.4,S3
JNB P1.5,START
LJMP A1
S1: LCALL DELAY
JB P1.2,A1
INC CLOCK_SECOND
LCALL DISPLAY
MOV A,CLOCK_SECOND
CJNE A,#60,L1
MOV CLOCK_SECOND,#0
LJMP K1
S2: LCALL DELAY
JB P1.3,A1
K1: MOV A,CLOCK_MINUTE
INC A
MOV CLOCK_MINUTE,A
LCALL DISPLAY
CJNE A,#60,L2
MOV CLOCK_MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB P1.4,A1
K2: INC CLOCK_HOUR
LCALL DISPLAY
MOV A,CLOCK_HOUR
CJNE A,#24,L3
MOV CLOCK_HOUR,#0
LJMP A1
L1: JB P1.2,A1
LCALL DISPLAY
JMP L1
L2: JB P1.3,A1
LCALL DISPLAY
JMP L2
L3: JB P1.4,A1
LCALL DISPLAY
JMP L3
T00: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000) MOD 256
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE1
MOV TCNT,#0
JB TIME1,J1
J1: JB TIME2,J2
SJMP J3
J2: CPL P1.7
SJMP J4
J3: JNB TIME1,J4
SETB P1.7
DJNZ R3,J4
CLR P1.7
CLR TIME1
MOV R3,#10
J4: INC CLOCK_SECOND
MOV A,CLOCK_SECOND
CJNE A,#60,RETUNE1
INC CLOCK_MINUTE
MOV CLOCK_SECOND,#0
MOV A,CLOCK_MINUTE
CJNE A,#60,RETUNE1
INC CLOCK_HOUR
MOV CLOCK_MINUTE,#0
MOV A,CLOCK_HOUR
CJNE A,#24,RETUNE1
MOV CLOCK_HOUR,#0
INC DAY
MOV A,MONTH
CJNE A,#8,T01
LJMP T01
RETUNE1:LJMP RETUNE
T01: JC T02
RRC A
JC T011
MOV A,DAY
CJNE A,#32,RETUNE
INC MONTH
MOV DAY,#1
MOV A,MONTH
CJNE A,#13,RETUNE
INC YEARL
MOV MONTH,#1
MOV A,YEARL
CJNE A,#100,RETUNE
INC YEARH
MOV YEARL,#1
SJMP RETUNE
T011: MOV A,DAY
CJNE A,#31,RETUNE
INC MONTH
MOV DAY,#1
SJMP RETUNE
T02: RRC A
JNC T03
MOV A,DAY
CJNE A,#32,RETUNE
INC MONTH
MOV DAY,#1
SJMP RETUNE
T03: MOV A,MONTH
CJNE A,#2,T04
MOV A,YEARL
CJNE A,#0,T031
MOV A,YEARH
MOV B,#04
DIV AB
MOV A,B
CJNE A,#0,T04
SJMP T032
T031: MOV A,YEARL
MOV B,#04
DIV AB
MOV A,B
CJNE A,#0,T04
T032: MOV A,DAY
CJNE A,#30,RETUNE
INC MONTH
MOV DAY,#1
SJMP RETUNE
T04: MOV A,DAY
CJNE A,#29,RETUNE
INC MONTH
MOV DAY,#1
RETUNE: LCALL DISPLAY
MOV A,CLOCK_SECOND
CJNE A,#00,EXIT1
MOV A,CLOCK_MINUTE
CJNE A,#00,EXIT1
SETB TIME1
EXIT1:
MOV A,CLOCK_MINUTE
CJNE A,ALARM_MINUTE,EXIT2
MOV A,CLOCK_HOUR
CJNE A,ALARM_HOUR,EXIT2
SETB TIME2
SJMP EXIT3
EXIT2: CLR TIME2
CLR P1.7
EXIT3: RETI
DISPLAY:JNB P1.0,DISDATE1
JNB P1.1,DISALARM
MOV HOUR,CLOCK_HOUR
MOV MINUTE,CLOCK_MINUTE
MOV SECOND,CLOCK_SECOND
DISP: MOV A,SECOND
MOV B,#10
DIV AB
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.6
MOV A,B
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.7
CLR P2.5
MOV P0,#40H
LCALL DELAY
SETB P2.5
MOV A,MINUTE
MOV B,#10
DIV AB
CLR P2.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.3
MOV A,B
CLR P2.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.4
CLR P2.2
MOV P0,#40H
LCALL DELAY
SETB P2.2
MOV A,HOUR
MOV B,#10
DIV AB
CLR P2.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.0
MOV A,B
CLR P2.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.1
SJMP EXIT
DISDATE1:SJMP DISDATE
DISALARM:MOV HOUR,ALARM_HOUR
MOV MINUTE,ALARM_MINUTE
MOV SECOND,ALARM_SECOND
SJMP DISP
DISDATE:MOV R0,#DAY
MOV R1,#60H
MOV R7,#4
DIS1: MOV A,@R0
MOV B,#10
DIV AB
MOV @R1,B
INC R1
MOV @R1,A
INC R1
INC R0
DJNZ R7,DIS1
MOV R0,#60H
MOV R7,#8
DIS2: MOV A,@R0
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R7,DIS2
MOV R0,#67H
MOV R7,#8
MOV A,#0FEH
DIS3: MOV P2,A
MOV P0,@R0
LCALL DELAY
DEC R0
RL A
DJNZ R7,DIS3
EXIT: RET
DELAY: MOV R5,#10
D1: MOV R6,#100
DJNZ R6,$
DJNZ R5,D1
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
; 0 1 2 3 4 5 6 7 8 9
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?