📄 eeprom.dt
字号:
;------------------------------------------------
;--------读写eeprom AT24C16----------------------
;-------- PlatForm: EPD3331----------------------
;---------CLOCK 8MHZ-----------------------------
;---------Date:2007-06-02- WXY------------------
;------------------------------------------------
;PORTB
SDA EQU 7 (PULL UP )
SCL EQU 6 (PULL UP )
;--------------------------------------------------
;--------R_PositionX =DEVICE ADDRESS------------
;--------R_PositionY =WOED ADDRESS------------
;--------R_temp3 =Write Data----------------
;--------------------------------------------------
Start_Write_Byte:
MOV R_temp3,A
CALL Delay100ms
CALL Start_bit
MOV A,R_PositionX ;Device Address
AND A,#10101110B
OR A,#10100000B
CALL Write_data
MOV A,R_PositionY ;Word Address
CALL Write_data
MOV A,R_temp3 ;Data
CALL Write_data
CALL Stop_bit
RET
;-------------------------------------------------------
;--------------------------------------------------
;--------R_PositionX =DEVICE ADDRESS------------
;--------R_PositionY =WOED ADDRESS------------
;--------R_temp2 =Read Byte Numbers---------
;--------------------------------------------------
Start_Read_Byte:
MOV R_temp2,A ;连续读字节数
MOVPR BSR_bak,BSR1
BS POST_ID,FSR1PE ;AUTO INCREASE
BS POST_ID,FSR1_ID
MOV A,#03H ;BANK 3
MOV BSR1,A
MOV A,#80H
MOV FSR1,A
CALL Start_bit
MOV A,R_PositionX ;Device Address
AND A,#10101110B
OR A,#10100000B
CALL Write_data
MOV A,R_PositionY ;Word Address
CALL Write_data
CALL Start_bit
OR A,#10100001B ;Send Read command
CALL Write_data
Read_Next:
CALL Read_data
MOV A,R_temp1
MOV INDF1,A
JDNZ R_temp2,Read_Next
MOVRP BSR1,BSR_bak
CALL Stop_bit
RET
;-------------------------------------------
Write_data:
MOV R_temp1,A
MOV A,#8
MOV Temploop,A
Write_dataLoop:
BC PORTB,SCL
CALL NOP_Delay5US
BC STATUS,C
RLC R_temp1
JBC STATUS,F_C,Write_data1
BS PORTB,SDA
JMP Write_data2
Write_data1:
BC PORTB,SDA
Write_data2:
BS PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
JDNZ Temploop,Write_dataLoop
BC PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
MOV A,DCRB
OR A,#10000000B ;SET PORTB 7 AS INPUT
MOV DCRB,A
BS PORTB,SCL
CALL NOP_Delay5US
Check_ACK:
JBS PORTB,SDA,Check_ACK
BC PORTB,SCL
MOV A,DCRB ;set portb as output
AND A,#01111111b
MOV DCRB,A
RET
;--------------------------------------------
Read_data:
MOV A,#8
MOV Temploop,A
MOV A,DCRB
OR A,#10000000B ;SET PORTB 7 AS INPUT
MOV DCRB,A
CALL NOP_Delay5US
Read_dataLoop:
BS PORTB,SCL
CALL NOP_Delay5US
BC STATUS,F_C
JBC PORTB,SDA,Read_data1
BS STATUS,F_C
Read_data1:
RLC R_temp1
BC PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
JDNZ Temploop,Read_dataLoop
MOV A,DCRB ;set portb as output
AND A,#01111111b
MOV DCRB,A
MOV A,R_temp2
JE A,#01,Read_finish
BC PORTB,SDA
JMP Read_continue
Read_finish:
BS PORTB,SDA ;若是最后一字节置SDA=1.
Read_continue:
CALL NOP_Delay5US
BS PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
BC PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
BS PORTB,SDA ;应答毕,置SDA=1.
RET
;------------------------------------
Start_bit:
BS PORTB,SDA
BS PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
BC PORTB,SDA
; BC PORTB,SCL
RET
Stop_bit:
BC PORTB,SDA
BS PORTB,SCL
CALL NOP_Delay5US
CALL NOP_Delay5US
BS PORTB,SDA
RET
;-------------------------------------------
NOP_Delay5US:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -