16F877A的EEPROM读写问题

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

结果

这是我用串口调试助手收到的结果
庄庄 发表于 2008-11-19 13:21 | 显示全部楼层

有可能是通信波特率的问题

建议你检查通信程序,晶振是内部,还是外部,一般读写不会出错
headwolf 发表于 2008-11-19 17:29 | 显示全部楼层

EE区写代码错了。

&nbsp;BSF&nbsp;&nbsp;&nbsp;&nbsp;EECON1,WR&nbsp;&nbsp;&nbsp;&nbsp;;开始写入<br /><br />&nbsp;BCF&nbsp;&nbsp;&nbsp;&nbsp;EECON1,WREN&nbsp;&nbsp;&nbsp;;写保护<br />代码有问题。WREN不是什么写保护位,是写使能位,都还没写完就清掉.
bobo1957 发表于 2008-11-28 15:32 | 显示全部楼层

必须按照芯片时序来做

microchip官网专门有EEprom的文档,看看基本就没有问题了。时序必须是datasheet上面的、控制寄存器位要认真看看什么意思
bobo1957 发表于 2008-12-17 23:56 | 显示全部楼层

你怎么知道写入对了读出没有对呢

  
洪七公 发表于 2008-12-20 21:30 | 显示全部楼层

16F877A的EEPROM读写宏定义

;HotPower&nbsp;2005.3.25<br />;读取EEPROM函数READEEPROM()<br />;-------读取EEPROM函数READEEPROM()-------------<br />;读取eeprom函数Readeeprom()-------------<br />#define&nbsp;ReadeepromByte(ADDR,DATA)&nbsp;Procedure_ReadeepromByte&nbsp;ADDR,DATA<br />Procedure_ReadeepromByte&nbsp;MACRO&nbsp;ADDR,DATA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;&nbsp;start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifndef&nbsp;&nbsp;Function_Readeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;Function_Readeeprom&nbsp;Function_Readeeprom_Call_Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;&nbsp;&nbsp;&nbsp;start<br />Function_Readeeprom_Call_Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBANKSEL&nbsp;EECON1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,EEPGD;选中EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,RD;读EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endif<br />start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVal(EEADR,ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;&nbsp;Function_Readeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(DATA,EEDATA);<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDM<br /><br />#define&nbsp;ReadeepromWord(ADDR,DATA)&nbsp;Procedure_ReadeepromWord&nbsp;ADDR,DATA<br />Procedure_ReadeepromWord&nbsp;MACRO&nbsp;ADDR,DATA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;&nbsp;start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifndef&nbsp;&nbsp;Function_Readeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;Function_Readeeprom&nbsp;Function_Readeeprom_Call_Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;&nbsp;&nbsp;&nbsp;start<br />Function_Readeeprom_Call_Address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBANKSEL&nbsp;EECON1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,EEPGD;选中EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,RD;读EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endif<br />start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVal(EEADR,ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;&nbsp;Function_Readeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(DATA,EEDATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IncByte(EEADR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;&nbsp;Function_Readeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(DATA+1,EEDATA);<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDM<br />;-------写入EEPROM函数READEEPROM()-------------<br />#define&nbsp;WriteeepromByte(ADDR,DATA)&nbsp;Procedure_WriteeepromByte&nbsp;ADDR,DATA<br />Procedure_WriteeepromByte&nbsp;MACRO&nbsp;ADDR,DATA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IFNDEF&nbsp;&nbsp;Function_Writeeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;Function_Writeeeprom&nbsp;Function_Writeeeprom_Call_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;&nbsp;&nbsp;&nbsp;start<br />Function_Writeeeprom_Call_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBANKSEL&nbsp;EECON1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,EEPGD;选中EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MACRO_ROMWRITE_COMMAND<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDIF<br />start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVal(EEADR,ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(EEDATA,DATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;Function_Writeeeprom<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDM&nbsp;<br /><br />#define&nbsp;WriteeepromWord(ADDR,DATA)&nbsp;Procedure_WriteeepromWord&nbsp;ADDR,DATA<br />Procedure_WriteeepromWord&nbsp;MACRO&nbsp;ADDR,DATA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IFNDEF&nbsp;&nbsp;Function_Writeeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;Function_Writeeeprom&nbsp;Function_Writeeeprom_Call_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;&nbsp;&nbsp;&nbsp;start<br />Function_Writeeeprom_Call_Addr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBANKSEL&nbsp;EECON1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON1,EEPGD;选中EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MACRO_ROMWRITE_COMMAND<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDIF<br />start<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVal(EEADR,ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(EEDATA,DATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;Function_Writeeeprom<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IncByte(EEADR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteVar(EEDATA,DATA+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;&nbsp;Function_Writeeeprom<br />&nbsp;&nbsp;MainCbanksel&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDM&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部