- ;****************************************************************************************
- ; This is a program to test the function of reading&writting for EEPROM.
- ; You can observe the value of register(30H--?) buy changing "VALU" and "WRC_".
- ; Notice that:it must be { ADDR WRC_<=0ffh } !
- ; Written by Yamato.:)
- ;****************************************************************************************
- include "p16f877.inc"
- ADDR EQU 20H ;写入地址寄存器
- VALU EQU 21H ;写入值
- REC_ EQU 22H ;读计数
- WRC_ EQU 24H ;写计数
- org 0
- goto main
- main
- bcf STATUS,RP1
- bcf STATUS,RP0 ;bank0
- movlw 10h
- movwf ADDR ;写入EEPROM初始值
- movlw 90h
- movwf VALU ;初始写入值
- movlw 30h
- movwf FSR ;间址,读出值初始存放地址
- movlw 0Fh
- movwf WRC_ ;写入次数
- movwf REC_
- ;incf REC_ ;读出次数
- wri_ ;写子程序
- bsf STATUS,RP1
- bsf STATUS,RP0 ;bank3
- btfsc EECON1,WR
- goto $-1
- bcf STATUS,RP0
- bcf STATUS,RP1 ;bank0
- movf ADDR,W
- bsf STATUS,RP1 ;bank2
- movwf EEADR
- bcf STATUS,RP1 ;bank0
- movf VALU,W
- bsf STATUS,RP1 ;bank2
- movwf EEDATA
- bsf STATUS,RP0 ;bank3
- bcf EECON1,EEPGD ;to data memory
- bsf EECON1,WREN
- bcf INTCON,GIE
- movlw 55h
- movwf EECON2
- movlw 0aah
- movwf EECON2
- bsf EECON1,WR
- btfsc EECON1,WR
- goto $-1
- bsf INTCON,GIE
- bcf EECON1,WREN
- bcf STATUS,RP0
- bcf STATUS,RP1 ;bank0
- incf ADDR,1
- decf VALU,1
- decfsz WRC_ ;all write,to read_
- goto wri_
- read_ ;读子程序
- bcf STATUS,RP1
- bcf STATUS,RP0 ;bank0
- decf ADDR ;next value
- movf ADDR,W
- bsf STATUS,RP1 ;bank2
- movwf EEADR
- bsf STATUS,RP0 ;bank3
- bcf EECON1,EEPGD
- bsf EECON1,RD
- bcf STATUS,RP0 ;bank2
- movf EEDATA,W
- bcf STATUS,RP1 ;bnak0
- movwf INDF ;存读出值
- incf FSR
- decfsz REC_
- goto read_
- goto main
- end
EEw&r.asm程序说明:
1、 本程序是对PIC16F877芯片的EEPROM数据区进行读写的演示程序;
2、 wri_为写入数据子程序,该子程序从ADDR寄存器确定的地址开始对EEPROM数据区写入(范例从10H开始),每进行一次写操作将使ADDR值加一;写入数据的初始值由VALU寄存器给定(范例值为90H),每进行一次写操作将使VALU值减一;写入规定个数(由WRC_寄存器给定,范例值为 0FH)的数值后,结束写入,转至read_。
3、 read_为读出数据子程序,该子程序从ADDR寄存器当前值确定的地址开始对EEPROM数据区读出(当前值=ADDR WRC_<=0FFH),每进行一次读操作将使ADDR值减一;读出数据后程序将把该数据存入通用寄存器中,开始存放的地址由FSR的值指定(范例为30H),每进行一次读操作将使FSR的值加一;读出规定个数(由寄存器REC_给定,范例值为0FH)的数值后,结束读出,回main。