📄 eeprom.asm
字号:
#include "Project.inc"
udata
EEPROM_ByteCount res 1
EEPROM_ADDRESS res 1
global EEPROM_ByteCount,EEPROM_ADDRESS
global EEPROM_Init,EEPROM_Write,EEPROM_WriteBytes,EEPROM_ReadBytes,EEPROM_Read
flag_ovr udata_ovr ;此伪指令声明开始一段被覆盖的未初始化的数据,此段声明的空间被所有其他同名的 udata_ovr段覆盖。由于它允
;许在同一个存储器单元中声明多个变量,因此这是一种声明临时变量的理想方法。此段不会生成代码。
;应该使用 res 伪指令来为数据保留空间。
flag res 1 ;using bit 1 of flag register
code
-----------------------------------------------
;初始化
-----------------------------------------------
EEPROM.Init
banksel EEDATA
clrf EEDATA
clrf EEADR
clrf EECON1
clrf EECON2
return
---------------------------------------------------------------------------------------------------------------------------------------
; input:
; w:要写入EEPROM的数据
; EEPROM_ADDRESS:写入EEPROM的地址
---------------------------------------------------------------------------------------------------------------------------------------
EEPROM_Write
banksel EEDATA
movwf EEDATA ;
banksel EEADR
movf EEPROM_ADDRESS,w
banksel EEADR
movwf EEADR
EEWRITE2
bsf EECON1,WREN ; 允许写周期
movlw 55H
movwf EECON2 ; Write 55H
movlw 0AAH
movwf EECON2 ; Write AAH
bsf EECON1,WR ; 开始写周期
WR_WAIT
CLRWDT
btfsc EECON1,WR ; Wait for write to complete
goto WR_WAIT
EEWRITE3 ;不使能写EEPROM
bcf EECON1,WREN ; 禁止写周期
banksel EEPROM_ADDRESS
incf EEPROM_ADDRESS,F ; Auto-increase Address Pointer
banksel flag
btfss flag,.1
retlw 0H
goto Return_Write
----------------------------------------------------------------------------------------------------------------------------------
; input:
; w:要写入的字节数
; EEPROM_ADDRESS:要写入EEPROM的初始地址
; FSR:要写入EEPROM的数据在RAM中存放的初始地址
; output:
; flag.0=1表示成功
----------------------------------------------------------------------------------------------------------------------------------
EEPROM_WriteBytes
banksel flag
bsf flag,.1
banksel EEPROM_ByteCount
movwf EEPROM_ByteCount
EEPROM_WriteBytes_Loop
bankisel PORTA
movf INDF,w
goto EEPROM_Write
Return_Write
incf FSR,f
banksel EEPROM_ByteCount
decfsz EEPROM_ByteCount,f
goto EEPROM_WriteBytes_Loop
banksel flag
bcf flag,.1
return
------------------------------------------------------------------------------------------------------------------------------------
; input:
; EEPROM_ADDRESS:要读取EEPROM数据的地址
; output:
; w:读出的数据
--------------------------------------------------------------------------------------------------------------------------------
EEPROM_Read
banksel EEPROM_ADDRESS
movf EEPROM_ADDRESS,w
banksel EEADR
movwf EEADR
bsf EECON1,RD ; Command read
movf EEDATA,w ; Get data
banksel EEPROM_ADDRESS
incf EEPROM_ADDRESS,f ; Auto-increase Address Pointer
banksel flag
btfss flag,.1
return ; Return without changing w-register
goto Return_Read
----------------------------------------------------------------------------------------------------------------------------------
; input:
; w:要读出的字节数
; EEPROM_ADDRESS:要读出值的初始地址
; FSR:要读取EEPROM的数据在RAM中存放的初始地址
;output:
; flag.0=0表示成功
----------------------------------------------------------------------------------------------------------------------------------
EEPROM_ReadBytes
banksel flag
bsf flag,.1
banksel EEPROM_ByteCount
movwf EEPROM_ByteCount
EEPROM_ReadBytes_Loop
goto EEPROM_Read
Return_Read
bankisel PORTA
movwf INDF
incf FSR,f
banksel EEPROM_ByteCount
decfsz EEPROM_ByteCount,f
goto EEPROM_ReadBytes_Loop
banksel flag
bcf flag,.1
;movf EEPROM_ByteCount,w
;subwf FSR,f
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -