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

📄 i2c.c

📁 通过车载终端采集GPS数据
💻 C
字号:
#include "i2c.h"
#include <intrins.h>
#include "w77e532.h"
/*SDA P4_2 SCL P4_3 WP P4_0*/
/*#define SDA     P1_0
#define SCL     P1_1
extern Uchar volatile xdata D12_Y5;
extern idata Uchar D18CS;//代替WP的作用*/
#define SDA_ON P4|=0x4//SDA=1
#define SDA_OFF P4&=0xb//SDA=0
//#define IIC_CLOCK_HIGH       SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_()
//#define IIC_CLOCK_LOW        SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();_nop_()
#define IIC_CLOCK_HIGH       P4&=0x7;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P4|=0x8;_nop_();_nop_()
#define IIC_CLOCK_LOW        P4|=0x8;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P4&=0x7;_nop_();_nop_()

unsigned char sda_equalzero()
{
    char P4_reg;
    P4_reg = P4;
    P4_reg &= 0x4;
    if (0 == P4_reg)
        return 1;
    else
        return 0;
}

void i2c_wp(char flag)
{
    if( flag )
        //WP = 1;
        P4 |= 0x1;
    else
        //WP = 0;
        P4 &= 0xe;
}

/***************i2c起始位************************/
void i2c_start(void)
{
    IIC_CLOCK_HIGH;
    //SDA=1;
    SDA_ON;
    _nop_();
    _nop_();
    _nop_();
    //SDA=0;
    SDA_OFF;
    _nop_();
    _nop_();  
    IIC_CLOCK_LOW;
}

/***************i2c停止位********************/
void i2c_stop(void)
{
    //SDA=0;
    SDA_OFF;
    _nop_();
    _nop_();
    IIC_CLOCK_HIGH;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    //SDA=1;
    SDA_ON;
}

/***************i2c等应答函数******************/

char i2c_get_ack(void)
{   
    //SDA=1;
    SDA_ON;
    _nop_(); 
    _nop_();
    IIC_CLOCK_HIGH;

 /*   if( SDA == 0 )
    {
        IIC_CLOCK_LOW; 
        return OK;
    }
    else
    {
        IIC_CLOCK_LOW; 
        return ERROR;
    } */
    if( 1 == sda_equalzero() )
    {
        IIC_CLOCK_LOW; 
        return OK;
    }
    else
    {
        IIC_CLOCK_LOW; 
        return ERROR;
    }
}

/*主机发应答,连续读数据用*/
void i2c_send_ack(void)
{
 //   SDA=0;
    SDA_OFF;
    _nop_();
    IIC_CLOCK_LOW;

 //   SDA=1;                  /*释放总线给24C16*/
    SDA_ON;
}

/*无需应答位 noack*/
void i2c_send_no_ack(void)
{
 //   SDA=1;
    SDA_ON;
    _nop_();
    IIC_CLOCK_LOW;
}
/***************写i2c******************/
void i2c_writeByte(unsigned char dat)
{
    char i;
    unsigned char temp;

    temp = dat;
    for(i=0;i<8;i++)
    {
        if(temp & 0x80)
        {
          //  SDA=1;
            SDA_ON;
        }
        else
        {
         //   SDA=0;
            SDA_OFF;
        }
  
        temp <<= 1;
        IIC_CLOCK_LOW; 
    }
}

/***************读i2c************************/
char i2c_readByte(void)
{
    unsigned char dat;
    unsigned char i;
    
    i = 8;
    dat = 0x00;
    while(i--)
    {
        dat <<= 1;
        IIC_CLOCK_HIGH;
//        if(SDA)
        if (0 == sda_equalzero())
            dat |= 0x01;
    }  
    IIC_CLOCK_LOW;  

    return dat;
}

⌨️ 快捷键说明

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