上篇:键盘接口软件设计
下篇:C51写的93C46的读写程序

24C01的IIC 读写的c51程序

 

/*------------------------------------------------------------------------------
为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。
   Atmel 24C01 比较特殊,为简约型.
   51晶振为11.0592MHz
〖参考〗http://www.c51bbs.com
〖版本〗V1.00A Build 0918
-----------------------------------------------------------------------------*/


#include "reg51.h"
#include "intrins.h"

sbit SCL= P1^5;
sbit SDA= P1^4;



delay()
{
unsigned int i=1200;
while(i--);
}
/*----------------------------------------------------------------------------
调用方式:write_8bit(unsigned char ch)  ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void  write_8bit(unsigned char ch)
{
    unsigned char i=8;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    while (i--)
    {
   SDA=(bit)(ch&0x80);
   _nop_();_nop_();_nop_();_nop_();_nop_();
   ch<<=1;
   SCL=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   SCL=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
    }
    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

/*------------------------------------------------------------------------------
调用方式:void ACK(void)  ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void ACK(void)
{
   unsigned char time_1;
    SDA=1;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL=1;
    time_1=5;
    while(SDA) {if (!time_1) break;} //ACK
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
}


unsigned char ReadIIC_24C01(unsigned char address)
{
 unsigned char ddata=0;
 unsigned char i=8;

    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;   //START

    write_8bit( (address<<1) | 0x01);   //写页地址和操作方式
    ACK();

    while (i--)
    {
   SDA=1;
   ddata<<=1;
   SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
   if (SDA) ddata|=0x01;
    }

    SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
   SDA=1;   //STOP
    delay();
    return ddata;

}


void WriteIIC_24C01(unsigned char address,unsigned char ddata)
{

    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;   //START

    write_8bit( (address<<1) & 0xfe);   //写页地址和操作方式,对于24C32-
24C256,page不起作用
    ACK();
    write_8bit(ddata); //发送数据
    ACK();
    SDA=0;
   _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
   SDA=1;   //STOP
   delay();
}