📄 pcf8365.asm
字号:
;日历时钟显示实验程序
ACK BIT 10H ;应答标志位
SLA DATA 50H ;器件从地址
SUBA DATA 51H ;器件子地址
NUMBYTE DATA 52H ;读/写的字节数
SDA EQU P1.3 ;I2C总线定义
SCL EQU P1.2
MTD EQU 30H ;发送数据缓冲区(30h-3fh)
MRD EQU 40H ;接收数据缓冲区 (40h-4fh)
dispptr EQU 60H
SECOND EQU 60H ;秒钟个位
SECOND1 EQU 61H ;秒钟十位
SPACE EQU 62H
minute equ 63h ;分钟个位
minute1 EQU 64H ;分钟十位
SPACE1 EQU 65H
hour equ 66h ;小时个位
hour1 equ 67h ;小时十位
;定义器件地址
CS124WCXX EQU 0A0H
;-------------------------------------------------
ORG 0000H
AJMP MAIN
;--------------------------------------------------
;主程序
;--------------------------------------------------
ORG 0080H
MAIN: MOV R4,#0F0H ;延时,等待其他芯片复位
DJNZ R4,$
LCALL SEND8563
LOOP8563:
LCALL RCV8563 ;读时钟
LCALL DL1MS
LCALL DLCX ;显示
AJMP LOOP8563
;----------------------------------------------------
;读时钟:下面的程序将秒~年共七个字节的时间信息读出并
;放入MRD 为首址的接收缓冲区中。
;注意时间读出后需进行整理屏蔽无效位方能得出正确的信息。
;---------------------------------------------------
RCV8563:
MOV SLA,#0A2H ;;取器件地址
MOV SUBA,#02H ;;取读时间的首字节地址从秒开始读
MOV NUMBYTE,#07H ;;读七个时间信息
LCALL IRDNBYTE ;;读取时间并放入接收缓冲区中
MOV A,MRD ;;取秒字节
ANL A,#7FH ;;屏蔽无效位
MOV MRD,A
MOV A, MRD+1 ;;取分钟字节
ANL A,#7FH ;;屏蔽无效位
MOV MRD+1,A
MOV A, MRD+2 ;;取小时字节
ANL A,#3FH ;;屏蔽无效位
MOV MRD+2,A
MOV A, MRD+3 ;;取天字节
ANL A,#3FH ;;屏蔽无效位
MOV MRD+3,A
MOV A, MRD+4 ;;取星期字节
ANL A,#07H ;;屏蔽无效位
MOV MRD+4,A
MOV A,MRD+5 ;;取月字节
ANL A,#1FH ;;屏蔽无效位
MOV MRD+5,A
RET
;------------------------------------------------------
;写时钟下面的程序将2000年6月21日星期3下午3 点(15 点)
;59 分30 秒的时间写入PCF8563。
;------------------------------------------------------
SEND8563:
ACALL LOAD8563 ;;将时间装入发送缓冲区(MTD) 中
MOV SLA,#0A2H ;;取器件地址
MOV SUBA,#00H ;;取写入寄存器的首字节地址从00H 开始写
MOV NUMBYTE,#09H ;;写七个时间信息和2 个控制命令
LCALL IWRNBYTE ;;写时间
RET
LOAD8563:
MOV MTD,#00H ;;启动时钟
MOV MTD+1,#1FH ;;设置报警及定时器中断,定时器中断为脉冲形式
MOV MTD+2,#30H ;;以下分别将秒至年的时间写入发送缓冲区中
MOV MTD+3,#59H
MOV MTD+4,#15H
MOV MTD+5,#20H
MOV MTD+6,#02H
MOV MTD+7,#06H
MOV MTD+8,#00H
RET
;-------------------------------------
;向指定子地址写入N个数据
;--------------------------------------
IWRNBYTE:
MOV A,NUMBYTE
MOV R3,A
LCALL START
MOV A,SLA
LCALL WRBYTE
LCALL CACK
JNB ACK,RETWRN
MOV A,SUBA
LCALL WRBYTE
LCALL CACK
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYTE
LCALL CACK
JNB ACK,IWRNBYTE
INC R1
DJNZ R3,WRDA
RETWRN:
LCALL STOP
RET
;-----------------------------------------
;检查应答位子程序
;----------------------------------------
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK
CEND: NOP
CLR SCL
NOP
RET
;----------------------------------------------
;结束总线子程序
;----------------------------------------------
STOP: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
;-----------------------------------------------
;启动总线子程序
;-----------------------------------------------
START: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------
;发送字节子程序
;-----------------------------------------------
WRBYTE:
MOV R0,#08H
WLP: RLC A
JC WR1
SJMP WR0
WLP1: DJNZ R0,WLP
NOP
RET
WR1: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL
NOP
SJMP WLP1
WR0: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;------------------------------------------------
;向器件指定子地址读取N个数据
;------------------------------------------------
IRDNBYTE:
MOV R3,NUMBYTE
LCALL START
MOV A,SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA
LCALL WRBYTE
LCALL CACK
LCALL START
MOV A,SLA
INC A
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RDN1: LCALL RDBYTE
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK
RETRDN:LCALL STOP
RET
SACK: LCALL MACK
INC R1
SJMP RDN1
;-------------------------------------------------
;无子地址器件读写字节数据
;------------------------------------------------
IRDBYTE:
LCALL START
MOV A,SLA
INC A
LCALL WRBYTE
LCALL CACK
JNB ACK,RETRDB
LCALL RDBYTE
LCALL MNACK
RETRDB:LCALL STOP
RET
;------------------------------------------------
;读取字节子程序
;-------------------------------------------------
RDBYTE:MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R2
CLR SCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP
RET
;-------------------------------------------------
;发送应答信号子程序
;-------------------------------------------------
MACK: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;------------------------------------------------
;发送非应答信号
;-------------------------------------------------
MNACK: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;-------------------------------------------------
;//显示程序
;60h-67h:显示缓冲区;
;-------------------------------------------------
DLCX: MOV A,MRD ;处理秒钟
ANL A,#0fH
MOV SECOND,A
MOV A,MRD
SWAP A
ANL A,#0FH
MOV SECOND1,A
MOV A,MRD+1 ;处理分钟
ANL A,#0fH
MOV MINUTE,A
MOV A,MRD+1
SWAP A
ANL A,#0FH
MOV MINUTE1,A
MOV A,MRD+2 ;处理秒钟
ANL A,#0fH
MOV HOUR,A
MOV A,MRD+2
SWAP A
ANL A,#0FH
MOV HOUR1,A
MOV SPACE,#0AH
MOV SPACE1,#0AH
DISP: MOV R3,#8
DISPLOOP2:
mov r2,#8
disploop0:
mov r1,#01h
mov r0,#67h
mov dptr,#tab
disploop1:
mov a,@r0
movc a,@a+dptr
mov p0,a
mov p2,r1
lcall dl1ms
lcall dl1ms
DEC r0
mov a,r1
RL a
mov r1,a
djnz r2,disploop1
DJNZ R3,DISPLOOP2
DL1MS:
LOOP1: MOV R6,#0FH
LOOP2: NOP
NOP
DJNZ R6,LOOP2
RET
tab: db 03h,09FH,25h,0Dh,099h,49h,41h,01Fh,01h,09h,0FDH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -