📄 电子钟源程序.asm
字号:
硬特殊:
阴驱动:74LS06
阳驱动:74LS244
串口传输:RCL232
软程序
KEY1_STA BIT 00H ;20H be used for 8 bits indicate 00h:key status = 1 if key put down
KEY2_STA BIT 01H
KEY3_STA BIT 02H
LED1_STA BIT 03H
LED2_STA BIT 04H
TIMEOUT BIT 05H ;be set '1' once 2ms
MYCODE BIT 06H ;for protecting serial receipt
BOOL BIT 07H ;for alarming
ALARM1 BIT 08H ;status for alarm1
ACC_6 BIT 0E6H
ACC_7 BIT 0E7H
HOURH EQU 22H
HOURL EQU 23H
MINUTEH EQU 24H
MINUTEL EQU 25H
SECONDH EQU 26H
SECONDL EQU 27H
COUNT0 EQU 28H ;counter for watch : 0--50
COUNT1 EQU 29H ;delay counter for key scaning : 0--10
COUNT2 EQU 2AH ;bit code for negative scaning : 0--6
COUNT3 EQU 2BH ;counter for serial receipt :0-3
COUNT4 EQU 2CH ;counter for bell
COUNT5 EQU 2DH ;for seting time
COUNT6 EQU 2EH ;for seting bell time
BUF0 EQU 2FH ;for serial receipt
BUF1 EQU 30H
BUF2 EQU 31H
BUF3 EQU 32H
BE_HOUR EQU 33H ;for seting bell time
BE_MINUTE EQU 34H
BE_SECOND EQU 35H
ORG 0000H
JMP START
ORG 000BH
JMP TIME0
ORG 0023H
JMP SERIAL_RECV
ORG 0100H
START: MOV SP,#50H ;initialization
MOV SCON,#50H
MOV PCON,#00H
MOV TMOD,#21H
MOV TL0,#02FH
MOV TH0,#0F8H
MOV TL1,#0E5H
MOV TH1,#0E5H
SETB TR0
SETB TR1
SETB ET0
SETB EA
SETB ES
MOV COUNT0,#00H
MOV COUNT1,#00H
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV COUNT2,#01H
MOV COUNT3,#00H
MOV COUNT4,#00H
MOV COUNT5,#00H
MOV COUNT6,#00H
MOV BE_HOUR,#00H
MOV BE_MINUTE,#00H
MOV BE_SECOND,#00H
MOV R0,#HOURH
MOV P1,#00h
MOV P2,#00h
CLR P3.5
CLR KEY1_STA
CLR LED1_STA
CLR LED2_STA
CLR MYCODE
CLR ALARM1
CLR BOOL
MOV DPTR,#0800H
WAIT0: MOV A,COUNT0
CJNE A,#32H,WAIT1 ;working for watch once 1s
MOV COUNT0,#00H
MOV A,COUNT5
JNZ SKIP4
ACALL WATCH_COUNT
ACALL COMPARE
MOV A,COUNT6
JNZ SKIP3
ACALL TIME_DEAL
SJMP SKIP4
SKIP3: MOV BUF1,R4
MOV BUF2,R3
MOV BUF3,R2
MOV R4,BE_HOUR
MOV R3,BE_MINUTE
MOV R2,BE_SECOND
ACALL TIME_DEAL
MOV R2,BUF3
MOV R3,BUF2
MOV R4,BUF1
SKIP4: CPL BOOL
WAIT1: MOV A,COUNT1
CJNE A,#0AH,WAIT2 ;key scaning once 20ms
MOV COUNT1,#00H
ACALL KEY_SCAN
JNB ALARM1,WAIT2
ACALL BELL
WAIT2: JNB TIMEOUT,WAIT0 ;displaying once 2ms
CLR TIMEOUT
ACALL DISPLAY
JMP WAIT0
WATCH_COUNT:
INC R2
CJNE R2,#60,STOP0
MOV R2,#0
INC R3
CJNE R3,#60,STOP0
MOV R3,#0
INC R4
CJNE R4,#24,STOP0
MOV R4,#0
STOP0: RET
TIME_DEAL:
MOV A,R4
MOV B,#0AH
DIV AB
MOV HOURH,A
MOV HOURL,B
MOV A,R3
MOV B,#0AH
DIV AB
MOV MINUTEH,A
MOV MINUTEL,B
MOV A,R2
MOV B,#0AH
DIV AB
MOV SECONDH,A
MOV SECONDL,B
RET
KEY_SCAN:
SETB P3.2
MOV C,P3.2
JC UP1_KEY
JB KEY1_STA,STOP1
SETB KEY1_STA
MOV COUNT6,#00H
INC COUNT5 ;set counter to modify time
MOV A,COUNT5
CJNE A,#04H,STOP1
MOV COUNT5,#00H
SJMP STOP1
UP1_KEY: JNB KEY1_STA,STOP1
CLR KEY1_STA
STOP1:
SETB P3.3
MOV C,P3.3
JC UP2_KEY
JB KEY2_STA,STOP2
SETB KEY2_STA
MOV A,COUNT5 ;to increase system time
JZ SKIP1
CJNE A,#01H,NEXT20
INC R4
CJNE R4,#24,SKIP0
MOV R4,#00H
SJMP SKIP0
NEXT20: CJNE A,#02H,NEXT21
INC R3
CJNE R3,#60,SKIP0
MOV R3,#00H
SJMP SKIP0
NEXT21: CJNE A,#03H,SKIP1
INC R2
CJNE R2,#60,SKIP0
MOV R2,#00H
SKIP0: ACALL TIME_DEAL
ACALL DISPLAY
SKIP1: MOV A,COUNT6
JZ STOP2
CJNE A,#01H,NEXT30
INC BE_HOUR
MOV A,BE_HOUR
CJNE A,#24,SKIP2
MOV BE_HOUR,#00H
SJMP SKIP2
NEXT30: CJNE A,#02H,NEXT31
INC BE_MINUTE
MOV A,BE_MINUTE
CJNE A,#60,SKIP2
MOV BE_MINUTE,#00H
SJMP SKIP2
NEXT31: CJNE A,#03,STOP2
INC BE_SECOND
MOV A,BE_SECOND
CJNE A,#60,SKIP2
MOV BE_SECOND,#00H
SKIP2: MOV BUF1,R4
MOV BUF2,R3
MOV BUF3,R2
MOV R4,BE_HOUR
MOV R3,BE_MINUTE
MOV R2,BE_SECOND
ACALL TIME_DEAL
MOV R2,BUF3
MOV R3,BUF2
MOV R4,BUF1
SJMP STOP2
UP2_KEY: JNB KEY2_STA,STOP2
CLR KEY2_STA
STOP2:
SETB P3.4
MOV C,P3.4
JC UP3_KEY
JB KEY3_STA,STOP3
SETB KEY3_STA
MOV COUNT5,#00H
INC COUNT6 ;get counter to set bell time
MOV A,COUNT6
CJNE A,#04H,STOP3
MOV COUNT6,#00H
SJMP STOP3
UP3_KEY: JNB KEY3_STA,STOP3
CLR KEY3_STA
STOP3:
RET
DISPLAY:
MOV A,COUNT2 ;negative scaning
MOV C,LED1_STA
MOV ACC_6,C
MOV C,LED2_STA
MOV ACC_7,C
MOV P1,A
MOV A,COUNT2
RL A
MOV COUNT2,A
CJNE A,#40H,NEXT1
MOV COUNT2,#01H
NEXT1: MOV A,@R0 ;positive scaning
MOVC A,@A+DPTR
MOV P2,A
CJNE R0,#SECONDL,NEXT2
MOV R0,#HOURH
SJMP STOP4
NEXT2: INC R0
STOP4:
RET
TIME0: PUSH A
CLR TR0
MOV TL0,#02FH
MOV TH0,#0F8H
SETB TR0
SETB TIMEOUT
INC COUNT1
MOV A,COUNT1
CJNE A,#0AH,NEXT0
INC COUNT0
NEXT0: POP A
RETI
SERIAL_RECV:
PUSH A
CLR RI
MOV A,SBUF
MOV BUF0,A
JNB MYCODE,NEXT5
MOV A,COUNT3
INC COUNT3
JNZ NEXT3
MOV R4,BUF0
SJMP STOP5
NEXT3: CJNE A,#01H,NEXT4
MOV A,BUF0
MOV R3,A
SJMP STOP5
NEXT4: CJNE A,#02H,STOP5
MOV R2,BUF0
MOV COUNT3,#00H
CLR MYCODE
SJMP STOP5
NEXT5: CJNE A,#99,STOP5
SETB MYCODE
STOP5: POP A
RETI
BELL: PUSH A
JB BOOL,STOP6
MOV A,COUNT0
CJNE A,#1,NEXT6
SETB P3.5
NEXT6: CJNE A,#12,NEXT7
CLR P3.5
NEXT7: CJNE A,#19,NEXT8
SETB P3.5
NEXT8: CJNE A,#31,NEXT9
CLR P3.5
NEXT9: CJNE A,#38,NEXT10
SETB P3.5
NEXT10: CJNE A,#49,STOP6
CLR P3.5
INC COUNT4
MOV A,COUNT4
CJNE A,#10,STOP6
MOV COUNT4,#00H
CLR ALARM1
STOP6: POP A
RET
COMPARE:
MOV A,R4
CJNE A,BE_HOUR,STOP10
MOV A,R3
CJNE A,BE_MINUTE,STOP10
MOV A,R2
CJNE A,BE_SECOND,STOP10
SETB ALARM1
STOP10:
RET
ORG 0800H
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
;4.6,3.8;3.75,3.75;3.6,3.3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -