<br /><br />我用的是HT46R23,這個程序是讀寫EEPRPM 24C16,用的是IIC來做,在用STEP OVER按鍵時讀出的數據是正確。但按下F5(全速)時讀出的數據就不正確了。高手指點。。。<br /><br /><br /><br />main{<br /> _clrwdt();<br /> writer_eeprom(0xa0,0x00,0x8a,0x05); //連繼寫5個數據,地址00,<br /><br /> read_eeprom(0xa0,0x00,0x07); //read 5 datas ,addr=00 <br /> }<br />}<br />//************************************<br />// writer_eeprom<br />//************************************ <br />void writer_eeprom(unsigned char pag,unsigned char eeprom_addr,unsigned eeprom_data,unsigned char eeprom_cnt)<br />{<br /> unsigned char i,data;<br /> eeprom_star();<br /> eeprom_send(pag|=write_comm);<br /> answer_ack();<br /> eeprom_send(eeprom_addr);<br /> answer_ack();<br /> for(i=0;i<eeprom_cnt;i++){<br /> eeprom_send(eeprom_data);<br /> answer_ack();<br /> }<br /> eeprom_stop();<br />}<br />//************************************<br />// read_eeprom<br />//************************************ <br />void read_eeprom(unsigned char pag,unsigned char eeprom_addr,unsigned char eeprom_cnt){<br /> unsigned char i ;<br /> eeprom_star();<br /> eeprom_send(pag|=write_comm);<br /> answer_ack();<br /><br /> eeprom_send(eeprom_addr);<br /> answer_ack();<br /> eeprom_star();<br /> eeprom_send(read_comm);<br />answer_ack();<br /> for(i=0;i<eeprom_cnt;i++){<br /> eeprom_read();<br /> eeprom_congregate=eeprom_da;<br /> }<br /> eeprom_stop();<br />}<br />//************************************<br />// eeprom_read<br />//************************************ <br />void eeprom_read(){<br /> unsigned char i,data;<br /> eeprom_da=0;<br /> rom_sda_c=1;<br /> for(i=0;i<8;i++){<br /> rom_clk=1;<br /> _c=0; <br /> if(rom_sda)_c=1;<br /> _rlc(&eeprom_da);<br /> rom_clk=0;<br /> }<br /> rom_sda_c=0;<br /> _nop();<br /> rom_sda=0;<br />rom_clk=1;<br /> _nop();<br /> _nop();<br /> rom_clk=0;<br />}<br />//************************************<br />// eeprom_star<br />//************************************ <br />void eeprom_star(){<br /> rom_clk=1;<br /> _nop();<br /> _nop();<br /> rom_sda=1;<br /><br /> _nop();<br /> _nop();<br /> rom_sda=0;<br /> _nop();<br /> _nop();<br /> _nop();<br /> rom_clk=0;<br />} <br />//************************************<br />// eeprom_stop<br />//************************************ <br />void eeprom_stop(){<br /> rom_sda=0;<br /> _nop();<br /> _nop();<br /> rom_clk=1;<br /> _nop();<br /> _nop();<br /> rom_sda=1;<br /> _nop();<br /> _nop();<br /> rom_clk=0;<br />} <br />//************************************<br />// eeprom_send<br />//************************************ <br />void eeprom_send(unsigned char eeprom_data_buff){<br /> unsigned char i;<br /> for(i=0;i<8;i++){<br /> _rlc(&eeprom_data_buff);<br /> if(_c)rom_sda=1;<br /> else rom_sda=0;<br /> rom_clk=1;<br /> _nop();<br /> rom_clk=0;<br /> }<br />}<br />//************************************<br />// answer_ack<br />//************************************ <br />void answer_ack(){<br /> rom_sda=0;<br /> _nop(); <br /> rom_sda_c=1;<br /> _nop();<br /> rom_clk=1;<br />wait_ack:<br /> if(rom_sda)goto wait_ack;<br /> rom_sda_c=0;<br /> rom_clk=0;<br />}<br /> |
|