pcf—8563的應用程序

;2008-11-13
;時鐘芯片8563
;從8563讀出時,分,秒數據,數碼管顯示
SCL_8563 BIT P0.6    ;時鐘芯片的時鐘線
SDA_8563 BIT P0.7    ;時鐘芯片的數據線
SCL BIT P0.3          ;164的時鐘線
SDA BIT P0.2          ;164的數據線
LED0 EQU 40H    ;保存秒個位數據
LED1 EQU 41H    ;保存秒十位數據
LED2 EQU 42H    ;保存分個位數據
LED3 EQU 43H    ;保存分十位數據
LED4 EQU 44H    ;保存時個位數據
LED5 EQU 45H    ;保存時十位數據
TDATE EQU 46H    ;時間緩存
S EQU 47H
MIN EQU 48H
HOU EQU 49H
SUBA EQU 4AH
ORG 0000H
AJMP MAIN
ORG 0100H
;*********主程序***********
MAIN:
ACALL SEND8563 ;寫時鐘,初初始化時鐘爲12點0分0秒
LOOP:
ACALL RCV8563 ;讀時鐘數據
ACALL SEP      ;數據拆分
ACALL DISPLAY ;調用顯示
ACALL DELAY     ;調用延時
AJMP LOOP
;*********主程序結束***********
;**********初始化時間寫進8563子程序**************
SEND8563:
MOV S,#00H        ;初始化時間
MOV MIN,#00H
MOV HOU,#12H

MOV SUBA,#02H ; 取讀秒時間字節地址
MOV TDATE,S        ;秒數據
ACALL WRITE_8563    ;把數據讀人8563

MOV SUBA,#03H       ;取讀分時間字節地址
MOV TDATE,MIN
ACALL WRITE_8563

MOV SUBA,#04H       ;取讀時時間字節地址
MOV TDATE,HOU
ACALL WRITE_8563
RET
;**********初始化時間寫進8563子程序 結束**************
;**********寫8563子程序************
WRITE_8563:
ACALL START    ;發送IC總線起始條件啓動PC8563
MOV A,#0A2H    ;取器件地址向8563發出寫的指令
ACALL WRITE_BYTE ;寫進PCF8563器件總線地址

MOV A,SUBA        ;取讀時間字節地址
ACALL WRITE_BYTE ;寫進時間字節地址

MOV A,TDATE        ;將所要寫入的數據寫入
ACALL WRITE_BYTE    ;寫進時間
ACALL STOP           ;發送IC總線停止條件
RET
;**********寫8563子程序結束***********
;********讀8563子程序**************
RCV8563:
ACALL START    ;啓動總線
MOV A,#0A2H     ;寫操作器件地址
ACALL WRITE_BYTE    ;寫入器件地址
MOV A,#02H         ;選擇單元地址
ACALL WRITE_BYTE     ;寫入單元地址

ACALL START       ;重新啓動總線
MOV A,#0A3H       ;讀操作器件地址
ACALL WRITE_BYTE    ;寫入器件地址
ACALL READ_BYTE      ;讀入一個數據:秒
ANL A,#7FH      ;屏蔽無效位
MOV S,A         ;送秒保存單元

ACALL START     ;重新啓動總線
MOV A,#0A3H      ;讀操作器件地址
ACALL WRITE_BYTE   ;寫入器件地址
ACALL READ_BYTE   ;讀下個字節數據:分
ANL A,#7FH         ;屏蔽無效位
MOV MIN,A          ;送分保存單元

