📄 24c01-64.c
字号:
/*以下为AT24C01/02驱动程序,时钟:22.1184MHz;通信速率:88.5Kb/S*/
/*使用时按照C语言的格式嵌入以下1--4代码*/
/* 作者:weiyi 时间:
2002.6.17*/
/*读写操作范例过程如下: 使用时根据具体型号保留将其他不用的删除便是*/
/*Write:
/* unsigned char data i;
/* ……
/* StartIic;
/* i=SlaWr;
/* i|=A2A0; /*装入具体线路的A2-A0值*/
/* if(MemSize==16){ /*匹配地址AT24C16*/
/* i&=0xf1;
/* i|=cAddresH&0x0e; /*根据型号将高地址转如SLA*/
/* }
/* if(MemSize==08){ /*匹配地址AT24C08*/
/* i&=0xf9;
/* i=cAddresH&0x06; /*根据型号将高地址转如SLA*/
/* }
/* if(MemSize==04){ /*匹配地址AT24C04*/
/* i&=0xfd;
/* i=cAddresH&0x02; /*根据型号将高地址转如SLA*/
/* }
/* SendIic(i);/*1010 0010*/
/* if((MemSize==32)||(MemSize==64)) /*匹配地址AT24C32、64*/
/* SendIic(cAddresH); /*Send first addres*/
/* SendIic(cAddres); /*Send addres(L)如果不是以上所列型号就是
AT24C01、02*/
/* SendIic(cData0);/*写第一个字节数据*/
/* ……
/* SendIic(cDataN);/*写最后一个字节数据,不能超过页缓冲*/
/* EndIic;
/*Read: bScanErr=0;
/* StartIic;
/* i=SlaR;
/* i|=A2A0; /*装入具体线路的A2-A0值*/
/*
/* if(MemSize==16){ /*匹配地址AT24C16*/
/* i&=0xf1;
/* i|=cAddresH&0x0e;
/* }
/* if(MemSize==08){ /*匹配地址AT24C08*/
/* i&=0xf9;
/* i=cAddresH&0x06; /*根据型号将高地址转如SLA*/
/* }
/* if(MemSize==04){ /*匹配地址AT24C04*/
/* i&=0xfd;
/* i=cAddresH&0x02; /*根据型号将高地址转如SLA*/
/* }
/* SendIic(i);/*1010 0010*/
/* if((MemSize==64)||(MemSize==32) /*匹配地址AT24C32、64*/
/* SendIic(cAddresH); /*Send first addres*/
/* SendIic(cAddres); /*Send addres(L)如果不是以上所列型号就是
AT24C01、02*/
/* if(bScanErr==0){
/* cDataBuf[0]=ScanIic();/*读入第一个字节*/
/* SendAck();
/* ……
/* cDataBuf[n]=ScanIic();/*读入最后一个字节*/
/* SendNotAck();
/* }
/* EndIic;*/
/*在程序相应位置嵌入以下1-4代码*/
/* 1。 嵌入宏定义:*/
#include <reg51.h> /*#include <reg52.h>*/
#include <absacc.h>
#include <intrins.h>
#define Wait {_nop_();_nop_();_nop_();_nop_();}
#define StartIic {bSda=bScl=1;Wait;bSda=0;Wait;bScl=0;}
#define EndIic {bSda=0;bScl=1;Wait;bSda=1;}
#define SlaWr 0xa0 /*1010 0 0 0 0*/
#define SlaR 0xa1 /*1010 0 0 0 1*/
#define A2A0 0x0 /*按照实际线路设置:0x00-0x14*/
#define MemSize 01 /*EEPROM型号:01-64*/
/* 2。 嵌入变量申明:*/
sbit bSda =Px^x; /*使用具体线路的bSda*/
sbit bScl =Px^x; /*使用具体线路的bScl*/
unsigned char bdata cFlag;
sbit bScanErr =cFlag^0;
/* 3。 嵌入涵数申明:*/
unsigned char ScanIic();
void SendIic(unsigned char cData);
void SendAck(void);
void SendNotAck(void);
/* 4。 嵌入涵数代码段:*/
/****************************************************
Name:ScanIic
Function:From IIC Read data
Time:113us 88.5K
***************************************************/
unsigned char ScanIic(){
unsigned char data i,j;/*IIC data*/
bSda=1;
j=0;
for(i=0;i<8;i++){
bScl=1;
Wait; /*可以不用,但太危险了*/
j<<=1;/*这个指令已经有15个周期,所以无须再延时*/
j|=bSda;/*Scan 0*/ /*Scan 1*/
bScl=0;
Wait;
}
return j;
}
/***********************************************/
/****************************************************
Name:SendIic
Function:Send data to Iic
Time:116us(8位数据为:112us) 88.5k
*****************************************************/
void SendIic(unsigned char cData){
unsigned char data i;
for(i=0;i<8;i++){
bSda=(bit)(cData&0x80);
bScl=1;
cData<<=1;
Wait;/*都可以不用,但太危险了*/
bScl=0;
Wait;/*都可以不用,但太危险了*/
}
bSda=bScl=1; /*检测ACK*/
for(i=0;(bSda==1)&&(bScanErr==0);i++){
if(i==17)
bScanErr=1;/*如果101us没有响应就错误*/
}
bScl=0;
}
/*************************************************/
/**********************************************
Name:SendAck
Function:Send IIC Ack
********************************************/
void SendAck(void){
bSda=0;
bScl=1;
Wait;
bScl=0;
bSda=1;
}
/******************************************/
/******************************************
Name:SendNotAck
Function:Send IIC not Ack
******************************************/
void SendNotAck(void){
bScl=bSda=1;
Wait;
bScl=0;
}
/**********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -