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

📄 test_24c51xxc.c

📁 c51读写24cxx程序模块
💻 C
📖 第 1 页 / 共 2 页
字号:
	void  noack()    //产生非应答位子模块,用于数据写入结束                  
		 {
                  unsigned  char  t;
		   // unsigned   char  DELAY_R;
		    SDA=1;  
		    _nop_();           //
		    SCL=1;      //
		    _nop_();
		    t=0;while(t<=DELAY_R){t++;}_nop_();           //  
		    _nop_();           //
		    SCL=0;
		  } 
	
	void chkack()        //检测应答位子模块
		    {
            unsigned  char  t;
		    unsigned   char  ER1;
         // bdata  char  _ACK;
            bit ACK_BIT  ; //=_ACK^0;
	    //  _ACK=0x00;
		    SDA=1;  
		    _nop_();_nop_();               //
		    SCL=1;         //
		    _nop_();
		    t=0;while(t<=DELAY_R){t++;}
		    ACK_BIT=SDA;           //
		    _nop_();               //
		    SCL=0;                 //
		    _nop_();
                   ER1=0x00;
                   _nop_();
		    if (ACK_BIT==1){        //如无应答,闪烁错误信号
                      _nop_();
                      FLASH_ERR(ER1);
                      _nop_();
                      ++ER1;
                       _nop_();
 		                 }
		      else  ER1=0xff;
                //  return(ER1);
		   }
	
	void shift_out8(WR_DATA)       //8位数据移出子模块   
	      {
          
	      unsigned  char  i,t;
	      for (i=0;i<8;i++)
	      {
             SDA=(bit)(WR_DATA&0x80);  //SDA=WR_BIT;  //WR_BIT=WR_DATA^7,写入数据时高位在前   
	       SCL=0;             //
	       _nop_();
	       SCL=1;             //
	       _nop_();
	       t=0;while(t<=DELAY_R){t++;}_nop_();
	       _nop_();
	       SCL=0;             //
	       _nop_();
	       WR_DATA=WR_DATA<<1;             //移位  
	       } 
               _nop_();          
              }
	