ACALL START
MOV A,#0A3H
ACALL WRITE_BYTE
ACALL READ_BYTE     ;讀下個字節數據:時
ANL A,#3FH           ;屏蔽無效位
MOV HOU,A             ;送時保存單元
ACALL STOP          ;結束總線
RET
;******讀8563子程序結束************
;***寫一個字節子程序*********
WRITE_BYTE:
MOV R0,#8        ;寫進的數據爲8位
CLR C             ;清進位標誌
CLR SCL_8563      ;時鐘線鉗位爲0
DL:
RLC A              ;要發送的數據左移,被寫進位進人C
MOV SDA_8563,C     ;要寫進的位送到時鐘線
NOP
NOP
NOP
SETB SCL_8563     ; 置時鐘線爲高,數據寫入芯片
NOP
NOP
NOP
CLR SCL_8563      ;鉗住總線準備接受下一個數據位
NOP
NOP
NOP
DJNZ R0,DL         ;8位沒寫完繼續寫
SETB SDA_8563       ;8位發送完後釋放數據線準備收應答位
NOP
NOP
NOP
SETB SCL_8563       ;開始接受應答信號
NOP
NOP
NOP
CLR F0            ;預先清發送數據出錯標誌
JNB SDA_8563,ACKEND ;判斷是否接受應答信號正常轉ACKEND
SETB F0           ;未受到應答置位錯誤標誌
ACKEND:
NOP
NOP
CLR SCL_8563    ;發送結束鉗住總線準備下一步發送或接受數據或進行其他處理
RET
;***寫一個字節子程序結束*********
;******讀一個字節子程序************
READ_BYTE:
MOV R0,#8
SETB SDA_8563   ;置數據線爲輸入方式
CLR A
NOP
NOP
NOP
READ:
CLR SCL_8563    ;置時鐘線爲低,準備接受數據
nop
nop
nop
nop
nop
nop
SETB SCL_8563    ;置時鐘線爲高使數據線上數據有效
NOP
NOP
NOP
MOV C,SDA_8563    ;接受的數據位放入ACC
RLC A
NOP
NOP
NOP
DJNZ R0,READ   ;8位沒收完繼續接受
NOP
NOP
CLR SCL_8563
nop
nop
RET
;**********寫一個字節子程序結束**********
;**********啓動總線子程序*********
START:
SETB SDA_8563    ;發送起始條件的數據信號
SETB SCL_8563
NOP
NOP
NOP
CLR SDA_8563      ;發送起始信號
NOP
NOP
NOP
CLR SCL_8563     ;鉗住總線
RET
;**********啓動總線子程序 結束*********
;**********停止總線子程序***********
STOP:
CLR SCL_8563
NOP
NOP
NOP
CLR SDA_8563    ;發送停止條件的數據信號
NOP
NOP
NOP
SETB SCL_8563    ;發送停止條件的時鐘信號
NOP
NOP
NOP
SETB SDA_8563     ;發送IC總線停止信號
NOP
NOP
NOP
CLR SCL_8563
RET
;**********停止總線子程序 結束***********
;******拆分子程序***********
SEP:
MOV A,S      ;秒
ANL A,#0FH    ;屏蔽高四位,只取低四位
MOV LED0,A    ;秒個位存到LED0
MOV A,S        ;秒重載
ANL A,#0F0H    ;屏蔽底四位,取高四位
SWAP A         ;高低字節交換
MOV LED1,A     ;秒十位存到LED1

MOV A,MIN
ANL A,#0FH
MOV LED2,A
MOV A,MIN
ANL A,#0F0H
SWAP A
MOV LED3,A

MOV A,HOU
ANL A,#0FH
MOV LED4,A
MOV A,HOU
ANL A,#0F0H
SWAP A
MOV LED5,A
RET
;******拆分子程序 結束***********
;******顯示子程序***********
DISPLAY:
MOV DPTR,#TAB

MOV A,LED0
MOVC A,@A+DPTR
ACALL SHIFT

MOV A,LED1
MOVC A,@A+DPTR
ACALL SHIFT

MOV A,#0FFH
ACALL SHIFT

MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT

MOV A,LED3
MOVC A,@A+DPTR
ACALL SHIFT

MOV A,#0FFH
ACALL SHIFT

MOV A,LED4
MOVC A,@A+DPTR
ACALL SHIFT

MOV A,LED5
MOVC A,@A+DPTR
ACALL SHIFT
RET
;******顯示子程序 結束***********
;*********************
SHIFT:
MOV R0,#8
CLR C
DLL:
CLR SCL
RLC A
MOV SDA,C
SETB SCL
DJNZ R0,DLL
RET
;********************
;*********延時子程序********
DELAY:
MOV R1,#0FFH
DEL1:
MOV R2,#0FFH
DEL2:
DJNZ R2,DEL2
DJNZ R1,DEL1
RET
;*********延時子程序 結束********
;*************
tab:
DB 11h,0d7h,32h, 92h,0d4h,98h,18h,0d3h,10h,090h,0FFH
;******************
END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章