最近尝试着使用EEPROM进行读写,但是不管怎么修改,发现写入EEPROM正常,但是读取的时候不正常。<br /><br />我的程序思路是依次将 69H 96H 5AH这三个数依次写入EEPROM内的20H,21H,22H,每次都将写入的数发送出来,写完发送0F5H;然后再依次读出来,每读完一个地址都发送读出的数据,读完后发送0F6H。<br /><br />但是读出来的结果始终是5A 5A 5A,而不是69 96 5A,改了好几天都没效果,请各位大侠指点下。<br /><br />我试过读数的时候每次将EEADR的值发送出来,发现每次都是00H,不知是什么原因,而我程序里面设置了它累加的<br /><br /><br />#include <P16F877A.INC><br /> list p=16F877A,r=HEX<br />;clock is 4MHz<br />;Set Configuration Word: crystal oscillator XT, WDT off, <br />; power-up timer on, code protect off, LV Program on.<br /> __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CPD_ON<br /><br />DATAA equ 73h<br />DATAB equ 74h<br />DATAC equ 75h<br />CNT equ 76h<br /><br />;*************************************************** <br /> ORG 0000H<br /> NOP<br /> GOTO MAIN<br />;************************************************** <br />MAIN<br /> CALL INITIAL <br />LOOP <br /> CALL EEPW1<br /> CALL EEPR1<br /> GOTO $ <br /><br />;****************************************************<br />INITIAL <br /> BSF STATUS,RP0 ;选体1<br /> MOVLW 19H ;9600波特率<br /> MOVWF SPBRG<br /> MOVLW 80H ;使能RC6 RC7<br /> MOVWF TRISC<br /> MOVLW 0X04 ;选择异步高速方式传输8位数据<br /> MOVWF TXSTA<br /> <br /> BCF STATUS,RP0 <br /> MOVLW B'10010000' ;允许同步串行口工作,连续接收<br /> MOVWF RCSTA <br /> CLRF PORTC ;清PORT<br /><br /> MOVLW 69H<br /> MOVWF DATAA<br /> MOVLW 96H<br /> MOVWF DATAB<br /> MOVLW 5AH<br /> MOVWF DATAC<br /><br /> RETURN<br />;***************************************************<br />EEPW1 ;存储状态到1号位置<br /> <br /> MOVLW D'03'<br /> MOVWF CNT<br /> MOVLW DATAA<br /> MOVWF FSR<br /> <br /> BSF STATUS,RP1<br /> BCF STATUS,RP0 ;选择BANK2<br /> MOVLW 20H ;将目标地址1写入EEADR<br /> MOVWF EEADR<br />LOOP1 BSF STATUS,RP1<br /> BSF STATUS,RP0 ;选定BANK3<br /> CLRF EECON1<br /> BTFSC EECON1,WR ;检测WR是否为1,是1则跳转<br /> GOTO $-1 <br /> BCF STATUS,RP0<br /> MOVF INDF,W<br /> MOVWF EEDATA<br /> BSF STATUS,RP0 ;选择BANK3<br /> BCF EECON1,EEPGD ;指定数据存储器为写操作对象<br /> BSF EECON1,WREN ;放开写操作使能位<br /> BCF INTCON,GIE ;禁止所有中断<br /><br /> MOVLW 0x55 ;此段为固定的验证程序<br /> MOVWF EECON2<br /> MOVLW 0xAA<br /> MOVWF EECON2<br /> BSF EECON1,WR ;开始写入<br /><br /> BCF EECON1,WREN ;写保护<br /> BTFSC EECON1,WRERR<br /> GOTO LOOP1<br /> INCF FSR,F<br /> BCF STATUS,RP0<br /> INCF EEADR,F<br /><br /> BANKSEL EEDATA<br /> MOVF EEDATA,W<br /> BANKSEL TXREG<br /> MOVWF TXREG<br /> CALL TX<br /> DECFSZ CNT,F<br /> GOTO LOOP1<br /> BSF INTCON,GIE ;开放中断<br /> BANKSEL TXREG<br /> MOVLW 0F5H<br /> MOVWF TXREG<br /> CALL TX<br /> RETURN<br />;*********************************************<br />EEPR1 ;读取1号位置状态<br /> MOVLW D'03'<br /> MOVWF CNT<br /> MOVLW DATAA<br /> MOVWF FSR <br /><br /> BSF STATUS,RP1 <br /> BCF STATUS,RP0 ;选择BANK2<br /> MOVLW 20H<br /> MOVWF EEADR <br />LOOPR1 <br /> BSF STATUS,RP1<br /> BSF STATUS,RP0<br /> BCF EECON1,EEPGD ;指定数据存储器为读操作对象<br /> BSF EECON1,RD ;启动一次读操作<br /> BCF STATUS,RP0 ;选择BANK2<br /> MOVF EEDATA,W ;将EEDATA中的数据转移到W<br /> MOVWF INDF<br /> BANKSEL TXREG<br /> MOVWF TXREG<br /> CALL TX<br /> BANKSEL EEADR<br /> INCF FSR,F<br /> INCF EEADR,F <br /> DECFSZ CNT,F<br /> GOTO LOOPR1<br /> BCF STATUS,RP1 ;选择BANK0 <br /> MOVLW 0F6H<br /> MOVWF TXREG<br /> CALL TX<br /> RETURN<br />;***************************************************<br />TX <br /> BSF STATUS,RP0 <br /> BSF TXSTA,TXEN ;发送允许<br /> BCF STATUS,RP0 <br /> BTFSS PIR1,TXIF <br /> GOTO $-1<br /> RETURN<br /><br /><br /> end |
|