📄 sky1.asm
字号:
MOV SUBADR, #03H
MOV BYTCNT, #06
ACALL RCVDATA
MOV A, 60H ;读取分钟
ANL A, #7FH ;屏蔽无效位
MOV MIN_MD, A
MOV A, 61H ;读取小时
ANL A, #3FH ;屏蔽无效位
MOV HOU_MD, A
MOV A, 62H ;读取日子
ANL A, #3FH ;屏蔽无效位
MOV DAY_MD, A
MOV A, 64H ;读取月份
ANL A, #1FH ;屏蔽无效位
MOV MON_MD, A
MOV A, 65H ;读取年份
ANL A, #0FFH ;屏蔽无效位
MOV YEA_MD, A
RET
;**************************************************************
; 设置当前时间及日期数据
;**************************************************************
SET_TIME:
ACALL INIT8563
MOV SLVADR, #PCF8563
MOV SUBADR, #00H
MOV BYTCNT, #9
ACALL SENDDATA
RET
;**************************************************************
; 初始化P8653
;**************************************************************
INIT8563:
MOV 70H, #00H ;启动时钟
MOV 71H, #15H ;设置报警及定时器中断
MOV 72H, #00H ;设置秒BCD
MOV 73H, MIN_MD ;设置分钟BCD
MOV 74H, HOU_MD ;设置小时BCD
MOV 75H, DAY_MD ;设置日期BCD
MOV 76H, #00H ;设置星期BCD
MOV 77H, MON_MD ;设置月份BCD
MOV 78H, YEA_MD ;设置年份BCD
RET
;**************************************************************
; 写数据到E2PROM
;
; 输入 -- R7:写数据起始地址
; AT2408:E2PROM器件地址 (0A8H,0AAH,0ABH,0ACH有效)
;**************************************************************
WRITE_ROM:
ACALL SETBUFF
MOV SLVADR, AT2408
MOV SUBADR, R7
MOV BYTCNT, #07H
ACALL SENDDATA
RET
;**************************************************************
; 设置I2C总线发送数据缓冲区
;
; 输入 -- R6 :当前记录序号
;**************************************************************
SETBUFF:
MOV 70H, R6 ;记录序号
MOV 71H, YEA_MD ;当前年数据
MOV 72H, MON_MD ;当前月数据
MOV 73H, DAY_MD ;当前日数据
MOV 74H, HOU_MD ;当前小时数据
MOV 75H, MIN_MD ;当前分钟数据
MOV 76H, AD_VAL ;AD采样值
MOV 77H, #0FFH ;记录结束标志
RET
;**************************************************************
; 读取E2PROM数据
;
; 输入 -- R7:读数据起始地址
; AT2408:E2PROM器件地址 (0A8H,0AAH,0ABH,0ACH有效)
; 返回 -- R6:当前记录数
;**************************************************************
READ_ROM:
MOV SLVADR, AT2408
MOV SUBADR, R7
MOV BYTCNT, #07H
ACALL RCVDATA
MOV R6, 60H ;读取记录数
MOV YEA_MD, 61H ;读取年份数据
MOV MON_MD, 62H ;读取月份数据
MOV DAY_MD, 63H ;读取日期数据
MOV HOU_MD, 64H ;读取小时数据
MOV MIN_MD, 65H ;读取分钟数据
MOV AD_VAL, 66H ;读取AD采年份
RET
;**************************************************************
; 读取E2PROM中保存的记录总数
;**************************************************************
READ_REC:
MOV SLVADR, #0AEH ;E2PROM中第四页
MOV SUBADR, #0F8H ;最后8位字节
MOV BYTCNT, #01H
ACALL RCVDATA
MOV REC_NU, 60H ;读取记录数
RET
;**************************************************************
; I2C总线发送数据
;**************************************************************
SENDDATA:
ACALL I2C_START
MOV A, SLVADR
ACALL SENTBYTE
JB F0, SRET
MOV A, SUBADR
ACALL SENTBYTE
JB F0, SRET
MOV R0, #XMTDAT
SNEXT:
MOV A, @R0
ACALL SENTBYTE
JB F0, SRET
INC R0
DJNZ BYTCNT, SNEXT
ACALL I2C_STOP
DELAY10:
MOV R7, #30H
D1:
MOV R6, #34H
D2:
DJNZ R6, D2
DJNZ R7, D1
SRET:
RET
;**************************************************************
; I2C总线接收数据
;**************************************************************
RCVDATA:
ACALL I2C_START
MOV A, SLVADR
ACALL SENTBYTE
JB F0, RRET
MOV A, SUBADR
ACALL SENTBYTE
JB F0, RRET
ACALL I2C_START
MOV A, SLVADR
SETB ACC.0
ACALL SENTBYTE
JB F0, RRET
CLR ACK
MOV R0, #RCVDAT
DJNZ BYTCNT,RNEXT
SJMP RLAST
RNEXT:
ACALL RCVBYTE
MOV @R0, A
INC R0
DJNZ BYTCNT,RNEXT
RLAST:
SETB ACK
ACALL RCVBYTE
MOV @R0, A
ACALL I2C_STOP
RRET:
RET
;**************************************************************
; 启动I2C总线
;**************************************************************
I2C_START:
SETB I2C_DIO
NOP
SETB I2C_CLK
NOP ;NOP=1.085us
NOP
NOP
NOP
NOP
CLR I2C_DIO
NOP
NOP
NOP
NOP
CLR I2C_CLK
RET
;**************************************************************
; 停止I2C总线
;**************************************************************
I2C_STOP:
CLR I2C_DIO
NOP
NOP
SETB I2C_CLK
NOP
NOP
NOP
NOP
NOP
SETB I2C_DIO
NOP
NOP
NOP
NOP
; CLR I2C_DIO
; CLR I2C_CLK
RET
;**************************************************************
; I2C总线发送字节
;**************************************************************
SENTBYTE:
MOV BITCNT, #08H
SENTB:
RLC A
JC SENT1
CLR I2C_DIO
SJMP SENT
SENT1:
SETB I2C_DIO
NOP
SENT:
NOP
SETB I2C_CLK
NOP
NOP
NOP
NOP
NOP
CLR I2C_CLK
DJNZ BITCNT, SENTB
NOP
NOP
SETB I2C_DIO
NOP
NOP
SETB I2C_CLK
NOP
NOP
CLR F0
JNB I2C_DIO, ACKEND
SETB F0
ACKEND:
NOP
NOP
CLR I2C_CLK
RET
;**************************************************************
; I2C总线接收字节
;**************************************************************
RCVBYTE:
SETB I2C_DIO
MOV BITCNT, #08H
RCV:
NOP
CLR I2C_CLK
NOP
NOP
NOP
NOP
NOP
SETB I2C_CLK
NOP
NOP
NOP
NOP
CLR C
JNB I2C_DIO, RCV0
SETB C
RCV0:
RLC A
NOP
NOP
DJNZ BITCNT, RCV
CLR I2C_CLK
NOP
NOP
CLR I2C_DIO
JNB ACK, SentAckB
SETB I2C_DIO
SENTACKB:
NOP
SETB I2C_CLK
NOP
NOP
NOP
NOP
NOP
CLR I2C_CLK
CLR ACK
RET
;**************************************************************
; 设置产生秒中断
;**************************************************************
SETSINT:
MOV SLVADR, #PCF8563
MOV SUBADR, #01H
MOV BYTCNT, #01H
ACALL RCVDATA
MOV A, #60H
ORL A, #01H
MOV 70H, A
MOV SUBADR, #01H
MOV BYTCNT, #01H
ACALL SENDDATA
MOV 70H, #81H
MOV 71H, #64
MOV SUBADR, #0EH
MOV BYTCNT, #02H
ACALL SENDDATA
RET
;**************************************************************
; 功能键处理
;**************************************************************
KEY_FUN:
MOV A, LED_D6
RR A
MOV LED_D6, A
CJNE A, #20H, PD0 ;切换到日期
ACALL CLR_SCR
MOV A, LED_D6
SJMP PD4
PD0:
CJNE A, #10H, PD1 ;切换到时间
ACALL CLR_SCR
MOV A, LED_D6
SJMP PD4
PD1:
CJNE A, #04H, PD3 ;切换到常态
PD3:
MOV LED_D6, #40H
MOV A, FNDREG
CJNE A, #01H, PD5 ;是否处于查寻状态
ACALL CLR_SCR
ACALL DISP_ADS
PD5:
MOV A, REC_NU
ACALL DISP_REC
MOV A, #40H
PD4:
MOV R7, #07H
ACALL SET_LED
RET
;**************************************************************
; 编辑键处理
;**************************************************************
KEY_MOD:
MOV A, LED_D6
ANL A, #7FH
CJNE A, #40H, PJ4
MOV A, FNDREG
CJNE A, #01H, PJ6
ANL FNDREG, #0F0H ;清除查寻状态标志
SJMP PJ7
PJ6:
ORL FNDREG, #01H ;设置查寻状态标志
ACALL CLR_SCR
PJ7:
MOV CU_REC, REC_NU
MOV A, REC_NU
ACALL DISP_REC
SJMP PJ1
PJ4:
CJNE A, #20H, PJ0 ;编辑日期
MOV TMPVAL, #80H
SJMP PJ2
PJ0:
CJNE A, #10H, PJ1 ;编辑时间
MOV TMPVAL, #0C0H
PJ2:
ANL MODREG, #0F0H ;清除查看记录状态
MOV A, MODREG
ANL A, #0F0H
CJNE A, #0H, PJ3
MOV MODREG, #90H
SJMP PJ1
PJ3:
RL A
ORL A, #80H
ANL A, #0F0H
CJNE A, TMPVAL, PJ5
MOV MODREG, #00H
SJMP PJ1
PJ5:
MOV MODREG, A
PJ1:
RET
;**************************************************************
; 增加键模式处理
;**************************************************************
KEY_UP:
ANL FUNREG, #0F0H
ORL FUNREG, #01H
ACALL PRESS_KEY
RET
;**************************************************************
; 减少键模式处理
;**************************************************************
KEY_DOWN:
ANL FUNREG, #0F0H
ORL FUNREG, #02H
ACALL PRESS_KEY
RET
;**************************************************************
; 增加键处理例程 A: B:
;**************************************************************
UP_ROUTINE:
CJNE A, MAX_VL, XP0
MOV A, MIN_VL
SJMP XP2
XP0:
INC A
XP2:
RET
;**************************************************************
; 减少键处理例程 A: B:
;**************************************************************
DOWN_ROUTINE:
CJNE A, MIN_VL, XP1
MOV A, MAX_VL
SJMP XP3
XP1:
DEC A
XP3:
RET
;**************************************************************
; 编辑模式按键处理
;**************************************************************
PRESS_KEY:
MOV A, FNDREG
CJNE A, #01H, PG0 ;是否处于查寻状态
MOV A, LED_D6
ANL A, #7FH
CJNE A, #40H, XD12 ;记录数增加
; MOV A, FNDREG
; CJNE A, #01, XD12
MOV MAX_VL, REC_NU
MOV MIN_VL, #00H
MOV A, FUNREG
ANL A, #0FH
CJNE A, #01H, XD0
MOV A, CU_REC
ACALL DOWN_ROUTINE
SJMP XD1
XD0:
MOV A, CU_REC
ACALL UP_ROUTINE
XD1:
MOV CU_REC, A
ACALL GET_ADDR
ACALL READ_ROM
; ACALL CLR_SCR
ACALL DISP_ADS
XD12:
JMP PG9
PG0:
MOV A, LED_D6
ANL A, #7FH
CJNE A, #40H, XD13
JMP PG9
XD13:
CJNE A, #20H, PG4 ;日期编辑
MOV A, MODREG
ANL A, #0F0H
CJNE A, #90H, PG2 ;编辑天数
MOV MAX_VL, #31
MOV MIN_VL, #1
MOV A, FUNREG
ANL A, #0FH
CJNE A, #01H, XD2
MOV A, DAY_MD
ACALL BCD_HEX
ACALL DOWN_ROUTINE
SJMP XD3
XD2:
MOV A, DAY_MD
ACALL BCD_HEX
ACALL UP_ROUTINE
XD3:
ACALL HEX_BCD
MOV DAY_MD, A
MOV LED_D0, R3
MOV LED_D1, R4
MOV A, R3
MOV R7, #01H
ACALL WRITE_LED
MOV A, LED_D1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -