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

📄 i2cwire.h

📁 mcs51系列单片机常用芯片使用头文件(包含MAX7219,DS18B20,DS1302,AT93C46,IC电话卡
💻 H
字号:
/*******************************************************************************
*  标题:  I2Cwire头文件                                                        *
*  日期:  2007-3-25                                                            *
*  版本:  1.0                                                                  *
*  作者:  无名                                                                 *
*  邮箱:  djrljf@163.com                                                       *
*  QQ  : 403499014                                                            *
********************************************************************************
********************************************************************************
* 【版权】 Copyright(C)无名        All Rights Reserved                         *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#ifndef	_I2Cwire_H 				     // 防止_I2Cwire_H被重复引用

#define	_I2Cwire_H
#include "at89x52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

//==============================================================
#define clk P1_2                     //I2C时钟线默认P1.2口,需要时修改该配置
#define sda P1_3                     //I2C数据线默认P1.3口,需要时修改该配置

#define rCommand  0xa1               //读命令 A0 A1 A2均接地,需要时修改该配置
#define wCommand  0xa0               //写命令 A0 A1 A2均接地,需要时修改该配置
//==============================================================


//==============================================================
//起始信号,激活IIC总线器件;
//==============================================================
void begin()                         
     {
	 sda=1;                          //数据线置1   
	 _nop_();                        //延时一个机器周期
	 clk=1;                          //时钟线置1
     _nop_();
	 sda=0;                          //数据线置0
     _nop_();
	 clk=0;
	 }

//==============================================================
//停止信号
//==============================================================
void end()                           
     {
	 sda=0;
	 clk=1;
	 _nop_();
	 sda=1;
	 }

//==============================================================
//应答信号
//==============================================================
void answer()                        
     {
	 sda=0;
	 _nop_();
	 clk=1;
	 _nop_();
	 clk=0;
	 }

//==============================================================
//等待从机的应答信号
//==============================================================
void waiting()                       
     {
	 clk=1;
	 while(sda);
	 clk=0;
	 }

//==============================================================
//写时序
//==============================================================
void write(uchar temp)              
     {
	 uchar i;
	 for(i=0;i<8;i++)
	    {if((temp&0x80)==0x80)sda=1;//从最高位开始写
		 else sda=0;
		 temp=(temp<<1);
		 clk=1;
		 _nop_();
		 clk=0;                    //每次都以CLK为0结束 SDA不定
		}
	 }

//==============================================================
//读时序
//==============================================================
uchar read()                       
     {
	 uchar i,temp=0;
     for(i=0;i<8;i++)
	    {
		clk=1;
		temp=(temp<<1)|sda;
		clk=0;
		}
     answer();
	 return temp;                 //返回一个无符号字符型数
	 }

//==============================================================
//写一个字节到指定地址
//==============================================================   
	 
extern void write1Word(uchar addr,uchar temp)
     {
	 begin();
	 write(wCommand);
     waiting();
	 write(addr);
	 waiting();
	 write(temp);
	 waiting();
	 end();
	 }


//==============================================================
//连续写n个字节到以ADDR开始的连续空间里
//==============================================================
extern void writeMultiWord(uchar addr,uint n,uchar *word)
     {
	 uchar i;
	 begin();
	 write(wCommand);
     waiting();
	 write(addr);
	 waiting();
	 for(i=0;i<n;i++)
	    {
	    write(*(word+i));
	    waiting();
		}
	 end();
     }

//==============================================================
//在以ADDR开始的空间内连续读取N个数据
//==============================================================
extern uchar read1Word(uchar addr)
     {
	 begin();
	 write(wCommand);
     waiting();
	 write(addr);
	 waiting();
	 begin();
	 write(rCommand);
	 waiting();
	 return read();
     end();
	 }

//==============================================================
//在以ADDR开始的空间内连续读取N个数据
//==============================================================
extern uchar readMultiWord(uchar addr,uint n)
     {
	 uchar i;
	 begin();
	 write(wCommand);
     waiting();
	 write(addr);
	 waiting();
	 begin();
	 write(rCommand);
	 waiting();
	 for(i=0;i<n;i++)
	    {
	    return read();
	    if(i<(n-1))
		   answer();
        }
	 end();
	 }
#endif

⌨️ 快捷键说明

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