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

📄 main.c

📁 AT24C256 读写 atmega16单片机( ICC )
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

#define SDA1() PORTC|=1<<PC1   //数据输出 1
#define SDA0() PORTC&=~(1<<PC1) //数据输出 0
#define SDAout() DDRC|=1<<PC1   //数据线改为输出
#define SDAin() DDRC&=~(1<<PC1)  //数据线改为输入
#define RSDA() PINC&(1<<PC1)   //读数据
#define SCL1() PORTC|=1<<PC0   //时钟线输出1
#define SCL0() PORTC&=~(1<<PC0) //时钟线输出0
#define e2ptime 20
 

void WriteStart(void)//起始
 {
  SDA1();
    Delay(e2ptime);//该函数为软件延时函数,根据需要自己去写吧
  SCL1();
    Delay(e2ptime);
  SDA0();
    Delay(e2ptime);
 // SCL0();
 }

void WACK(unsigned char a)//输出ACK
 {
 SCL0();
 Delay(e2ptime);
 SDA0();//
 if(a)SDA1();
 Delay(e2ptime);
 SCL1();
 Delay(e2ptime);
 SCL0();
 }

unsigned char RACK(void)//读ACK
{
 unsigned char temp=4;
 SCL0();
 Delay(e2ptime);
 SDAin();//改成输入
 SDA1();//加上拉
 SCL1();
 Delay(e2ptime);
 while(RSDA()&&temp)temp--;
 SCL0();
 SDAout();
 if(temp)return(0);
 else return(1);
}

unsigned char WriteByte(unsigned char a)//写一个字节
{
 unsigned char i;
 SCL0();
 for(i=0x80;i;i>>=1)
 {
  Delay(e2ptime);
  if(a&i)SDA1();
  else SDA0();
  Delay(e2ptime);
  SCL1();
  Delay(e2ptime);
  SCL0();
  Delay(e2ptime);
 }
 return(RACK());
}

void Stop(void)//停止
 {
  SCL0();
    Delay(e2ptime);
  SDA0();//
    Delay(e2ptime);
  SCL1();
    Delay(e2ptime);
  SDA1();
    Delay(e2ptime);////////////////
  //SCL0();/////////////
 }

char ReadByte(void) //读一个字节数据
{
  unsigned char temp,i;
  SCL0();
  SDAin();
  SDA1();
  for(i=0,temp=0;i<8;i++)
   {
   temp<<=1;
   SCL1();
   Delay(e2ptime);
   if(RSDA())temp|=1;
   SCL0();
   Delay(e2ptime);
   }
  SDAout();
  return(temp);
 }
 /*
AT24C01 为128字节 (0x00-0x7f)
AT24C02 为256字节 (0x00-0xff)
AT24C04 为512字节 (0x000-0x1ff)
AT24C08 为1024字节(0x000-0x3ff)
AT24C16 为2048字节(0x000-0x7ff)

AT24C32 为4096字节(0x000-0xfff)
AT24C64 为8192字节(0x0000-0x1fff)
AT24C128 为16384字节(0x00-0x7ff)
AT24C256 容量为32768字节(0x0000-0x7fff)
AT24C512 容量为65536字节(0x0000-0xffff)
*/
 //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
void AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
 {
 unsigned char i,temp,*p,ICerror=0,page_size;
 unsigned long next_page_start_addr;
 if(model<2)page_size=8;
 else if(model<32)page_size=16;
   else if(model<128)page_size=32;
     else if(model<512)page_size=64;
       else page_size=128;
 next_page_start_addr=model;
 next_page_start_addr<<=7;//总容量
 while(next_page_start_addr)
 {
  next_page_start_addr-=page_size;
  if(next_page_start_addr<=addr){next_page_start_addr+=page_size;break;}
 }
 
Wagain:
 p=P_data;
 i=num;//数据个数
 if(ICerror<10)
 {
  ICerror++;
 }
 else 
 {
 goto Wstop;
 }
 SDAout();
 WriteStart();      //启动
 temp=0xa0+(DevAddr<<1);
 if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 if(WriteByte(temp))   //头字节
 goto Wagain;
 if(model>16)//写器件24c32以上地址高位
 {
  if(WriteByte(addr>>8))//
  goto Wagain;
 }
 if(WriteByte(addr&0xff)) //写地址低位
 goto Wagain;
 while(i)//写入数据i个
 {
  i--;				  	  
  if(WriteByte(*(p++)))goto Wagain;
  addr++;
  if(addr==next_page_start_addr)break;
 }
Wstop:
 Stop();
if(i)//写到了页末,重新开始写新一页
 { 
 Delay(100);
 num=i;
 P_data=p;
 next_page_start_addr+=page_size;
 if(addr==model*128){addr=0;next_page_start_addr=page_size;}
 goto Wagain;
 }
}
//读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
{
 unsigned char temp,*p,ICerror=0;
Ragain:
 if(ICerror<10)ICerror++;
 else goto Rstop;
 SDAout();
 p=P_data;
 WriteStart();//
 temp=0xa0+(DevAddr<<1);
 if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 if(WriteByte(temp))//;//头字节
 goto Ragain;
 if(model>16)//器件24c32以上地址高位
 {
  if(WriteByte(addr>>8))//
  goto Ragain;
 }
 if(WriteByte(addr&0xff))//
 goto Ragain;
 Ragain2:
 WriteStart();//
 if(WriteByte(temp|1))//
 goto Ragain2;
 while(num--)
 {
  *(p++)=ReadByte();//
  if(num)WACK(0);
  else WACK(1);
 }
 Rstop:
 Stop();//
 return(ICerror);
}  
 /* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */ 
 void Delay(unsigned char DelayCount) 
  { while(DelayCount--); 
  } 

void main(void)
{ char i;
  unsigned char card[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},
  *p=card,card_read[20],*pp=card_read;
  //*p = card;
 // pp =  card_read;
  usart_init();
  //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
 AT24CxxWrite(0x0100,0,20,p,12);
   Delay(e2ptime);
 AT24CxxRead(0x0100,0,20,pp,12); 
 for(i=0;i<12;i++)
 {
  UDR = card_read[i];
 }
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -