;從8563讀出時,分,秒數據,數碼管顯示
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