?? pcf85632.asm
字號:
;*****************************************************************
; 這是PCF8563匯編語言程序,文件名為F85632.ASM
; 功能:本程序是PCF8563的時鐘日歷讀寫程序, 單片機的 P1.0、P1.1分別
; 和PCF8563的SDA、SCL腳相連。
;*****************************************************************
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 ;年寄存器
ORG 0000H ;主程序
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#0CFH
CLR EA
LCALL SETNUM ;時間日歷初始值
LCALL SETTIME ;當前時鐘日歷值設定
LCALL READTIME ;讀出時鐘芯片當前值
SJMP $
; PCF8563當前時間設定子程序
SETTIME:
MOV R1,#0AH ;檢查是否為第一次啟動,是則初始化時間
LCALL READDATA
ANL A,#3FH
CJNE A,#08,SET1
RET
SET1:
MOV 38H,SEC ;時間初始化-將秒至年的時間寫入發(fā)送緩沖區(qū)
MOV 39H,MIN
MOV 3AH,HOUR
MOV 3BH,DAY
MOV 3CH,WEEK
MOV 3DH,MONTH
MOV 3EH,YEAR
LCALL WRITEM ;調(diào)用寫多個字節(jié)數(shù)據(jù)程序
MOV R2,#00H ;設置PCF8563的控制寄存器00H為00H,以普通模式運行
MOV R3,#0H
LCALL WRITEDATA ;寫單個字節(jié)數(shù)據(jù)程序
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,定時器倒計數(shù)值為64
MOV R3,#0FH
LCALL WRITEDATA
RET
;讀出時鐘芯片當前值子程序
READTIME:
MOV R1,#02H ;取待讀寄存器地址
MOV R3,#7 ;讀7個時鐘信息
LCALL READDATA1 ;調(diào)讀多個字節(jié)數(shù)據(jù)程序
MOV A,40H ;取秒字節(jié)
ANL A,#7FH ;屏蔽無效位
MOV SEC,A ;送秒寄存器
MOV A,41H ;取分字節(jié)
ANL A,#7FH ;屏蔽無效位
MOV MIN,A ;送分寄存器
MOV A,42H ;取小時字節(jié)
ANL A,#3FH ;屏蔽無效位
MOV HOUR,A ;送時寄存器
MOV A,43H ;取天字節(jié)
ANL A,#3FH ;屏蔽無效位
MOV DAY,A ;送天寄存器
MOV A,44H ;取星期字節(jié)
ANL A,#07H ;屏蔽無效位
MOV WEEK,A ;送星期寄存器
MOV A,45H ;取月字節(jié)
ANL A,#1FH ;屏蔽無效位
MOV MONTH,A ;送月寄存器
MOV A,46H ;取年字節(jié)
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 ;發(fā)出一個啟始位
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY
CLR SCL
RET
;停止位程序:
BSTOP: ;發(fā)出一個停止位
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 ,每個字節(jié)傳輸完成,輸出ack=0,結(jié)束讀數(shù)據(jù),ack=1;
MOV SDA,C
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SCL
RET
;讀一個字節(jié)數(shù)據(jù)程序:入口 R1放待讀數(shù)據(jù)地址
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
;讀多個字節(jié)數(shù)據(jù)程序:入口 R1放待讀數(shù)據(jù)首地址,R3中放要讀數(shù)據(jù)個數(shù)
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為數(shù)據(jù)暫存區(qū)首址
MOV B,R3 ;R3中放要讀個數(shù)
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
;寫字節(jié)程序:
SENDBYTE: MOV R0,#08H
LOOP1: RLC A
MOV SDA,C
SETB SCL
LCALL DELAY
CLR SCL
DJNZ R0,LOOP1
LCALL WAITACK
RET
;讀字節(jié)子程序:
READBYTE: MOV R0,#08H;READ THE CONTENT
CLR A
SETB SDA
LOOP4: SETB SCL
MOV C,SDA
RLC A
CLR SCL
LCALL DELAY
DJNZ R0,LOOP4
MOV R2,A
RET
;寫單個字節(jié)數(shù)據(jù)程序:入口 R3放待寫數(shù)據(jù)地址,R2中放待寫數(shù)據(jù)
WRITEDATA:
LCALL BSTART
MOV A,#0A2H
LCALL SENDBYTE
MOV A,R3
LCALL SENDBYTE
MOV A,R2
LCALL SENDBYTE
LCALL BSTOP
RET
;寫多個字節(jié)數(shù)據(jù)程序:R3中放待寫寄存器首地址,R1中放待寫數(shù)據(jù)首址,
;B中放待寫數(shù)據(jù)個數(shù)
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 + -