; C51????????
; ????:
; LCD??? = P0
; LCD???: RS=P2.0, RW=P2.1, EN=P2.2
; ??: SET=P3.0, INC=P3.1, DEC=P3.2, MODE=P3.3
; ??RAM??
SECOND EQU 30H ; ?
MINUTE EQU 31H ; ?
HOUR EQU 32H ; ?
DAY EQU 33H ; ?
MONTH EQU 34H ; ?
YEAR EQU 35H ; ?
WEEKDAY EQU 36H ; ??(0=??,1=??...6=??)
ALARM_H EQU 37H ; ???
ALARM_M EQU 38H ; ???
MODE_FLAG EQU 39H ; ????(0=??,1=????,2=????,3=????)
CURSOR EQU 3AH ; ??????
TICK_CNT EQU 3BH ; 50ms??
SEC_FLAG EQU 3CH ; ????
ORG 0000H
LJMP MAIN
ORG 000BH ; ???0????
LJMP TIMER0_ISR
MAIN:
MOV SP, #60H ; ??????
LCALL INIT_VARS ; ?????
LCALL LCD_INIT ; ???LCD
LCALL TIMER_INIT ; ??????
MAIN_LOOP:
LCALL KEY_SCAN ; ????
LCALL DISPLAY_TIME ; ????
LCALL CHECK_ALARM ; ????
SJMP MAIN_LOOP
; ?????
INIT_VARS:
MOV SECOND, #00H ; ???? 00:00:00
MOV MINUTE, #00H
MOV HOUR, #00H
MOV DAY, #01H ; ???? 01/01/00
MOV MONTH, #01H
MOV YEAR, #00H
MOV WEEKDAY, #01H ; ??
MOV ALARM_H, #07H ; ??07:00
MOV ALARM_M, #00H
MOV MODE_FLAG, #00H
MOV CURSOR, #00H
MOV TICK_CNT, #00H
MOV SEC_FLAG, #00H
RET
; ??????
TIMER_INIT:
MOV TMOD, #01H ; ???0??1
MOV TH0, #3CH ; 50ms??(11.0592MHz)
MOV TL0, #0B0H
SETB TR0 ; ?????
SETB ET0 ; ???????
SETB EA ; ????
RET
; ???0??????
TIMER0_ISR:
PUSH ACC
MOV TH0, #3CH ; ????
MOV TL0, #0B0H
INC TICK_CNT
MOV A, TICK_CNT
CJNE A, #20, TIMER_EXIT ; 50ms*20=1s
MOV TICK_CNT, #00H
SETB SEC_FLAG ; ?????
; ????
INC SECOND
MOV A, SECOND
CJNE A, #60, TIMER_EXIT
MOV SECOND, #00H
INC MINUTE
MOV A, MINUTE
CJNE A, #60, TIMER_EXIT
MOV MINUTE, #00H
INC HOUR
MOV A, HOUR
CJNE A, #24, TIMER_EXIT
MOV HOUR, #00H
; ???????
INC DAY
INC WEEKDAY
MOV A, WEEKDAY
CJNE A, #7, CHECK_DAY
MOV WEEKDAY, #0
CHECK_DAY:
MOV A, MONTH
CJNE A, #2, NOT_FEB ; ??2?
MOV A, YEAR
ANL A, #03H ; ??????(??4??)
JNZ FEB_28
MOV A, DAY
CJNE A, #30, TIMER_EXIT
SJMP MONTH_END
FEB_28:
MOV A, DAY
CJNE A, #29, TIMER_EXIT
SJMP MONTH_END
NOT_FEB:
MOV A, MONTH
CJNE A, #4, CHECK_30
SJMP CHECK_31
CHECK_30:
CJNE A, #6, CHECK_31
SJMP CHECK_31
; 30???
MOV A, DAY
CJNE A, #31, TIMER_EXIT
SJMP MONTH_END
CHECK_31: ; 31???
MOV A, DAY
CJNE A, #32, TIMER_EXIT
MONTH_END:
MOV DAY, #01H
INC MONTH
MOV A, MONTH
CJNE A, #13, TIMER_EXIT
MOV MONTH, #01H
INC YEAR
MOV A, YEAR
CJNE A, #100, TIMER_EXIT
MOV YEAR, #00H
TIMER_EXIT:
POP ACC
RETI
; LCD???
LCD_INIT:
LCALL DELAY ; ??LCD????
MOV A, #38H ; 8???,2???,5x7??
LCALL LCD_CMD
MOV A, #0CH ; ???,???
LCALL LCD_CMD
MOV A, #06H ; ????,???
LCALL LCD_CMD
MOV A, #01H ; ??
LCALL LCD_CMD
RET
; LCD??????
LCD_CMD:
MOV P0, A ; ????P0
CLR P2.0 ; RS=0(??)
CLR P2.1 ; RW=0(?)
SETB P2.2 ; EN=1
LCALL DELAY ; ???
CLR P2.2 ; EN=0
LCALL DELAY
RET
; LCD??????
LCD_DATA:
MOV P0, A ; ????P0
SETB P2.0 ; RS=1(??)
CLR P2.1 ; RW=0(?)
SETB P2.2 ; EN=1
LCALL DELAY ; ???
CLR P2.2 ; EN=0
LCALL DELAY
RET
; ??????
DISPLAY_TIME:
MOV A, #80H ; ???????
LCALL LCD_CMD
; ???? HH:MM:SS
MOV A, HOUR
LCALL DISP_BCD
MOV A, #':' ; ????
LCALL LCD_DATA
MOV A, MINUTE
LCALL DISP_BCD
MOV A, #':'
LCALL LCD_DATA
MOV A, SECOND
LCALL DISP_BCD
; ???? YY/MM/DD
MOV A, #0C0H ; ???????
LCALL LCD_CMD
MOV A, YEAR
LCALL DISP_BCD
MOV A, #'/'
LCALL LCD_DATA
MOV A, MONTH
LCALL DISP_BCD
MOV A, #'/'
LCALL LCD_DATA
MOV A, DAY
LCALL DISP_BCD
; ????
MOV A, #0CAH ; ????11?
LCALL LCD_CMD
MOV A, WEEKDAY
ADD A, #'0' ; ???ASCII
LCALL LCD_DATA
; ??????
MOV A, #8FH ; ?????
LCALL LCD_CMD
MOV A, #'A' ; ??A??????
LCALL LCD_DATA
RET
; ??BCD?(????)
DISP_BCD:
MOV R0, A
SWAP A ; ?????
ANL A, #0FH
ADD A, #'0'
LCALL LCD_DATA
MOV A, R0 ; ?????
ANL A, #0FH
ADD A, #'0'
LCALL LCD_DATA
RET
; ????
KEY_SCAN:
JB P3.0, KEY_INC ; SET????
LCALL DELAY_10MS
JB P3.0, KEY_INC
JNB P3.0, $ ; ????
; ????
MOV A, MODE_FLAG
INC A
CJNE A, #4, SET_MODE
MOV A, #0
SET_MODE:
MOV MODE_FLAG, A
MOV CURSOR, #0 ; ??????
RET
KEY_INC:
JB P3.1, KEY_DEC ; INC????
LCALL DELAY_10MS
JB P3.1, KEY_DEC
JNB P3.1, $ ; ????
; ?????????
MOV A, MODE_FLAG
JZ KEY_EXIT ; ???????
; ??????
CJNE A, #1, CHK_DATE
LCALL INC_TIME
RET
CHK_DATE:
CJNE A, #2, CHK_ALARM
LCALL INC_DATE
RET
CHK_ALARM:
CJNE A, #3, KEY_EXIT
LCALL INC_ALARM
RET
KEY_DEC:
JB P3.2, KEY_MODE ; DEC????
LCALL DELAY_10MS
JB P3.2, KEY_MODE
JNB P3.2, $ ; ????
; ?????????
MOV A, MODE_FLAG
JZ KEY_EXIT
; ??????
CJNE A, #1, DEC_DATE
LCALL DEC_TIME
RET
DEC_DATE:
CJNE A, #2, DEC_ALARM
LCALL DEC_DATE
RET
DEC_ALARM:
CJNE A, #3, KEY_EXIT
LCALL DEC_ALARM
RET
KEY_MODE:
JB P3.3, KEY_EXIT ; MODE?(?????)
LCALL DELAY_10MS
JB P3.3, KEY_EXIT
JNB P3.3, $ ; ????
MOV A, MODE_FLAG
JZ KEY_EXIT ; ???????
; ??????????
INC CURSOR
MOV A, CURSOR
CJNE A, #3, KEY_EXIT ; ??/???3?
MOV CURSOR, #0
KEY_EXIT:
RET
; ?????
INC_TIME:
MOV A, CURSOR
JZ INC_HOUR
CJNE A, #1, INC_SEC
; ????
INC MINUTE
MOV A, MINUTE
CJNE A, #60, INC_EXIT
MOV MINUTE, #0
RET
INC_HOUR:
INC HOUR
MOV A, HOUR
CJNE A, #24, INC_EXIT
MOV HOUR, #0
RET
INC_SEC:
INC SECOND
MOV A, SECOND
CJNE A, #60, INC_EXIT
MOV SECOND, #0
INC_EXIT:
RET
; ?????
INC_DATE:
MOV A, CURSOR
JZ INC_YEAR
CJNE A, #1, INC_DAY
; ????
INC MONTH
MOV A, MONTH
CJNE A, #13, INC_EXIT
MOV MONTH, #1
RET
INC_YEAR:
INC YEAR
MOV A, YEAR
CJNE A, #100, INC_EXIT
MOV YEAR, #0
RET
INC_DAY:
INC DAY
MOV A, DAY
CJNE A, #32, INC_EXIT
MOV DAY, #1
RET
; ?????
INC_ALARM:
MOV A, CURSOR
JZ INC_ALARM_H
; ????
INC ALARM_M
MOV A, ALARM_M
CJNE A, #60, INC_EXIT
MOV ALARM_M, #0
RET
INC_ALARM_H:
INC ALARM_H
MOV A, ALARM_H
CJNE A, #24, INC_EXIT
MOV ALARM_H, #0
RET
; ?????(??????,?)
DEC_TIME:
; ????INC_TIME????
RET
; ????
CHECK_ALARM:
MOV A, HOUR
CJNE A, ALARM_H, ALARM_EXIT
MOV A, MINUTE
CJNE A, ALARM_M, ALARM_EXIT
; ????(?????LED??)
CPL P1.7 ; ??P1.7??LED
ALARM_EXIT:
RET
; ?????
DELAY:
MOV R6, #50
DL1: MOV R7, #200
DL2: DJNZ R7, DL2
DJNZ R6, DL1
RET
DELAY_10MS:
MOV R5, #20
DL3: MOV R6, #250
DL4: DJNZ R6, DL4
DJNZ R5, DL3
RET
END
这段代码烧录后9到0时出现;=?>等符号,且减法无用,修改代码
最新发布