📄 at24c.asm
字号:
;===============---------------=============================-----------
;at24cxx device
;at24c01(1k) 24c02(2k bits) 24c04(4k bits) 24c08(8k bit) 24c16(16k bit)
;address 1010a3a2a1 b7xxxxxxx
;24c01 using xxxxxxx
;24c02 using b7xxxxxxx
;24c04 using a1 b7xxxxxxx
;24c08 using a2a1 b7xxxxxxx
;24c16 using a3a2a1 b7xxxxxxx
;================--------------======================------------========
Device24 EQU PORTE
atslk equ 3
atsda equ 2
;;SCONF.2=1 SET PORTE.2 I/O
;;SCONF.3=1 SET PORTE.3 I/O
;;INPUT PORTE.2 PECONL.5-4 =00
;;OUTPUT =11
READCONST EQU 11001111B
WRITECONST EQU 00110000B
;if reat data from at24cxx then using
; movlw READCONST
; andwf PECONL,F
;if write data to at24cxx them using
; movlw WRITECONST
; iorwf PECONL,F
;===========------------=============------------===================----
DelaySame:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return
SetAt24c:
bcf SCONF,atslk ;set porte.2-3 is i/o
bcf SCONF,atsda
movlw 11110000b
iorwf PECONL,F ;set porte.2-3 is output
bsf PEPUEN,atslk
bsf PEPUEN,atsda ;set porte.2-3 pull-up enable
bcf PEPDEN,atslk
bcf PEPDEN,atsda ;set porte.2-3 pull-down disable
call DelaySame
return
;===========------------=============------------===================----
Start24:
bsf Device24,atsda
call DelaySame
bsf Device24,atslk
call DelaySame
bcf Device24,atsda
call DelaySame
bcf Device24,atslk
return
;===========------------=============------------===================----
Stop24:
bcf Device24,atslk
call DelaySame
bcf Device24,atsda
call DelaySame
bsf Device24,atslk
call DelaySame
bsf Device24,atsda
call DelaySame
bcf Device24,atslk
return
;===========------------=============------------===================----
;sendout data in WREG
;using TmepTemp
;===========------------=============------------===================----
SendOutByte:
clrf TempTemp,F
bsf TempTemp,3 ;set temptemp<-8
SendOutLop:
rlcf WREG,W
bcf Device24,atsda
btfsc ALUSTA,C
bsf Device24,atsda
call DelaySame
bsf Device24,atslk
call DelaySame
bcf Device24,atslk
decfsz TempTemp,F
goto SendOutLop
return
;===========------------=============------------===================----
;get data in WREG
;using TmepTemp
;===========------------=============------------===================----
GetByte:
clrf TempTemp,F
bsf TempTemp,3 ;set temptemp<-8
movlw 0
GetLop:
call DelaySame
bsf Device24,atslk
call DelaySame
bcf ALUSTA,C
btfsc Device24,atsda
bsf ALUSTA,C
rlcf WREG,W
bcf Device24,atslk
decfsz TempTemp,F
goto GetLop
return
;===========------------=============------------===================----
GetAck24:
movlw WRITECONST
iorwf PECONL,F
call DelaySame
bcf Device24,atsda
call DelaySame
bsf Device24,atslk
call DelaySame
bcf Device24,atslk
movlw READCONST
andwf PECONL,F
return
;===========------------=============------------===================----
NoGetAck24:
bsf Device24,atsda
call DelaySame
bsf Device24,atslk
call DelaySame
bcf Device24,atslk
call DelaySame
return
;===========------------=============------------===================----
SendAck24:
movlw READCONST
andwf PECONL,F
call DelaySame
bsf Device24,atslk
call DelaySame
bsf Device24,atsda
nop
nop
clrf TempTemp,F
movlw 0
loplop1:
nop
nop
btfss Device24,atsda
goto AcceptAckOk
decfsz WREG,W
goto loplop1
decfsz TempTemp,F
goto loplop1
bsf ALUSTA,C
goto AcceptNoAck
AcceptAckOk:
bcf ALUSTA,C
AcceptNoAck:
bcf Device24,atslk
call DelaySame
movlw WRITECONST
iorwf PECONL,F
return
;;===========------------=============------------===================---------
;wite (Data24x1_BK2,Data24x2_BK2) to address(HighAddr24X_BK2,LowAddr24x_BK2)
;;===========------------=============------------===================---------
WriteTwoByte:
IF 0
call Start24
BANK 2
movlw 0a0h
rrcf WREG,W
iorwf HighAddr24X_BK2,W
bcf ALUSTA,C
rlcf WREG,W
BANK 0
call SendOutByte
call SendAck24
BANK 2
movfp LowAddr24x_BK2,WREG
BANK 0
call SendOutByte
call SendAck24
BANK 2
movfp Data24x1_BK2,WREG
BANK 0
call SendOutByte
call SendAck24
BANK 2
movfp Data24x2_BK2,WREG
BANK 0
call SendOutByte
call SendAck24
call Stop24
ENDIF
return
;;===========------------=============------------===================---------
;write (Data24x1_BK2,Data24x2_BK2) to address(HighAddr24X_BK2,LowAddr24x_BK2)
;and write two 0xff
;;===========------------=============------------===================---------
WriteOneByte:
call WriteDelay
call Start24
BANK 2
movlw 0a0h
rrcf WREG,W
iorwf HighAddr24X_BK2,W
bcf ALUSTA,C
rlcf WREG,W
BANK 0
call SendOutByte
call SendAck24
BANK 2
movfp LowAddr24x_BK2,WREG
BANK 0
call SendOutByte
call SendAck24
BANK 2
movfp Data24x1_BK2,WREG
BANK 0
call SendOutByte
call SendAck24
call Stop24
BANK 2
incf LowAddr24x_BK2,F
movlw 0
addwfc HighAddr24X_BK2,F
BANK 0
return
;;===========------------=============------------===================---------
;wite Data24x1_BK2 to address(HighAddr24X_BK2,LowAddr24x_BK2)
;;===========------------=============------------===================---------
Write16Byte24:
btfss Task2Flag,HaveDataIn
return
call Write16ByteDelay
btfsc ALUSTA,C
return ;delay un
BANK 3
tstfsz RecordCount_BK3
goto HaveDataWriteIn
BANK 0
goto ThisTimeOver
HaveDataWriteIn: ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -