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

📄 iic_slave.bak

📁 the iic control demo source for the NEC mcu
💻 BAK
字号:

#pragma sfr
#pragma di
#pragma ei
#pragma nop
#pragma interrupt INTIIC0  IIC_Interrupt

#include  "serial_config.h"

unsigned char IIC_Slave_Receive_StartFlag = 0;
unsigned char IIC_Slave_StartFlag = 0;


void IIC0_Init()
{
   
   IIC_Operation_Disable();
   
   IICMK0 = 1;
   
   IIC_SCL0_Port_Mode = output;
   IIC_SDA0_Port_Mode = output;
   IIC_SCL0_Port_Level = low;
   IIC_SDA0_Port_Level = low;
   
   IICF0 = 0x03;
   IICC0 = 0x10;
   
   IIC_Clk_Select();
   
//   SVA0 = IIC_Local_Address; 
   
//   IIC_Operation_Enable();
   
//   IICC0 = IIC_StopCondition_Interrupt + IIC_Interrupt_Clock_Number + IIC_ACK_Enable + 0x80;

//   IICF0 = IIC_Start_Condition_WithoutStopDetect + IIC_Communication_Reservation_Disable;
   
   IIC_Interrupt_Enable();
   
}

void IIC_SlaveStart()
{
	if( IIC_Local_Address & 1 ){
		return ;	    /* bit0 isn't 0 */
	}
	IICC0 = 0x9c;		/* start transfer */
	SVA0 = IIC_Local_Address; 			/* set slave address */
}
	

void IIC0_Stop( void )
{
    IICE0 = 0;		/* stop transfer */
}



void IIC0_SlaveHandler()
{
/* control for stop condition */
	if( IICS0 & 0x01 ){					/* get stop condition */
		                                /* slave send end and get stop condition */
		if( IIC_Slave_StartFlag &&( IIC_Slave_SendCount == 0 ) ){
			return;
		} else {
			return;
		}
	}

	/* control for get address */
	if( IIC_Slave_StartFlag == 0 ){
		if( !(IICS0 & 0x20) ){			/* check EXC0 -> external code */
			if( IICS0 & 0x10 ){			/* check COI0 -> address */
				IIC_Slave_StartFlag = 1;
			//	CALL_IIC0_SlaveAddressMatch();	/* slave address match */
			}
			else{
				//CALL_IIC0_SlaveError(MD_ERROR);
				return;
			}
		}
		else{
		//	CALL_IIC0_SlaveError( MD_ERROR );
			return;
		}
	}

	/* slave send control */
 if( IICS0 & 0x08 ){
        WTIM0 = 1;   /////////
		if(!( IICS0 & 0x04 )){			/* check ACKD0 -> acknowledge */
			WREL0 = 1;
			return;
		}
		IIC0 = *IIC_Slave_SendBuf ++ ;
		IIC_Slave_SendCount --;
	}
	/* slave receive control */
	else{
		WTIM0 = 0;
	//	ACKE0 = 1;
		WREL0 = 1;				/* WREL1 = 1 start receive */
		*IIC_Slave_ReceiveBuf ++ = IIC0;
		IIC_Slave_ReceiveCount--;
	//	WREL0 = 1;				/* WREL1 = 1 start receive */
		if( IIC_Slave_ReceiveCount == 0 ){			/* check all data received */
			ACKE0 = 0;			/* clear ACKE0 */
		}
	}

}

void main()
{
  DI();
  PCC = 0x00; 
  IIC0_Init();	
  
  IIC_SlaveStart();
  
  EI();
   
  while(1);
  
}

__interrupt void IIC_Interrupt()
{
	
  if(!( IICS0 & 0x80) ) {
		IIC0_SlaveHandler();
	}
	else {
		return;
	}
		
}

⌨️ 快捷键说明

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