#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