⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.h

📁 16个单片机c语言实验程序
💻 H
字号:
//i2c通信子程序

//初始化
void i2c_init()
{
    DDRC|=(1<<6);
    PORTC&=~(1<<6); //WP 使能
    TWBR=0x01 ;     //速率=16M/(16+2*16)=33.3k
    TWSR=0x01 ;     //分频因子=4
}

//开始信号
void i2c_start()
{
    TWCR=0xa4 ;
    while(!(TWCR&0x80)); 
}

//写数据
void i2c_wrdata(uchar i2c_data)
{
    TWDR=(i2c_data);
    TWCR=0x84 ;
    while(!(TWCR&0x80));
}

//读数据noack
uchar i2c_redata()
{
    uchar i2c_data ;
    TWCR=0x84 ;
    while(!(TWCR&0x80));
    i2c_data=TWDR ;
    return(i2c_data);
}

//读数据ack
uchar i2c_redataack()
{
    uchar i2c_data ;
    TWCR=0xc4 ;
    while(!(TWCR&0x80));
    i2c_data=TWDR ;
    return(i2c_data);
}

//停止信号
void i2c_stop()
{
    TWCR=0x94 ;
}

//i2c的写字节子程序
void i2c_wrbyte(uchar i2c_data,uchar i2c_add)
{
    do 
    {
        i2c_start();
        i2c_wrdata(0xa0);
    }
    while((TWSR&0xf8)!=0x18);     //判断总线是否可以操作   
    i2c_wrdata(i2c_add);
    i2c_wrdata(i2c_data);
    i2c_stop();
}

//i2c的页写子程序
//参数1:要写入的数组指针
//参数2:写入的首地址
//参数3:数组的单元数
void i2c_wrpage(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
{
    uchar i;
    do 
    {
        i2c_start();
        i2c_wrdata(0xa0);
    }
    while((TWSR&0xf8)!=0x18);
    //判断总线是否可以操作
    i2c_wrdata(i2c_add);
    for(i=0;i<i2c_nub;i++)
    {
        i2c_wrdata(*i2c_data++);
    }
    i2c_stop();
}

//i2c读一个字节子程序
uchar i2c_rebyte(uchar i2c_add)
{
    uchar i2c_data ;
    do 
    {
        i2c_start();
        i2c_wrdata(0xa0);
    }
    while((TWSR&0xf8)!=0x18);
    //判断总线是否可以操作
    i2c_wrdata(i2c_add);
    i2c_start();
    i2c_wrdata(0xa1);
    i2c_data=i2c_redata();
    i2c_stop();
    return(i2c_data);
}

//i2c连续读子程序
//参数1:16位地址
//参数2:读取字节数  注:<=64
//读出的数据只能从全局数组变量获得
void i2c_rese(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
{
    uchar i;
    do 
    {
        i2c_start();
        i2c_wrdata(0xa0);
    }
    while((TWSR&0xf8)!=0x18);
    //判断总线是否可以操作
    i2c_wrdata(i2c_add);
    i2c_start();
    i2c_wrdata(0xa1);
    for(i=0;i<(i2c_nub-1);i++)              //少循环一次,留给最后发出no ack信号
    {
        *i2c_data=i2c_redataack();
		i2c_data++;
    }
    *i2c_data=i2c_redata();                 //最后一个字节发出no ack信号
    i2c_stop();
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -