📄 ch13-3.asm
字号:
RS BIT P2.0
RW BIT P2.1
EN BIT P2.2
LED BIT P2.7
REFRESH BIT 20H.0
TIMEOUT EQU 21H
HOUR EQU 30H
MIN EQU 31H
SEC EQU 32H
AHOUR EQU 33H
AMIN EQU 34H
ASEC EQU 35H
CURSOR EQU 36H
CNT EQU 37H
ONE EQU 38H
ZERO EQU 39H
KEYTEMP EQU 3AH
KEYDATA EQU 3BH
SCANLINE EQU 3CH
COLS EQU 3DH
ROWS EQU 3EH
SECN EQU 3FH
TIME EQU 40H
;
ORG 00H
AJMP START
ORG 0BH
AJMP TIMER0
START: MOV SP,#60H
ACALL INIT ;INITIAL RAM & LCD
LOOP: MOV A,TIMEOUT
CJNE A,#0,S0
SETB F0
S0: JNB REFRESH,S2
CLR REFRESH
MOV A,#82H
ACALL W_INS
MOV CNT,#12
MOV DPTR,#MSG1
JB F0,S1
MOV DPTR,#MSG2
S1: ACALL W_STR
ACALL CONV ;BCD TO ASCII
MOV A,#0C4H ;SET ROW ADDRESS
ACALL W_INS
ACALL DISPLAY
MOV A,CURSOR
ACALL W_INS
S2: ACALL KEYSCAN
MOV A,#-1
XCH A,KEYDATA
CJNE A,#-1,S3
SJMP LOOP
S3: MOV TIMEOUT,#5
CJNE A,#0,S4
ACALL KEY0
S4: CJNE A,#1,S5
ACALL KEY1
S5: CJNE A,#2,S6
ACALL KEY2
S6: CJNE A,#3,LOOP
ACALL KEY3
SJMP LOOP
;
KEY0: PUSH ACC ;TIME/ALARM
JB LED,K01
SETB LED
SJMP K02
K01: CPL F0 ;F0=1/0,TIME/ALARM
SETB REFRESH
K02: POP ACC
RET
;
KEY1: PUSH ACC ;ADJUST TIME/ALARM
JNB TR0,K11
JMP K10
K11: MOV R0,#HOUR
JB F0,K12
MOV R0,#AHOUR
K12: MOV R1,CURSOR
CJNE R1,#0C4H,K14
MOV A,#10H ;ADJUST HOUR10
ADD A,@R0
MOV @R0,A
ANL A,#0F0H
CJNE A,#20H,K13
MOV A,@R0
ANL A,#0FH
MOV @R0,A
K13: CJNE A,#30H,K19
MOV A,@R0
ANL A,#0FH
MOV @R0,A
K14: CJNE R1,#0C5H,K15
MOV A,@R0 ;ADJUST HOUR
ADD A,#1
DA A
MOV @R0,A
CJNE A,#24H,K19
MOV @R0,#0
K15: INC R0 ;R0=31H or 34H
CJNE R1,#0C7H,K16
MOV A,#10H ;ADJUST MIN10
ADD A,@R0
MOV @R0,A
ANL A,#0F0H
CJNE A,#60H,K19
MOV A,@R0
ANL A,#0FH
MOV @R0,A
K16: CJNE R1,#0C8H,K17
MOV A,@R0 ;ADJUST MIN
ADD A,#1
DA A
MOV @R0,A
CJNE A,#60H,K19
MOV @R0,#0
K17: INC R0 ;R0=32H or 35H
CJNE R1,#0CAH,K18
MOV A,@R0 ;ADJUST SEC10
MOV A,#10H
ADD A,@R0
MOV @R0,A
ANL A,#0F0H
CJNE A,#60H,K19
MOV A,@R0
ANL A,#0FH
MOV @R0,A
K18: CJNE R1,#0CBH,K19
MOV A,@R0 ;ADJUST SEC
ADD A,#1
DA A
MOV @R0,A
CJNE A,#60H,K19
MOV @R0,#0
K19: ACALL CONV
SETB REFRESH
K10: POP ACC
RET
;
KEY2: PUSH ACC ;MOVE CURSOR
JB TR0,K24
MOV A,CURSOR
INC A
CJNE A,#0C6H,K21
INC A
K21: CJNE A,#0C9H,K22
INC A
K22: CJNE A,#0CCH,K23
MOV A,#0C4H
K23: ACALL W_INS
MOV CURSOR,A
SETB REFRESH
K24: POP ACC
RET
;
KEY3: PUSH ACC ;ADJUST/EXCUTE
CPL TR0
JNB TR0,K31
MOV A,#0CH ;NO CURSOR
ACALL W_INS
SJMP K32
K31: MOV A,#0EH ;DISPLAY CURSOR
ACALL W_INS
MOV CURSOR,#0C4H
SETB REFRESH
K32: POP ACC
RET
;
DISPLAY:MOV R1,#8
MOV R0,#TIME
D1: MOV A,@R0
ACALL W_DATA
INC R0
DJNZ R1,D1
RET
;
KEYSCAN:PUSH ACC
MOV COLS,#2
MOV SCANLINE,#11111110B
COL: MOV A,SCANLINE
MOV P3,A
MOV A,P3
RR A
RR A
MOV ROWS,#2 ;2 PUSH-SW
ROW: SETB C
RRC A
JNC KEYIN
DJNZ ROWS,ROW
K1: MOV A,SCANLINE ;SCAN NEXT COLUMN
RL A
MOV SCANLINE,A
DJNZ COLS,COL
INC ONE ;SCAN 1'S
MOV A,ONE
CJNE A,#5,K2
MOV ZERO,#0
MOV KEYTEMP,#-1
MOV KEYDATA,#-1
K2: POP ACC
RET
KEYIN: MOV ONE,#0
MOV A,ROWS ;CALCULATE KEY VALUE
DEC A
XRL A,#1
MOV ROWS,A
MOV A,COLS
DEC A
XRL A,#1
RL A ;MULTIPLES 2
ORL A,ROWS
CJNE A,KEYTEMP,K4
MOV A,ZERO
CJNE A,#5,K3
SJMP K2
K3: INC ZERO
MOV A,ZERO
CJNE A,#5,COL
MOV A,KEYTEMP
MOV KEYDATA,A
SJMP K2
K4: MOV KEYTEMP,A
MOV ZERO,#1
SJMP K2
;
INIT: SETB F0 ;F0=1:DISPLAY TIME
MOV SECN,#100
MOV TMOD,#01H
MOV IE,#10000010B
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0
SETB LED
MOV CURSOR,#0C4H ;CURSOR ADDRESS
MOV TIMEOUT,#0
MOV HOUR,#0
MOV MIN,#0
MOV SEC,#0
MOV AHOUR,#0
MOV AMIN,#0
MOV ASEC,#0
MOV KEYTEMP,#-1
MOV KEYDATA,#-1
MOV ONE,#0
MOV ZERO,#0
MOV SCANLINE,#11111110B
MOV COLS,#2
SETB REFRESH
MOV A,#38H
ACALL W_INS
MOV A,#38H
ACALL W_INS
MOV A,#38H
ACALL W_INS
MOV A,#38H
ACALL W_INS
MOV A,#08H ;FUNCTION SET
ACALL W_INS
MOV A,#01H ;CLEAR DISPLAY
ACALL W_INS
MOV A,#06H ;INPUT MODE SET
ACALL W_INS
MOV A,#0CH ;DISPLAY ON/OFF
ACALL W_INS
RET
CONV: MOV R1,#TIME
MOV A,#HOUR
JB F0,C1
MOV A,#AHOUR
C1: MOV R0,A
MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV @R1,#":"
INC R1
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV @R1,#":"
INC R1
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV @R1,A
RET
CMPTIME:PUSH ACC
MOV R0,#HOUR
MOV R1,#AHOUR
MOV R2,#3
CO1: CLR C
MOV A,@R0
SUBB A,@R1
JNZ CO2
INC R0
INC R1
DJNZ R2,CO1
CLR LED
CO2: POP ACC
RET
W_STR: MOV R0,#0
W1: MOV A,R0
MOVC A,@A+DPTR
ACALL W_DATA
INC R0
DJNZ CNT,W1
RET
W_INS: ACALL CHECK
CLR RS
CLR RW
SETB EN
MOV P1,A
CLR EN
RET
W_DATA: ACALL CHECK
SETB RS
CLR RW
SETB EN
MOV P1,A
CLR EN
RET
CHECK: PUSH ACC
BUSY: CLR RS
SETB RW
SETB EN
MOV A,P1
CLR EN
JB ACC.7,BUSY
ACALL DELAY
POP ACC
RET
DELAY: MOV R6,#20
DEL1: MOV R7,#150
DJNZ R7,$
DJNZ R6,DEL1
RET
CHGTIME:MOV A,SEC
ADD A,#1
DA A
MOV SEC,A
CJNE A,#60H,FIX
MOV SEC,#00
MOV A,MIN
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H,FIX
MOV MIN,#00
MOV A,HOUR
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H,FIX
MOV HOUR,#00
FIX: RET
TIMER0: PUSH ACC ;TIMER 1 SEC
MOV TH0,#0D8H
MOV TL0,#0F0H
DJNZ SECN,T03
CLR TR0
MOV SECN,#100
ACALL CHGTIME ;CHANGE TIME
ACALL CMPTIME ;COMPARE TIME
SETB REFRESH
MOV A,TIMEOUT
CJNE A,#1,T01
T01: JC T02
DEC A
MOV TIMEOUT,A
T02: SETB TR0
T03: POP ACC
RETI
MSG1: DB 'Current Time'
MSG2: DB ' Alarm Time '
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -