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

📄 iic_d.c

📁 通过键盘输入电子密码锁密码
💻 C
字号:
/********************************************************************************
*  描述:                                                                       *
*                IIC(24C02)程序模块                                            *
*                                                                              *
*******************************************************************************/
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#include<DEFINE.h>

#define uchar  unsigned char
#define uint   unsigned int

/* iic延时       */
void iic_wait(void)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/* 开启iic总线   */
void iic_start(void)
{
    SDA = 1;
    SCL = 1;
    iic_wait();
    SDA = 0;
    iic_wait();
    SCL = 0;
}

/* 关闭iic总线   */
void iic_stop(void)
{
    SDA=0;
    SCL=0;
    iic_wait();
    SCL=1;
    iic_wait();
    SDA=1;
}

/* 发送ACK信号   */
void iic_ack(void)
{
    SDA=0;
    iic_wait();
    SCL=1;
    iic_wait();
    SCL=0;
}

/* 发送NOACK信号 */
void iic_no_ack(void)
{
    SDA=1;
    iic_wait();
    SCL=1;
    iic_wait();
    SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功    能:等待ACK信号
说    明:
调    用:
入口参数:
出口参数:1-ACK         0-ERROR 
*********************************************************************/
bit iic_wait_ack(void)
{
    uchar errtime=255;
    //uint errtime = 1000;

    SDA=1;
    iic_wait();
    SCL=1;
    iic_wait();

    while(SDA)
    {
        errtime--;
        if(!errtime)
            return 0;
    }

    SCL=0;
    return 1;
}
/********************************************************************
函 数 名:iic_send_byte 
功    能:MCU向iic设备发送一个字节
说    明:
调    用:
入口参数:sbyte                  待发送的字节数据
出口参数:
*********************************************************************/
void iic_send_byte(uchar sbyte)
{
    uchar i = 8;

    while(i--)
    {
        SCL = 0;
        _nop_();
        SDA = (bit)(sbyte&0x80);
        sbyte <<= 1;
        iic_wait();
        SCL = 1;
        iic_wait();
    }

    SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte 
功    能:MCU从iic设备接收一个字节
说    明:
调    用:
入口参数:
出口参数:ddata   接收数据 
*********************************************************************/
uchar iic_receive_byte(void)
{
    uchar i=8;
    uchar ddata=0;

    SDA=1;
    while(i--)
    {
        ddata <<= 1;
        SCL=0;
        iic_wait();
        SCL=1;
        iic_wait();
        ddata |= SDA;
    }
    SCL=0;
    return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功    能:向iic设备写入N个字节
说    明:
调    用:
入口参数:write_data              存放写入字节的数组   
          address                 指定从address处开始写入
          num                     写入的字节数
出口参数:
*********************************************************************/
void write_iic_data(uchar write_data[], uchar address, uchar num)
{
    uchar n;

    iic_start();
    iic_send_byte(0xa0);
    iic_wait_ack();
    iic_send_byte(address);
    iic_wait_ack();
    


    for(n=0; n<num; n++)
    {
        iic_send_byte(write_data[n]);
        iic_wait_ack();
    }

    iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功    能:从iic设备读取N个字节  
说    明:
调    用:
入口参数:read_data               存放读取字节的数组   
          address                 指定从address处开始读取
          num                     读取的字节数
出口参数:
*********************************************************************/
void read_iic_data(uchar read_data[], uchar address, uchar num)
{
    uchar n;
    uchar *pread_data;
    pread_data = read_data;
    iic_start();
    iic_send_byte(0xa0);
    iic_wait_ack();
    iic_send_byte(address);
    iic_wait_ack();
 


    iic_start();
    iic_send_byte(0xa1);
    iic_wait_ack();

    for (n=0; n<num; n++)
    {
    	*pread_data = iic_receive_byte();
    	pread_data++;

    	if (n != (num - 1))     //最后一个数据不应答
    	{
    	    iic_ack();
    	}
    }

    iic_no_ack();
    iic_stop();
}

⌨️ 快捷键说明

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