📄 f8563a.asm
字号:
;*****************************************************************
; 这是被CALL8563.c调用的PCF8563汇编程序,文件名为F8563A.ASM
; 功能:本程序是PCF8563的时钟日历读写程序, 单片机的 P1.0,P1.1分别
; 和PCF8563的SDA、SCL脚相连。
;*****************************************************************
NAME PCF8563A
?PR?_a_func3?PCF8563A SEGMENT CODE
?DT?_a_func3?PCF8563A SEGMENT DATA OVERLAYABLE
?DT?PCF8563A SEGMENT DATA
PUBLIC chai3
PUBLIC ?_a_func3?BYTE
PUBLIC _a_func3
RSEG ?DT?_a_func3?PCF8563A
?_a_func3?BYTE:
aa: DS 1
RSEG ?DT?PCF8563A
chai3:DS 1
RSEG ?PR?_a_func3?PCF8563A
_a_func3:
SDA EQU P1.0
SCL EQU P1.1
SEC DATA 30H ;秒寄存器
MIN DATA 31H ;分寄存器
HOUR DATA 32H ;时寄存器
DAY DATA 33H ;日寄存器
WEEK DATA 34H ;周寄存器
MONTH DATA 35H ;月寄存器
YEAR DATA 36H ;年寄存器
MOV aa,R7 ;R7中放传递进来的字符型数,00为读,FFH为写
MOV A,aa
JNZ CAT1
NOP ; 读PCF8563-读出时钟芯片当前值
LCALL READTIME
RET
CAT1: NOP ; 写PCF8563-当前时钟日历值设定
LCALL SET1
RET
; PCF8563当前时间设定子程序
SETTIME:
MOV R1,#0AH ;检查是否为第一次启动,是则初始化时间
LCALL READDATA
ANL A,#3FH
CJNE A,#08,SET1
RET
SET1:
MOV 38H,SEC ;时间初始化-将秒至年的时间写入发送缓冲区
MOV 39H,MIN
MOV 3AH,HOUR
MOV 3BH,DAY
MOV 3CH,WEEK
MOV 3DH,MONTH
MOV 3EH,YEAR
LCALL WRITEM ;调用写多个字节数据程序
MOV R2,#00H ;设置PCF8563的控制寄存器00H为00H,以普通模式运行
MOV R3,#0H
LCALL WRITEDATA ;写单个字节数据程序
MOV R2,#08H ;设置PCF8563的寄存器0AH为08H,8:00报警
MOV R3,#0AH
LCALL WRITEDATA
MOV R2,#12H ;设置PCF8563的寄存器01H为12H,报警有效
MOV R3,#01H
LCALL WRITEDATA
MOV R2,#081H ;设置PCF8563的频率寄存器0DH为81H,输出频率为1024Hz
MOV R3,#0DH
LCALL WRITEDATA
MOV R2,#081H ;设置PCF8563的寄存器0EH为81H,启动定时器,定时器频率64Hz
MOV R3,#0EH
LCALL WRITEDATA
MOV R2,#64H ;设置PCF8563的寄存器0FH为64H,定时器倒计数值为64
MOV R3,#0FH
LCALL WRITEDATA
RET
;读出时钟芯片当前值子程序
READTIME:
MOV R1,#02H ;取待读寄存器地址
MOV R3,#7 ;读7个时钟信息
LCALL READDATA1 ;调读多个字节数据程序
MOV A,40H ;取秒字节
ANL A,#7FH ;屏蔽无效位
MOV SEC,A ;送秒寄存器
MOV A,41H ;取分字节
ANL A,#7FH ;屏蔽无效位
MOV MIN,A ;送分寄存器
MOV A,42H ;取小时字节
ANL A,#3FH ;屏蔽无效位
MOV HOUR,A ;送时寄存器
MOV A,43H ;取天字节
ANL A,#3FH ;屏蔽无效位
MOV DAY,A ;送天寄存器
MOV A,44H ;取星期字节
ANL A,#07H ;屏蔽无效位
MOV WEEK,A ;送星期寄存器
MOV A,45H ;取月字节
ANL A,#1FH ;屏蔽无效位
MOV MONTH,A ;送月寄存器
MOV A,46H ;取年字节
ANL A,#0FFH ;屏蔽无效位
MOV YEAR,A ;送年寄存器
RET
SETNUM:MOV 30H,#00H ;时间日历初始值
MOV 31H,#59H ;时间初值:07-07-07,星期一 07:59:00
MOV 32H,#07H
MOV 33H,#01H
MOV 34H,#01H
MOV 35H,#07H
MOV 36H,#07H
RET
DELAY: ;延时程序
NOP
NOP
NOP
RET
;启动位程序
BSTART:SETB SDA ;发出一个启始位
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY
CLR SCL
RET
;停止位程序:
BSTOP: ;发出一个停止位
CLR SDA
CLR SCL
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA
LCALL DELAY
RET
WAITACK:MOV R7,#20 ;等待应答
SETB SDA
LCALL DELAY
SETB SCL
LCALL DELAY
FLAG1: MOV C,SDA
JNC FLAG2
DJNZ R7,FLAG1
LCALL BSTOP
FLAG2: CLR SCL
LCALL DELAY
RET
WRITEACK:;输出ACK ,每个字节传输完成,输出ack=0,结束读数据,ack=1;
MOV SDA,C
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SCL
RET
;读一个字节数据程序:入口 R1放待读数据地址
READDATA:
LCALL BSTART ;START
MOV A,#0A2H ;写命令
LCALL SENDBYTE
MOV A,R1 ;写地址
LCALL SENDBYTE
LCALL BSTART ;START
MOV A,#0A3H ;读命令
LCALL SENDBYTE
LCALL READBYTE
SETB C
LCALL WRITEACK
LCALL BSTOP
RET
;读多个字节数据程序:入口 R1放待读数据首地址,R3中放要读数据个数
READDATA1:
LCALL BSTART ;START
MOV A,#0A2H ;写命令
LCALL SENDBYTE
MOV A,R1 ;写地址
LCALL SENDBYTE
LCALL BSTART ;START
MOV A,#0A3H ;读命令
LCALL SENDBYTE
MOV R1,#40H ;40H为数据暂存区首址
MOV B,R3 ;R3中放要读个数
DEC B
LOOP: LCALL READBYTE
MOV A,R2
MOV @R1,A
INC R1
CLR C
LCALL WRITEACK
DJNZ B,LOOP
LCALL READBYTE
MOV A,R2
MOV @R1,A
SETB C
LCALL WRITEACK
LCALL BSTOP
RET
;写字节程序:
SENDBYTE: MOV R0,#08H
LOOP1: RLC A
MOV SDA,C
SETB SCL
LCALL DELAY
CLR SCL
DJNZ R0,LOOP1
LCALL WAITACK
RET
;读字节子程序:
READBYTE: MOV R0,#08H;
CLR A
SETB SDA
LOOP4: SETB SCL
MOV C,SDA
RLC A
CLR SCL
LCALL DELAY
DJNZ R0,LOOP4
MOV R2,A
RET
;写单个字节数据程序:入口 R3放待写数据地址,R2中放待写数据
WRITEDATA:
LCALL BSTART
MOV A,#0A2H
LCALL SENDBYTE ;SEND THE CONTROL BYTE
MOV A,R3 ;SEND THE ADDRESS
LCALL SENDBYTE
MOV A,R2 ;WRITE THE CONTENT
LCALL SENDBYTE
LCALL BSTOP
RET
;写多个字节数据程序:R3中放待写寄存器首地址,R1中放待写数据首址,
;B中放待写入数据个数
WRITEM:
MOV R3,#02H
MOV R1,#38H
MOV B,#7
LOOP2: MOV A,@R1
MOV R2,A
LCALL WRITEDATA
INC R1
INC R3
DJNZ B,LOOP2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -