📄 pcf8563.asm
字号:
;本程序在包含VI2C_ASM.INC头文件的前提下对时钟芯片PCF8563进行设定初始时间,然后再读时间,把结果通过串口发送出去;设定和读时间发;时候,给出读对还是出错的信息
ACK BIT 10H;应答标志位变量
SLA DATA 50H;器件从地址变量
SUBA DATA 51H;器件子地址变量
NUMBYTE DATA 52H
;使用前定义变量
SDA BIT P1.7
SCL BIT P1.6
MTD EQU 30H
MRD EQU 46H
;定义器件地址
PCF8563 EQU 0A2H
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
LCALL COMINIT
MOV SP, #70H
MOV R4, #0F0H
DJNZ R4, $
MOV MTD, #00H
MOV MTD+1, #12H
MOV MTD+2, #00H
MOV MTD+3, #57H
MOV MTD+4, #03H
WR8563:
MOV SLA, #PCF8563
MOV SUBA, #00H
MOV NUMBYTE, #5
LCALL IWRNBYTE
NOP
MOV C,ACK
JNC ERROR
LCALL DISPLAY_OK
JMP next
ERROR:LCALL DISPLAY_ERROR
next:
RD8563:
MOV SLA, #PCF8563
MOV SUBA , #02H
MOV NUMBYTE, #3
LCALL IRDNBYTE
NOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV C,ACK
JNC ERROR1
LCALL DISPLAY_OK
JMP next1
ERROR1:LCALL DISPLAY_ERROR
next1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCALL CHANGE
LCALL DISPLAY
MOV R0,#0AH
MYDELAY: LCALL DELAY
DJNZ R0, MYDELAY
JMP RD8563
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHANGE: ;转换成BCD码
MOV A, MRD+2 ;小时放在 40H,41H, 两个字节中
ANL A, #0F0H
SWAP A
MOV 40H, A
MOV A, MRD+2
ANL A, #0FH
MOV 41H, A
MOV A, MRD+1 ;分钟放在 42H,43H, 两个字节中
ANL A, #0F0H
SWAP A
MOV 42H, A
MOV A, MRD+1
ANL A, #0FH
MOV 43H, A
MOV A, MRD ;秒放在 44H,45H, 两个字节中
ANL A, #0F0H
SWAP A
MOV 44H, A
MOV A, MRD
ANL A, #0FH
MOV 45H, A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:
MOV A, #'T'
MOV SBUF,A
LCALL DELAY;
MOV A, #'i'
MOV SBUF,A
LCALL DELAY;
MOV A, #'m'
MOV SBUF,A
LCALL DELAY;
MOV A, #'e'
MOV SBUF,A
LCALL DELAY;
MOV A, #'='
MOV SBUF,A
LCALL DELAY;
MOV A, 40h ;Hour
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A,41h
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A, #':'
MOV SBUF,A
LCALL DELAY;
MOV A, 42h ;Minute
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A,43h
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A, #':'
MOV SBUF,A
LCALL DELAY;
MOV A, 44h ;Second
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A, 45h
ADD A,#30H
MOV SBUF,A
LCALL DELAY;
MOV A, #0DH ;回车换行
MOV SBUF,A
LCALL DELAY;
MOV A, #0AH ;
MOV SBUF,A
LCALL DELAY;
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
MOV R6,#0FFH
DELAY0: MOV R5,#0FFH
DELAY1: DJNZ R5,DELAY1
DJNZ R6,DELAY0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMINIT:
MOV TMOD,#20H ;设置T1为方式2
MOV TH1,#0FDH ;设置波特率为9600
MOV TL1,#0FDH
MOV SCON,#40H ;设置串口位方式1
MOV PCON,#00H ;SMOD=0
SETB TR1 ;开T1
;SETB EA ;开中断
; SETB ES ;允许串口中断
;mov a,sbuf ;预读缓冲区
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY_OK:
MOV A, #'O'
MOV SBUF,A
LCALL DELAY;
MOV A, #'K'
MOV SBUF,A
LCALL DELAY;
MOV A, #'!'
MOV SBUF,A
LCALL DELAY;
MOV A, #0DH ;回车换行
MOV SBUF,A
LCALL DELAY;
MOV A, #0AH ;
MOV SBUF,A
LCALL DELAY;
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY_ERROR:
MOV A, #'E'
MOV SBUF,A
LCALL DELAY;
MOV A, #'r'
MOV SBUF,A
LCALL DELAY;
MOV A, #'r'
MOV SBUF,A
LCALL DELAY;
MOV A, #'o'
MOV SBUF,A
LCALL DELAY;
MOV A, #'r'
MOV SBUF,A
LCALL DELAY;
MOV A, #'!'
MOV SBUF,A
LCALL DELAY;
MOV A, #0DH ;回车换行
MOV SBUF,A
LCALL DELAY;
MOV A, #0AH ;
MOV SBUF,A
LCALL DELAY;
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$INCLUDE(VI2C_ASM.INC)
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -