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

📄 tianjiashanchuxinxi.c

📁 51系列单片机扩展外部存储器24C0X系列
💻 C
字号:
//按开关读出存储器24C0X系列里面的代码,或//者删除里面的代码
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define OP_READ  0xa1          // 器件地址以及读取操作
#define OP_WRITE 0xa0          // 器件地址以及写入操作
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
sbit SDA = P3^7;    
sbit SCL = P3^6;
sbit BJ = P0^5; 
sbit DN = P0^3;
sbit ADN = P0^4;
sbit DEN = P0^6;
sbit DU = P1^2;
sbit ADD = P1^3;
sbit DEL = P1^6;
uchar shift ;
uchar count=0 ;
uchar buf;
uchar b[15];
uchar a[15];
uchar c[15]="               ";
uint i,j,n,h=3;


void delayms(uint ms);
void start();
void stop();
uchar shin();
bit shout(uchar write_data) ;
void write_byte(uchar addr, uchar write_data);
uchar read_current();
uchar read_random(uchar random_addr);


void main()
{
	TMOD=0x20;
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;
	SM0=0;
	SM1=1;
	REN=1;
	EA=1;
	ES=1;
	PCON=0x80;
	DN=0;
	BJ=1;
	ADN=1;
	DU=1;

	while(1)
	{
			
			h=read_random(0x7ff);
			for(j=1;j<h;j++)
			{
			   for(i=0; i<15; i++)      
               {
                 b[i]=read_random((j-1)*15+i);  //从AT24C02读出显示代码
			     SBUF=b[i];
			     while(!TI);
		       	 TI=0;
			   }
			   if(i==15)   
			   {
				 DU=0;	
	             delayms(250); 
	             DU=1;
	             delayms(250);

			   }
			}


	for(n=0;n<15;n++)
	{
	     while(!RI);
		 buf=SBUF;
		 RI=0;
	     a[n]=buf;
	} 
	if(n==15)					 
    {
         BJ=0;
		 delayms(250);
		 BJ=1;
		 delayms(250);
	}
	           	if(ADD==0)
				{
				     delayms(10);
				
					  if(ADD==0)
					  {
					       for(i=0;i<15;i++)
					       {
					          write_byte((h-1)*15+i,a[i]);
					       }
					       if(i==15)					 
                           {
					           ADN=0;
					           delayms(500);
					           ADN=1;
					           delayms(500);
							 
					           h++;
					           write_byte(0x7ff,h);
					       }
					  }
			    }

			    if(DEL==0)
				{
				     delayms(10);
					  if(DEL==0)
					  {
					       for(i=0;i<15;i++)
					       {
					          write_byte((h-1)*15+i,c[i]);
					       }
					       if(i==15)					 
                           {
					           while(h>1)
							 {
							   h--;
							   write_byte(0x7ff,h);
					           DEN=0;
					           delayms(500);
					           DEN=1;
					           delayms(500);
							 }   
					       }
					  }
			    } 




     }
  }
/**********************************************************
 延时子程序
**********************************************************/
void delayms(uint ms) 
{
 uchar k;
 while(ms--)
 {
  for(k = 0; k < 120; k++);
 }
}
/**********************************************************
 开始位
**********************************************************/
void start()
{
   SDA = 1;
   SCL = 1;
   delayNOP();
   SDA = 0;
   delayNOP();
   SCL = 0;
}
/**********************************************************
  停止位
**********************************************************/
void stop()
{
   SDA = 0;
   delayNOP();
   SCL = 1;
   delayNOP();
   SDA = 1;
}
/**********************************************************
 从AT24C02移出数据到MCU
**********************************************************/
uchar shin()
{
   uchar i,read_data;
   for(i = 0; i < 8; i++)
   {
     SCL = 1;
     read_data <<= 1;
     read_data |= SDA;
     SCL = 0;
   }
   return(read_data);
}
/**********************************************************
 从MCU移出数据到AT24C02
**********************************************************/
bit shout(uchar write_data) 
{
 uchar i;
 bit ack_bit;
 for(i = 0; i < 8; i++)  // 循环移入8个位
 {
  SDA = (bit)(write_data & 0x80);
  _nop_();
  SCL = 1;
  delayNOP();
  SCL = 0;
  write_data <<= 1;
 }
 SDA = 1;   // 读取应答
 delayNOP();
 SCL = 1;
 delayNOP();
 ack_bit = SDA;
 SCL = 0;
 return ack_bit; // 返回AT24C02应答位
}
/**********************************************************
 在指定地址addr处写入数据write_data
**********************************************************/
void write_byte(uchar addr, uchar write_data)
{
  start();
  shout(OP_WRITE);
  shout(addr);
  shout(write_data);
  stop();
  delayms(10);  // 写入周期
}
/**********************************************************
 在当前地址读取
**********************************************************/
uchar read_current()
{
  uchar read_data;
  start();
  shout(OP_READ);
  read_data = shin();
  stop();
  return  read_data;
}
/**********************************************************
 在指定地址读取
**********************************************************/
uchar read_random(uchar random_addr)
{
   start();
   shout(OP_WRITE);
   shout(random_addr);
   return(read_current());
}
//**********************************************************3+

⌨️ 快捷键说明

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