9810956 发表于 2004-11-2 14:28:34

上传一个软件模拟的I2C C程序给在家

在ICC AVR6.30 AVRSTUDIO JIAGICE II M162 上调试通过







#define SCLA5

#define SDA   6



/*读fm24cl16 读n字节子程式*/

/*读字节数,存数据起始位置,页地址,读地址*/

void fm24cl16_read(unsigned char r_byte_d,unsigned char sav_bit,unsigned char page_adder,unsigned char read_adder)

{

unsigned char cont;

WDR();

fm24cl16_start_bit();

fm24cl16_txce_byte(page_adder);

fm24cl16_txce_byte(read_adder);

fm24cl16_start_bit();

setbit(page_adder,0);

fm24cl16_txce_byte(page_adder);

WDR();

for(cont=1;cont<r_byte_d;++cont)

   {

    temp_data=fm24cl16_rece_byte();

        ++sav_bit;

        setbit(DDRB,SCLA);

        setbit(DDRB,SDA);

        WDR();

        NOP();

        NOP();

        clrbit(PORTB,SDA);

        NOP();

        NOP();

        NOP();

        setbit(PORTB,SCLA);

        NOP();

        NOP();

        NOP();

        clrbit(PORTB,SCLA);

        NOP();

   }

temp_data=fm24cl16_rece_byte();

++sav_bit;

setbit(DDRB,SCLA);

setbit(DDRB,SDA);

WDR();

NOP();

NOP();

setbit(PORTB,SDA);

clrbit(PORTB,SCLA);

NOP();

NOP();

NOP();

setbit(PORTB,SCLA);

NOP();

NOP();

NOP();

clrbit(PORTB,SCLA);

NOP();

fm24cl16_stop_bit();

}

/*写fm24cl16 n字节子程式*/

/*发送字节数,发送数据的起始位,页地址,写地址*/

void fm24cl16_writ(unsigned char t_byte_d,unsigned char sent_bit,unsigned char page_adder,unsigned char writ_adder)

{

unsigned char cont,sent_cont;

WDR();

sent_cont=sent_bit;

fm24cl16_start_bit();

fm24cl16_txce_byte(page_adder);

fm24cl16_txce_byte(writ_adder);

for(cont=1;cont<=t_byte_d;++cont)

   {

    fm24cl16_txce_byte(temp_data);

        ++sent_cont;

   }

fm24cl16_stop_bit();

}

void fm24cl16_txce_byte(unsigned char sentdata) /*铁电存贮器单字节发送*/

{

unsigned char cont;

WDR();

for(cont=1;cont<=8;++cont)

   {

    setbit(DDRB,SDA);

        setbit(DDRB,SCLA);

        if(testbit(sentdata,7)) setbit(PORTB,SDA);

        else clrbit(PORTB,SDA);

        setbit(PORTB,SCLA);

        NOP();

        NOP();

        NOP();

        clrbit(PORTB,SCLA);

        NOP();

        sentdata=sentdata<<1;

   }

clrbit(DDRB,SDA);

WDR();

NOP();

NOP();

timer0=0;

TCCR0=5;          /*开定时器0*/

do

   {

    clrbit(PORTB,SCLA);

        NOP();

        NOP();

        WDR();

        setbit(PORTB,SCLA);

        if(timer0==10)         /*延时708mS 检测定时器是否是长时间没有应答位产生*/

       {

          ;          /*数据错误标识*/

          WDR();

          break;

       }

        }

while(testbit(PINB,SDA));

TCCR0=0;

clrbit(PORTB,SCLA);

}

unsigned char fm24cl16_rece_byte() /*铁电存贮器单字节接收*/

{

unsigned char rxdata,cont;

WDR();

rxdata=0;

clrbit(DDRB,SDA);

for(cont=1;cont<=8;++cont)

   {

    rxdata=rxdata<<1;

        setbit(PORTB,SCLA);

        NOP();

        NOP();

        NOP();

        if(testbit(PINB,SDA)) setbit(rxdata,0);

        clrbit(PORTB,SCLA);

        NOP();

   }

return rxdata;

}

void fm24cl16_start_bit(void)/*铁电存贮器的起始位*/

{

WDR();

setbit(DDRB,SCLA);

setbit(DDRB,SDA);

NOP();

NOP();

NOP();

setbit(PORTB,SDA);

setbit(PORTB,SCLA);

NOP();

NOP();

NOP();

clrbit(PORTB,SDA);

NOP();

NOP();

NOP();

clrbit(PORTB,SCLA);

NOP();

}

void fm24cl16_stop_bit(void)/*铁电存贮器的停止位*/

{

WDR();

setbit(DDRB,SDA);

setbit(DDRB,SCLA);

NOP();

NOP();

NOP();

clrbit(PORTB,SDA);

setbit(PORTB,SCLA);

NOP();

NOP();

NOP();

setbit(PORTB,SDA);

NOP();

NOP();

NOP();

clrbit(PORTB,SCLA);

NOP();

setbit(PORTB,SCLA);

}

armok 发表于 2004-11-2 16:38:20

9810956 发表于 2004-11-3 07:02:56

实物图因现没有数码相机,我这是一个无线数据远传装置, 用PIC16F76*2的方案在天津运行八个月没有发现任何问题,用M162还用一小部分新增功能没有完成先,完成了再整理上传.

armok 发表于 2004-11-3 07:37:57

sunke9 发表于 2008-8-23 09:42:19

楼主:好人啊,我的EEPROM板子画错了,只能用这软件仿了.

黑夜之狼 发表于 2014-4-7 16:44:05

这可是十年前的帖子啊
页: [1]
查看完整版本: 上传一个软件模拟的I2C C程序给在家