Chinaunix首页 | 论坛 | 博客
  • 博客访问: 801223
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2011-06-28 15:30:05


  • #include     
  •     #include     
  •     #include     
  •     #include     
  •    
  •     #define DELAY_TIME 10    
  •     #define FALSE 0    
  •     #define TRUE 1    
  •     const unsigned char SCL_PIN=0x01;    
  •     const unsigned char SDA_OIN=0x02;    
  •    
  •     static void SET_SCL(void)    
  •     {    
  •         asm{    
  •             mov dx,0x378    
  •             in  ax,dx    
  •             or  ax,SCL_PIN            //将SCL置1    
  •             out dx,ax    
  •         }    
  •     }    
  •    
  •     static void CLR_SCL(void)    
  •     {    
  •         asm{    
  •             mov dx,0x378    
  •             in  ax,dx    
  •             or  ax,0xff-SCL_PIN       //将SCL置0    
  •             out dx,ax    
  •         }    
  •     }    
  •    
  •     static void SET_SDA(void)    
  •     {    
  •         asm{    
  •             mov dx,0x378    
  •             in  ax,dx    
  •             or  ax,SDA_PIN            //将SDA置1    
  •             out dx,ax    
  •         }    
  •     }    
  •    
  •     static void CLR_SDA(void)    
  •     {    
  •         asm{    
  •             mov dx,0x378    
  •             in  ax,dx    
  •             or  ax,0xff-SDA_PIN        //将SDA置0    
  •             out dx,ax    
  •         }    
  •     }    
  •    
  •     void DELAY(int t=DELAY_TIME)      //延时子程序    
  •     {    
  •         for(int i=0;i
  •     }    
  •    
  •     void IIC_Start(void)                   //启动I2C总线    
  •     {    
  •                                        //在SCL为高电平时,使SDA出现一个负跳变    
  •         SET_SDA();    
  •         SET_SCL();    
  •         DELAY();    
  •         CLR_SDA();    
  •         DELAY();    
  •         CLR_SCL();    
  •         DELAY();    
  •     }    
  •    
  •     void IIC_Stop(void)                  //终止I2C总线    
  •     {    
  •                                       //在SCL为高电平时,使SDA出现一个正跳变    
  •         CLR_SDA();    
  •         SET_SCL();    
  •         DELAY();    
  •         SET_SDA();    
  •         DELAY();    
  •         CLR_SCL();    
  •         DELAY();    
  •     }    
  •    
  •     void SEND_0(void)                  //发送BIT0    
  •     {    
  •                                       //在SCL为高电平时,使SDA保持低电平    
  •         CLR_SDA();    
  •         SET_SCL();    
  •         DELAY();    
  •         CLR_SCL();    
  •         DELAY();    
  •     }    
  •    
  •     void SEND_1(void)                 //发送BIT1    
  •     {    
  •                                      //在SCL为高电平时,使SDA保持高电平    
  •         SET_SDA();    
  •         SET_SCL();    
  •         DELAY();    
  •         CLR_SCL();    
  •         DELAY();    
  •     }    
  •    
  •     int Check_Acknowledge(void)    
  •     {    
  •                                      //发送完每个字节检查SLAVE的应答信号    
  •         SET_SDA();                   //主器件释放SDA线    
  •         SET_SCL();    
  •         DELAY(DELAY_TIME/2);    
  •         unsigned char b=inportb(0x378);    //采样信号线    
  •         DELAY(DELAY_TIME/2);    
  •         CLR_SCL();    
  •         DELAY();    
  •         if(b&0xSDA_PIN)               //SALVE返回1    
  •             return FLASE;    
  •         return TRUE;    
  •     }  
  • 阅读(1881) | 评论(0) | 转发(2) |
    0

    上一篇:IIC简单实现!

    下一篇:linux gpio模拟i2c

    给主人留下些什么吧!~~