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

📄 复件 24c02.c

📁 数控系统的模拟系统,用SSTC51仿真单片机,仿真数控机床切割,能执行数控机床代码.
💻 C
字号:


	
//#include "24C02.h"

/*
 
 	 
//==========================================
//IIC的起始位 
void star24(void) 
{
  sda=1;scl=1;_nop_();
  sda=0;_nop_();
  scl=0;_nop_();
}
//==========================================
//IIC的结束位
void pause24(void) 
{
	sda=0;scl=0;_nop_();
	scl=1;_nop_();
	sda=1;_nop_();	
}
//发送答应位
void ack24(void)
{
    sda=0;scl=1;_nop_();
    scl=0;sda=0;_nop_();
    
}
//发送非答应位
void uack24(void)
{
    sda=1;scl=1;_nop_();
    scl=0;sda=0;_nop_();
}
//答应位检测
cack24(void)
{
    bit data flag;
    sda=1;scl=1;_nop_();
    flag=sda;
    scl=0;
    return(flag); 
}
//==========================================
//读一个IIC内的字节
unsigned char rd24(void) 
{	
	sda=1;scl=1;_nop_();a7=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a6=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a5=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a4=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a3=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a2=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a1=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();a0=sda;scl=0;_nop_();	
	return(ACC);
}
//=============================================
//写一个IIC字节
void wd24(unsigned char dd) 
{
    ACC=dd;
	sda=a7;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a6;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a5;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a4;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a3;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a2;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a1;scl=1;_nop_();scl=0;sda=0;_nop_();
	sda=a0;scl=1;_nop_();scl=0;sda=0;_nop_();
	
}
//===============================================
//读出IIC内指定地址的值
unsigned char read_I2C(unsigned int address)
{
	unsigned char dd;
	//EA=0;
	star24();wd24(0xa0);cack24();//等应答位	
	wd24(address);cack24();      //等应答位
    star24();wd24(0xa1);cack24();//等应答位
    dd=rd24();uack24();pause24();
    return(dd);
   // EA=1;
	}
//======================================================
//在指定的IIC地址内写一个字节
void Write_I2C(unsigned int address,unsigned char dd)
{
    //EA=0;
    star24();wd24(0xa0);cack24();
    wd24(address);cack24();
    wd24(dd);cack24();pause24();
    //EA=1;
}

unsigned char readBlock_I2C(unsigned int start_add,unsigned int length,unsigned char *buf_ptr)

  {  
     int i;

  for(i=0;i<length;i++)
        {  
           buf_ptr[i]=read_I2C(start_add);
           start_add++;
           //buf_ptr++;
       
       }
	return(buf_ptr);
  }
//void s240(void) 
//{
//	_nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0;
//}
//void p240(void) {
//	sda0=0;scl0=1;_nop_();sda0=1;
//}

	/*	time=0;					              //time为定时器时间参考,time增加1代
                                          //表1ms,如果没有用定时器,取消该行
    while (1) 
    {
		s24();
		wd24(0xa0|ddd);
		sda=1;
		if (sda==0) break;
		if (time>10) break;	            //此行防止由于eeprom器件损坏后的死循环
		scl=0;
	}*/

/*void   writeI2C_NonDMA( BYTE *Bp_Buffer,BYTE B_Length, BYTE B_Stop )
{
   int WaitTimeout = I2C_WAIT_TIMEOUT;

   gm_WriteRegByte(I2C_MST_CTRL, I2C_EN  );// Enable I2C master

   // Write slave device address and operation bit.
   gm_WriteRegByte( I2C_MST_TX_DATA, B_DevAddress | SLAVE_WRITE );
   gm_WriteRegByte( I2C_MST_TX_CTRL, (I2C_WR | I2C_STA) );
   // Wait for transmission to complete.
   while( (gm_ReadRegByte( I2C_MST_STATUS) & TIP ) != 0)
   {
      if ( WaitTimeout-- == 0) return ERR_TMO;
   }


   // send data bytes to slave
            while( B_Length )
            {
      gm_WriteRegByte( I2C_MST_TX_DATA, *Bp_Buffer );
      gm_WriteRegByte( I2C_MST_TX_CTRL, I2C_WR );
      // wait for last transmit to complete.
      WaitTimeout = I2C_WAIT_TIMEOUT;
      while( (gm_ReadRegByte( I2C_MST_STATUS) & TIP ) != 0)
      {
         if ( WaitTimeout-- == 0) return ERR_TMO;
      }

      Bp_Buffer++; // point to next byte location
      B_Length--;
            }

   // Send stop signal if only requested for.
   if ( B_Stop )
   {
      gm_WriteRegByte( I2C_MST_TX_CTRL,  I2C_STO );
      // wait for last Bus to idle.
      WaitTimeout = I2C_WAIT_TIMEOUT;
      while( (gm_ReadRegByte( I2C_MST_STATUS) & Busy ) != 0)
      {
         if ( WaitTimeout-- == 0) return ERR_TMO;
      }
   }
   return OK;
   }*/
   void s24(void) {
	_nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
}
void s240(void) {
	_nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
}
void p24(void) {
	sda=0;scl=1;_nop_();sda=1;
}
void p240(void) {
	sda=0;scl=1;_nop_();sda=1;
}
unsigned char rd24(void) {
	sda=1;
	scl=1;a7=sda;scl=0;
	scl=1;a6=sda;scl=0;
	scl=1;a5=sda;scl=0;
	scl=1;a4=sda;scl=0;
	scl=1;a3=sda;scl=0;
	scl=1;a2=sda;scl=0;
	scl=1;a1=sda;scl=0;
	scl=1;a0=sda;scl=0;
	sda=1;scl=1;scl=0;
	return(ACC);
}

void wd24(unsigned char dd) {
	ACC=dd;
	sda=a7;scl=1;scl=0;
	sda=a6;scl=1;scl=0;
	sda=a5;scl=1;scl=0;
	sda=a4;scl=1;scl=0;
	sda=a3;scl=1;scl=0;
	sda=a2;scl=1;scl=0;
	sda=a1;scl=1;scl=0;
	sda=a0;scl=1;scl=0;
	sda=1;scl=1;
}

unsigned char read_I2C(unsigned int address){
	unsigned char dd;
	dd=((address&0x7ff)/256)<<1;
	s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;
	s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);
}

void Write_I2C(unsigned int address,unsigned char dd){
	unsigned char ddd;
	unsigned char  time;
	ddd=((address&0x7ff)/256)<<1;
	s24();wd24(0xa0|ddd);scl=0;wd24(address);scl=0;wd24(dd);scl=0;p24();
	time=0;					//time为定时器时间参考,time增加1代表1ms,如果没有用定时器,取消该行
	while (1) {
		s24();
		wd24(0xa0|ddd);
		sda=1;
		if (sda==0) break;
		if (time++>256) break;	//此行防止由于eeprom器件损坏后的死循环
		scl=0;
	}
}   
void SaveXYToNVRAM(void)
  {
  Write_I2C(9,Pref_x);
  Write_I2C(10,Pref_y);
  }
 void ReadXYFromNVRAM(void)	
 {
 Pref_x=read_I2C(9);
 Pref_y=read_I2C(10);
 }
 void SaveGcodeToI2C(unsigned char start_add,unsigned char *p,unsigned char lenth)
{
        int i;
   for(i=0;i<lenth;i++)
   	{  
   	    write_I2C(start_add,*p);
		start_add++;
		p++;
   	}
     
}	
 	

⌨️ 快捷键说明

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