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

📄 memio.c

📁 89c58接受PC窜口目标信号
💻 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 + -