static unsigned char shift_in8()       //8位数据移入子模块   
	      {
          unsigned    char   i,t;//  DELAY_R;
	      static  unsigned   char RD_DATA;   
          bit RD_BIT;    // =RD_DATA^0;
          RD_DATA=0x00;
	      for (i=0;i<8;i++)
	        {
             RD_BIT=0;
             SDA=1;             //读数据时必需释放数据线,将数据线置高,否则读出有误
	         RD_DATA=RD_DATA<<1;       //移位   
	         SCL=0;           //
	         _nop_();
	         SCL=1;           //
	         _nop_();
	         t=0;while(t<=DELAY_R){t++;}
	         RD_BIT=SDA;     //RD_BIT=RD_DATA^0,读出时,高位在先  
	         _nop_();
	         SCL=0;          //
	         _nop_();
             if(RD_BIT==1){
                RD_DATA++;   //D_DATA^0&RD_BIT;
                }
            _nop_();
	        }
	       return(RD_DATA);
	      }
	


	
	
	 void CALL_24CXX(){            //唤醒EEPROM子模块
	        unsigned  char CALL;  //,COMM_W=0xa0;
	        CALL=COMM_W;          //发送EEPROM地址及读写位,唤醒EEPROM     
	        start();
            _nop_();
	        shift_out8(CALL);
            _nop_(); 
            chkack();
            _nop_();
	             }
	
	W_1_PAGE(CPU_S_ADR,E_S_ADR){        //写入一页子模块        
	     unsigned  char  t,i,page_t,W_DATA,EP_D_ADR;  //,B_ACK; //,WR_C;  
	     static unsigned  char data  *ram;
	     CALL_24CXX();        //CALL_24CXX()子模块中已含检测应答位模
         _nop_(); 
	     EP_D_ADR=E_S_ADR;      //DATA  ADDRESS  OF  EEPROM  FOR  WRITE 
	     ram=CPU_S_ADR;     //DATA  ADDRESS  ON  CPU  RAM  FOR  WRITE   
	     shift_out8(EP_D_ADR);    //写入  首址    
         _nop_(); 
	     chkack();
         _nop_();
         page_t=T_PAGE;          //写入数据   
	      for(i=0;i<page_t;i++)
		     {                 //WRITE  T_PAGE(FOR 24CXX  IS 8)  WORD
	           W_DATA=*ram;
	           shift_out8(W_DATA);
                _nop_();
               chkack();
               _nop_();
	           ++ram;
	         }
          _nop_();
	      stop();
          t=0x0a;               //delay 10ms        
          delaytms(t);
	      t=0;while(t<=DELAY_T){t++;}_nop_();       //延时,同时检查应答位(ACK),若有应答即完成写入
	      for (i=0;i<0x0a;i++)
		     {                   //DELAY   FOR  READ   AND  CHACK
	         t=0x0a;               //10ms        
             delaytms(t);
	         CALL_24CXX();
             _nop_();
          //    chkack();    //  CALL_24CXX()子模块中已含检测应答位模块   
	         _nop_();
	           }
	         t=0;while(t<=DELAY_T){t++;}_nop_();
	        }    
	
	W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N)  {      //写入数页主模块  
	      unsigned  char  i,page_;
	  //  unsigned  char  DELAY_T,T_PAGE;   //WR_PAGE_T;
	      WC=0;
	      _nop_();
	      SDA=1;
	      SCL=1;
	      page_=PAGE_N;       //写入页数 PAGE_N 页,PAGE N由主程序传递  WRITE N PAGE
	      for(i=0;i<page_;i++)
		     {
	          W_1_PAGE(CPU_S_ADR,E_S_ADR);   //调用写入一页子模块   
              CPU_S_ADR=CPU_S_ADR+8;
              E_S_ADR=E_S_ADR+8;        
	         }
	      WC=1;
	       }


	   
	R_1_PAGE(CPU_S_ADR,E_S_ADR){      //读入一页子模块   
	      unsigned  char  t,i,page_t,EP_D_ADR,WR_C,RD_DATA;
	      static  unsigned  char data *ram;
          SDA=1;         //
	      _nop_();
	      SCL=1; 
          // t=0x0a;         //delay  10ms 
          // delaytms(t);
          t=0;while(t<=DELAY_T){t++;}
          _nop_();
	      CALL_24CXX();             //传送EEPROM地址,唤醒EEPROM   
	      _nop_();          //CALL_24CXX()子模块中已含检测应答位模    
	      EP_D_ADR=E_S_ADR;      //DATA  START  ADDRESS  OF  EEPROM  FOR  READ 
	      ram=CPU_S_ADR;     //DATA START  ON  CPU  FOR  STORE  ADDRESS 
	      _nop_();          
          shift_out8(EP_D_ADR);    //传送要读入的数据首?    ?
          _nop_(); 
	      chkack();              //!!!不作停止   
          _nop_();
          start();         //重新启动  
          _nop_();
          WR_C=COMM_R;      //COMM_R=0xa1   
	      shift_out8(WR_C);    //传送读命令
          _nop_(); 
          chkack();
          _nop_(); 
	      page_t=T_PAGE;            //FOR  24CXX   SERIEAL  IC  T_PAGE  IS  8 ,对24CXX系列,每页为8字节数据.
	      for(i=1;i<page_t;i++)     //read  7  word
		      {                 //READ  T_PAGE(FOR 24CXX  IS 8)  WORD
	           _nop_(); 
	           RD_DATA=shift_in8();  //R_DATA;
               *ram=RD_DATA; 
	           ++ram;
               _nop_();
	           ack();
	           }    
           _nop_();  
	       *ram=shift_in8();    // ONE PAGE  IS 1+7=8 WORD
	       ++ram;
           _nop_();
	       noack();       //每页结束时发送非应答位
           _nop_();
 	       stop();
	       t=0x0a;         //delay  10ms 
           delaytms(t);
           t=0;while(t<=DELAY_T){t++;}_nop_();
	       }           
	      
	RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N)    //读入数页主模块  
	       {
	      unsigned  char  i,page_;  //,RD_PAGE_T; 
	      WC=0;
	      _nop_();
	      SDA=1;
	      SCL=1;
	      page_=PAGE_N;           //读入 PAGE_N 页,PAGE N由主程序传递  READ  N  PAGE
	      for(i=0;i<page_;i++)
	        {
	         R_1_PAGE(CPU_S_ADR,E_S_ADR); //调用读入一页子模块
             CPU_S_ADR=CPU_S_ADR+8;
             E_S_ADR=E_S_ADR+8;
             }
	      WC=1;
	       }
	
	 
	
	main()
	   {
         unsigned  char STR_ADR,END_ADR,CHR_LED;
         unsigned  char CPU_S_ADR,E_S_ADR,PAGE_N;
//seg1
        CHR_LED=0x00;       //
    	 FLASH_ALL();        //FLASH  0  
        _nop_();
        STR_ADR=0x30;
    	 END_ADR=0x7f;
    	 CLR_CPU_RAM(STR_ADR,END_ADR);  //清除CPU内存0x30~0x7F   CLEAR  CPU  RAM
        _nop_();
        STR_ADR=0x30;                  //将00~FF 写入CPU内存
	    END_ADR=0x4f; 
    	 SET_CPU_RAM(STR_ADR,END_ADR);  //WRITE  0x00~0xff TO  CPU  RAM  ADDRESS  0x30 TO 0x4f
        _nop_(); //   	 _nop_();
//seg2

        CHR_LED=0xfe;
    	 FLASH(CHR_LED);        //FLASH  1
        _nop_();
        CHR_LED=0xff;             //关闭指示灯  close  CHR_LED
    	 STR_ADR=0x30;
      	 END_ADR=0x4f;       
    	 DSP_SEG(STR_ADR,END_ADR,CHR_LED);      //DISPLAY1  DISPLAY  CPU  RAM  0x30  TO  0x4f
    	 _nop_();
//seg3  
        
        CHR_LED=0xfc;
	 FLASH(CHR_LED);        //FLASH  2
        _nop_();
        CPU_S_ADR=0x30;        //CPU数据首址  DATA  FOR  WRITE  ON  CPU  IS 0x50 
        E_S_ADR=0x00;          //器件存放写入数据的首址 EEPROM  ADRESS  IS  0x00
        PAGE_N=WR_PAGE_T;      //所写数据页数   WR_PAGE_T=3,(见程序开头定义)
        _nop_();
        W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N);        //	WRITE  EEPROM
        _nop_();
//seg4
        CHR_LED=0xf8;
	 FLASH(CHR_LED);     // FLASH   3
        _nop_();
        _nop_();
        CPU_S_ADR=0x50;      //读出的数据在CPU的RAM存放的首址为  STORE  DATA  TO  CPU  RAM  ADRESS  0x30
        E_S_ADR=0x00;       //所读数据在器件的首址  EEPROM  FOR  READ  ADRESS  IS 0X00
        PAGE_N=RD_PAGE_T;       //所读数据页数   RD_PAGE_T=3,(见程序开头定义)
        _nop_();  
	  RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N);     //READ  EEPROM
        _nop_();  
//seg5
        CHR_LED=0xf0;
	 FLASH(CHR_LED);      // FLASH   4
        _nop_();
        CHR_LED=0xff;  
	 STR_ADR=0x50;
	 END_ADR=0x7f;       
	 DSP_SEG(STR_ADR,END_ADR,CHR_LED);      //DISPLAY1  DISPLAY  CPU  RAM  0x40  TO  0x7e
        _nop_();
//seg6
        CHR_LED=0xaa;
        FLASH(CHR_LED);        //FLASH  5 
        _nop_(); 
	     }


⌨️ 快捷键说明

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