📄 7289.asm
字号:
INC R1
DEC R0
SETB KEY_CS
CALL DELAY_50MS
DJNZ R7,DSUP1
SJMP DSUP4
DSUP3: MOV A,R0 ;大于10H表示是特殊字符
ANL A,#10000111B ;下载数据且按方式0译码
CALL KEY_SEND
MOV A,@R1
CALL KEY_SEND
INC R1
DEC R0
SETB KEY_CS
CALL DELAY_50MS
DJNZ R7,DSUP1
DSUP4: MOV A,#10001000B ;闪烁控制指令 88H(指令)
CALL KEY_SEND
MOV A,BLINK
CALL KEY_SEND
SETB KEY_CS
RET
;
;********************************************************
; 读键值子程序 *
;********************************************************
;
KBS: MOV A,#00010101B ;发送读键盘数据指令码
CALL KEY_SEND
MOV R2,#08H ;8位数据
KBS1: SETB KEY_CLK
CALL DELAY
MOV C,KEY_DAT
RLC A
CLR KEY_CLK
CALL DELAY
DJNZ R2,KBS1 ;未满8位继续接收
SETB KEY_CS
MOV R2,A ;接收到的数据存于R2中
MOV R3,#1CH ;从键值表最底端开始比较
MOV DPTR,#KTB
KBS2: MOV A,R3
MOVC A,@A+DPTR
CJNE A,02H,KBS5
KBS3: MOV A,R3
MOV KEY_VALUE,A
CJNE A,#10H,KBS4
SETB C ;判断功能键数字键的标志
KBS4: RET
KBS5: DJNZ R3,KBS2
SJMP KBS3
;
;*******************************************************
; /*万年历时、分、秒处理程序*/ *
;*******************************************************
;
DSTIME: MOV R0,#DSBUF+7 ;检查数据的合法性
CALL PTDEA
CJNE A,#24H,CHTIME
CHTIME: JC CHTIME00 ;不合法重新键扫
AJMP RESET ;合法保存数据
CHTIME00: MOV HBUF,A
DEC R0
CALL PTDEA
CJNE A,#60H,CHTIME1
CHTIME1: JC CHTIME10
AJMP RESET
CHTIME10: MOV MBUF,A
DEC R0
CALL PTDEA
CJNE A,#60H,CHTIME2
CHTIME2: JC CHTIME20
AJMP RESET
CHTIME20: MOV SSBUF,A
DSTIME0: ACALL DSINIT ;初始化万年历
MOV TIME_REG,#80H ;写秒寄存器
MOV TIME_DT,SSBUF
CALL W_WORD
MOV TIME_REG,#82H ;写分寄存器
MOV TIME_DT,MBUF
CALL W_WORD
MOV TIME_REG,#84H ;写小时寄存器
MOV TIME_DT,HBUF
CALL W_WORD
ACALL DSWRPRT ;写保护
DSTIME1: MOV TIME_REG,#81H ;读秒寄存器
CALL R_WORD
MOV SSBUF,A
MOV TIME_REG,#83H ;读分寄存器
CALL R_WORD
MOV MBUF,A
MOV TIME_REG,#85H ;读小时寄存器
CALL R_WORD
MOV HBUF,A
CALL PUT_TIME
CALL DSUP
MOV A,#88H
CALL KEY_SEND
MOV A,#0FFH
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_500MS
JNB KEY,L
AJMP DSTIME1
L: AJMP PRPT2
;
;*******************************************************
; /*万年历初始化程序*/ *
;*******************************************************
;
DSINIT: CLR TIME_SCLK
NOP
CLR TIME_RST
MOV TIME_REG,#8EH ;写保护寄存器(地址)
MOV TIME_DT,#00H ;打开写保护(指令)
ACALL W_WORD ;写地址、写指令
MOV TIME_REG,#90H ;涓流充电寄存器
MOV TIME_DT,#0A0H ;R=0,0 个稳压管
ACALL W_WORD
RET
PTDEA: MOV A,@R0
SWAP A
ANL A,#0F0H
MOV R1,A
DEC R0
MOV A,@R0
ANL A,#0FH
ORL A,R1
RET
;
;*******************************************************
; /*DS1302 单字节命令(数据)写*/ *
;*******************************************************
;
W_WORD: PUSH PSW
CLR PSW.3
CLR PSW.4
CLR TIME_SCLK
NOP
SETB TIME_RST
MOV A,TIME_REG
ACALL W_BYTE
MOV A,TIME_DT
ACALL W_BYTE
CLR TIME_RST
NOP
CLR TIME_SCLK
POP PSW
RET
;
;*******************************************************
; /*DS1302 单字节命令(数据)读*/ *
;*******************************************************
;
R_WORD: PUSH PSW
CLR PSW.3
CLR PSW.4
CLR TIME_SCLK
NOP
SETB TIME_RST
MOV A,TIME_REG
ACALL W_BYTE
ACALL R_BYTE
MOV TIME_DT,A
CLR TIME_RST
NOP
CLR TIME_SCLK
POP PSW
RET
;
;*******************************************************
; /*DS1302 字节写时序*/ *
;*******************************************************
;
W_BYTE: MOV R6,#08H
CLR C
W_BYTE1: CLR TIME_SCLK
RRC A
MOV TIME_IO,C
NOP
SETB TIME_SCLK
DJNZ R6,W_BYTE1
RET
;
;*******************************************************
; /*DS1302 字节读时序*/ *
;*******************************************************
;
R_BYTE: MOV R6,#08H
CLR C
R_BYTE1: CLR TIME_SCLK
MOV C,TIME_IO
RRC A
SETB TIME_SCLK
DJNZ R6,R_BYTE1
RET
;
;*******************************************************
; /*万年历写保护程序*/ *
;*******************************************************
;
DSWRPRT: MOV TIME_REG,#10001110B
MOV TIME_DT,#10000000B
CALL W_WORD
RET
;
;*******************************************************
; /*读取时分秒缓冲区内容子程序*/ *
;*******************************************************
;
PUT_TIME: MOV R1,#SSBUF ;SSBUF 缓冲区内容送显示缓冲区
CALL GET_TIME
MOV DSBUF+7,R0
MOV DSBUF+6,R1
MOV DSBUF+5,#1AH ;显示‘-’
MOV R1,#MBUF ;MBUF 缓冲区内容送显示缓冲区
CALL GET_TIME
MOV DSBUF+4,R0
MOV DSBUF+3,R1
MOV DSBUF+2,#1AH ;显示‘-’
MOV R1,#HBUF ;HBUF 缓冲区内容送显示缓冲区
CALL GET_TIME
MOV DSBUF+1,R0
MOV DSBUF,R1
RET
GET_TIME: MOV A,@R1
ANL A,#0FH
MOV R0,A
MOV A,@R1
SWAP A
ANL A,#0FH
MOV R1,A
RET
;
;********************************************************
; 键值表 *
;********************************************************
;
KTB: DB 30H ;0
DB 32H ;1
DB 2AH ;2
DB 22H ;3
DB 34H ;4
DB 2CH ;5
DB 24H ;6
DB 36H ;7
DB 2EH ;8
DB 26H ;9
DB 1EH ;A
DB 1CH ;B
DB 1AH ;C
DB 18H ;D
DB 20H ;E
DB 28H ;F
DB 0FFH ;10
DB 16H ;11
DB 14H ;12
DB 12H ;13
DB 10H ;14
DB 0EH ;15
DB 0CH ;16
DB 0AH ;17
DB 08H ;18
DB 06H ;19
DB 04H ;1A
DB 02H ;1B
DB 00H ;1C
;
;*******************************************************
; 循环显示段地址表 *
;*******************************************************
;
SEGTB: DB 3BH,33H,2BH,23H,24H,20H,21H
DB 26H,1EH,16H,0EH,06H,05H,04H
DB 03H,0BH,13H,1BH,1AH,18H,1DH
DB 1EH,26H,2EH,36H,3EH,39H,3AH
;
;********************************************************
; /*延时子程序*/ *
;********************************************************
;
DELAY_1S: MOV R7,#20
DELAY_1S1: CALL DELAY_50MS
DJNZ R7,DELAY_1S1
RET
DELAY_500MS:
MOV R7,#10
DELAY_500MS1:
CALL DELAY_50MS
DJNZ R7,DELAY_500MS1
RET
DELAY_3S:
MOV R5,#10 ;延时约3秒
DELAY_3S0: MOV R6,#00H
DELAY_3S1: MOV R7,#00H
DELAY_3S2: NOP
NOP
DJNZ R7,DELAY_3S2
DJNZ R6,DELAY_3S1
DJNZ R5,DELAY_3S0
RET
;
DELAY_50MS: MOV R5,#50 ;延时约50MS
DELAY_50MS1:MOV R6,#250
DELAY_50MS2:NOP
NOP
DJNZ R6,DELAY_50MS2
DJNZ R5,DELAY_50MS1
RET
;
DELAY: DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -