📄 memio.c
字号:
/*****************************************************/
/*used for atmel 24c01a*/
/*panda Ins*/
/*lee*/
/*20040417*/
#include "reg51.h"
#include "memio.h"
#include <intrins.h>
sbit SDA= P3^4;
sbit SCL =P3^5;
#define NOP2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
/*start flag...*/
void Start()
{
SCL=1; /*eyes on me*/
NOP2
SDA=1;
NOP2
SDA=0;
NOP2
SCL=0;
NOP2
}
/*;************************************/
/*stop*/
void Stop()
{
SDA=0;
NOP2
SCL=1;
NOP2
SDA=1;
NOP2
}
/*;**************************************/
/*ack*/
bit ACK()
{
bit c;
SDA=1;
NOP2
SCL=1;
NOP2
c=SDA;
NOP2
SCL=0;
NOP2
return c;//
}
/*;************************************/
/*send a data or address*/
void SendChar(unsigned char ch)
{
unsigned char i;
i=8;
do
{
SDA=(ch&0x80);
NOP2
SCL=1;
NOP2
SCL=0;
NOP2
ch<<=1;
}while(--i!=0);
}
/*;**************************************/
/**/
unsigned char RecChar()
{
unsigned char i,j;
i=8;
do
{
SCL=1;
NOP2
j=(j<<1)|SDA;
NOP2
SCL=0;
NOP2
}while(--i!=0);
return j;
}
/***************************************/
/********************************/
/**/
void WriteChar(unsigned int addr,unsigned char ch)
{
unsigned char c;
c=((*((unsigned char *)&addr))<<1)&0x02;
Start();/*;起动24C01时序*/
SendChar(0xa0|c);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(addr);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(ch);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
Stop();/*;停止24C01时序*/
// for(addr=4;addr!=0;addr--)
for(ch=0xff;ch!=0;ch--) ;
}
//;**************************************
/*;********************************/
/*;往24C01写多字节*/
void WriteBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)
{
unsigned char c;
c=((*((unsigned char *)&addr))<<1)&0x02;
Start();/*;起动24C01时序*/
SendChar(0xa0|c);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(addr);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
do
{
SendChar(*buf++);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
if(count!=1)
{if(((++addr)&0x7)==0)
{
Stop();
for(c=0xff;c!=0;c--) ;
c=((*((unsigned char *)&addr))<<1)&0x02;
Start();/*;起动24C01时序*/
SendChar(0xa0|c);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(addr);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
}
}
else
{
Stop();/*;停止24C01时序*/
for(c=0xff;c!=0;c--) ;
}
}while(--count!=0);
}
/*;**********************************/
/*;从24C01读一字节*/
/*;入口:R0中为要读出内容的地址*/
/*;出口:A中为读到的内容*/
unsigned char ReadChar(unsigned int addr)
{
unsigned char ch;
ch=((*((unsigned char *)&addr))<<1)&0x02;
Start();/*;起动24C01时序*/
SendChar(0xa0|ch);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(addr);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
Start();/*;起动24C01时序*/
SendChar(0xa1|ch);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
ch=RecChar();/*;从24C01接收一8位数据*/
Stop();/*;停止24C01时序*/
return ch;
}
/**********************************/
/*至少读2字节*/
void ReadBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)
{
unsigned char ch;
ch=((*((unsigned char *)&addr))<<1)&0x02;
Start();/*;起动24C01时序*/
SendChar(0xa0|ch);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
SendChar(addr);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
Start();/*;起动24C01时序*/
SendChar(0xa1|ch);/*;往24C01发一8位数据*/
ACK();/*;检测24C01的响应信号*/
count--;
do
{
*buf++=RecChar();/*;从24C01接收一8位数据*/
SDA=0;
SCL=1;
SCL=0;
SDA=1;
}while(--count!=0);
*buf=RecChar(); /*;从24C01接收一8位数据*/
Stop();/*;停止24C01时序*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -