?? ds1302.a51
字號:
B_SCLK EQU P1.1
B_RST EQU P1.3
B_SIO EQU P1.2
ORG 0000H
MAIN:
MOV SP,#40H
MOV R0,#20H
MOV R2,#7
;LCALL SET_TIME
LCALL GET_TIME
LCALL OPENF_COM
LCALL SEND_COM
; MOV R3,#84H
; LCALL READ_DATA
; LCALL GET_TIME
JMP MAIN
;------------------------------------------------------
;向DS1302發送一個字節,發送數據ACC
;輸入:ACC,輸出:空
;------------------------------------------------------
SEND_BYTE:
MOV B,R2
MOV R2,#8
SEND_BYTE1:
RRC A
MOV B_SIO,C
SETB B_SCLK
NOP
NOP
CLR B_SCLK
DJNZ R2,SEND_BYTE1
MOV R2,B
RET
;---------------------------------------------------
;從DS1302接受一個字節數據接受數據放入ACC
;輸入:空,輸出:ACC
;---------------------------------------------------
GET_BYTE:
MOV B,R2
MOV R2,#8
CLR A
GET_BYTE1:
MOV C,B_SIO
RRC A
SETB B_SCLK
NOP
NOP
CLR B_SCLK
DJNZ R2,GET_BYTE1
MOV R2,B
RET
;--------------------------------------------------
;向DS1302寫一個數據:寫入地址放在R3,寫入數據放在ACC
;輸入:R3、ACC,輸出:空
;--------------------------------------------------
WRITE_DATA:
CLR B_RST
CLR B_SCLK
SETB B_RST
PUSH ACC
MOV A,R3
LCALL SEND_BYTE ;發送地址(R3)
POP ACC
LCALL SEND_BYTE ;發送數據(ACC)
SETB B_SCLK
CLR B_RST
RET
;---------------------------------------------------
;從DS1302讀一個數據:要讀的地址放R3,讀出的數據放ACC
;輸入:R3,輸出:ACC
;---------------------------------------------------
READ_DATA:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,R3
LCALL SEND_BYTE ;發送地址(R3)
; LCALL DELAY
LCALL GET_BYTE ;接受數據到(ACC)
SETB B_SCLK
CLR B_RST
RET
;-----------------------------------------------------------------------------
;往DS1302寫入時鐘數據(多字節方式),時鐘數據地址
;格式為: 秒 分 時 日 月 星期 年 控制(8421BCD碼)
;先寫控制字節(在8EH單元寫入00),在寫命令字0BEH(多字節時鐘寫),在發送8個字節
;寫入數據指針R0(以R0間址)
;輸入:@R0,輸出:空
;-----------------------------------------------------------------------------
WRITE_CLK:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA ;控制命令,WP=0,寫操作地址:8EH單元寫數據0
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0BEH
LCALL SEND_BYTE ;0BEH:時鐘多字節寫命令
MOV A,R2
PUSH ACC
MOV R2,#8
WRITE_CLK1:
MOV A,@R0
LCALL SEND_BYTE
INC R0
LCALL DELAY
DJNZ R2,WRITE_CLK1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R3,A
POP ACC
MOV R2,A
RET
;------------------------------------------------------------------------
;讀取DS1302時鐘數據 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年(8421BCD)
;讀出來的數據放到R0間地址
;先發送0BFH命令字(多字節時鐘讀),在讀8個字節
;輸入:空,輸出:@R0
;------------------------------------------------------------------------
READ_CLK:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0BFH
LCALL SEND_BYTE ;0BFH:時鐘多字節讀命令
MOV A,R2
PUSH ACC
MOV R2,#8
READ_CLK1:
LCALL GET_BYTE
MOV @R0,A
INC R0
LCALL DELAY
DJNZ R2,READ_CLK1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R2,A
RET
;-----------------------------------------------------------------------
;往DS1302寄存器數寫入數據(多字節方式)
;寫的數據指針R0(R0間址)
;先寫控制字(在8EH單元寫入00),在寫0FEH命令字(多字節RAM寫),在寫31個字節
;輸入:@R0,輸出:空
;-----------------------------------------------------------------------
WRITE_WORD:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA ;控制命令,WP=0,寫操作,向8EH單元寫入數據0
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0FEH ;0FEH RAM多字節寫命令
LCALL SEND_BYTE
MOV A,R2
PUSH ACC
MOV R2,#31
WRITE_WORD1:
MOV A,@R0
LCALL SEND_BYTE
INC R0
LCALL DELAY
DJNZ R2,WRITE_WORD1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R3,A
POP ACC
MOV R2,A
RET
;-------------------------------------------------------------------
;從DS1302寄存器數讀出數據(多字節方式)
;讀出的數據指針R0(R0間址)
;先發送0FFH命令字(多字節RAM讀),在讀31個字節
;輸入:空,輸出:@R0
;--------------------------------------------------------------------
READ_WORD:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0FFH ;時鐘多字節讀命令
LCALL SEND_BYTE ;0FFH RAM多字節讀命令
MOV A,R2
PUSH ACC
MOV R2,#31
READ_WORD1:
LCALL GET_BYTE
MOV @R0,A
INC R0
LCALL DELAY
DJNZ R2,READ_WORD1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R2,A
RET
;---------------------------------------------------------------------------------
;設置初始時間 初始時間格式為: 秒 分 時 日 月 星期 年(8421BCD碼)
;初始時間放入R0間址域
;先寫控制字(在8EH單元寫入00),然后從80H寫入7個時間字節(地址每次加2),然后在發控制字
;輸入:@R0,輸出:空
;----------------------------------------------------------------------------------
SET_TIME:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA
MOV R3,#80H
MOV R2,#7
SET_TIME1:
MOV A,@R0
LCALL WRITE_DATA
INC R0
INC R3
INC R3
LCALL DELAY
DJNZ R2,SET_TIME1
MOV R3,#8EH
MOV A,#80H
LCALL WRITE_DATA
POP ACC
MOV R3,A
RET
;--------------------------------------------------------------
;讀當前時間 當前時間格式為: 秒 分 時 日 月 星期 年(8421BCD碼)
;讀到R0間址
;從81H讀出來當前時鐘(每讀一個字節地址加2)
;輸入:空,輸出:@R0
;--------------------------------------------------------------
GET_TIME:
MOV A,R3
PUSH ACC
MOV R3,#81H
MOV R2,#7
GET_TIME1:
LCALL READ_DATA
MOV @R0,A
INC R0
INC R3
INC R3
;LCALL DELAY
DJNZ R2,GET_TIME1
POP ACC
MOV A,R3
RET
DELAY:
DB 0,0,0,0
RET
OPENF_COM:
MOV TH1,#0FAH
MOV TL1,#0FAH
MOV SCON,#50H
MOV TMOD,#20H
ANL PCON,#7FH
MOV IP,#10H
CLR ES
SETB TR1
CLR EA
RET
SEND_COM:
MOV B,R2
MOV R2,#7
MOV R0,#20H
SEND_COM1:
CLR TI
MOV A,@R0
MOV SBUF,A
SEND_COM2:
JB TI,SEND_COM3
JMP SEND_COM2
SEND_COM3:
INC R0
DJNZ R2,SEND_COM1
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -