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

📄 slave.c

📁 pic16 i2c slave (picc)
💻 C
字号:
#include	<pic.H>
#include    "delay.h"

//#define SIMPLE_TEST
//------------------------------------------------------
//
//			[---__----]
//		RA2 [         ] RA1
//		RA3 [		  ] RA0
//		RA4 [         ] RA7
//      RA5 [         ]	RA6
//      VSS [         ] VDD
//      RB0 [int      ] RB7
//      RB1 [         ] RB6
//      RB2 [TU       ] RB5 SDA
//      RB3 [PWM      ] RB4 SCL
//          [---------]

#define		IDLE			0
#define		WAIT_START 		1
#define		START_RECIEV	2
#define		RECIVE			3
#define		NEXT_BYTE		4
#define     ACK             5
#define     WAIT_STOP       6

#define     TURBO_PIN   RB2
#define     TURBO_DIR   TRISB2
#define     SCL		RB4
#define     SDA     RB5
#define     SCL_DIR		TRISB4	
#define     SDA_DIR     TRISB5
// change pins on the 24/2/07 from RA0,RA1
#define     INPUT		1
#define     OUTPUT      0
unsigned char I2C_STAT,Bptr,BitCount,adress,t0cnt,ft,ft1;
unsigned char B[4];
bit t0flag,turboflag;

unsigned char cont_mode,flash_mode,flash_time,pwr_mode;
//eeprom adress
#define 	CONT_ADR	0
#define     FLASH_ADR   1
#define     TIME_ADR    2
//controls
#define     SET_CONT	0x10
#define     SET_FLASH   0x20
#define     SET_TIME    0x30
#define     OFF         0x40
#define     ON          0x50
#define     TURBO       0x60	
//*********************************
#define     READ_CONT   0x10
#define     READ_FLASH  0x20
#define     READ_TIME   0x30

 	

bit I2C_CMD,NEW_TASK;
void I2CLOOP(void);
#define			READ	1
#define         WRITE   0

__CONFIG  ( MCLREN & UNPROTECT & WDTDIS & PWRTEN & INTIO & LVPDIS  & BORDIS); 
//__CONFIG  ( UNPROTECT & WDTDIS & PWRTEN  & LVPDIS  & BOREN & XT); 

#define     FCPU     4000000
#define     FPWM	 20000
#define 	PERIOD	 1/FPWM
#define     PR2VAL   50//PERIOD*FCPU/4
#define     DUTY    10



void interrupt isr(void)
{
	unsigned char CCP1CON_T,CCPR1L_T;
	if(INTE && INTF)
	{
		INTF=0;
			CCPR1L_T = CCPR1L;		//save pwm value 
			CCP1CON_T = CCP1CON;	//save pwm value 
			CCPR1L = flash_mode >> 2;  
			if (flash_mode & 0x02) CCP1X = 1;
			else
			CCP1X = 0;
			if (flash_mode & 0x01) CCP1Y = 1;
			else
			CCP1Y = 0;
		if (!turboflag)
		{  
			while (!RB0)
			{}
		}
		else
		{
		TURBO_PIN = 1;
		for (ft = 0;ft < flash_time;ft ++)//time = flash_time *2msec
		{
			for (ft1 = 0;ft1 < 0xf0;ft1++)
			{
			#asm
			nop

			#endasm
			}
		}
		TURBO_PIN = 0;	
		while (!RB0)
			{}
		}
			CCPR1L = CCPR1L_T;
			CCP1CON = CCP1CON_T;
		
	}
	if (T0IE && T0IF)
	{
	T0IF = 0;
	TMR0 = 100;//200us interrupt
//	TMR0 = 247;//42us interrupt
	t0flag = 1;
	t0cnt++;
	if (t0cnt > 100) 
	{

		t0cnt = 0;
	}
	}

	
}

void EESAVE(unsigned char adrr,unsigned char data)
{
	EEADR = adrr;
	EEDATA = data;
//	EEPGD = 0;
	WREN = 1;
	GIE = 0;
	EECON2 = 0x55;
	EECON2 = 0xaa;
	WR = 1;
	GIE = 1;
	WREN = 0;
	while (WR)
	{
	}
}

unsigned char EEREAD(unsigned char adrr)
{
	EEADR = adrr;
//	EEPGD = 0;
	RD = 1;
	return EEDATA;
}
void I2CLOOP(void)
{
	switch (I2C_STAT)
	{
		case IDLE:
			if ((SCL) && (SDA)) 
			{
			I2C_STAT = WAIT_START;
			Bptr = 0;
			BitCount = 0;
			}
			break;
		case WAIT_START:
			if ((SCL) && (!SDA)) 
			{
			I2C_STAT = START_RECIEV;
			}
			break;
		case START_RECIEV:
			if (!SCL) 
			{
			I2C_STAT = RECIVE;
			}
			if ((SDA) && (SCL))
			{
			I2C_STAT = IDLE;
			}
			break;
		case RECIVE:
			if (SCL) 
			{
				if (BitCount++ == 8) 
				{
					I2C_STAT = ACK;
				}
				else
				{ 
					I2C_STAT = NEXT_BYTE;
         			B[Bptr] <<= 1;
					if	(SDA) B[Bptr]+=0x01; 
					if (BitCount == 8)
					{
						if ((B[0] & 0x0e) == adress)
						{
							if (B[0] & 0x80) I2C_CMD = READ;
							else
							{
								I2C_CMD = WRITE;
							}
							SDA = 0;
	//						SDA_DIR = OUTPUT;  temporary down
							RA3 = 0;
						}
						else
						{
							I2C_STAT = IDLE;
						}	
					}
				}
			}
			break;
		case NEXT_BYTE:
			if (!SCL) 
			{
				I2C_STAT = RECIVE;
			}	
			break;
		case ACK:				

			if (!SCL)
			{
				I2C_STAT = RECIVE;
				BitCount = 0;
				Bptr ++;
				SDA_DIR = INPUT;
				if (Bptr == 3) 	
				I2C_STAT = WAIT_STOP;
			}

			break;
		case WAIT_STOP:				
			if (SCL)
			{
				I2C_STAT = IDLE;
				NEW_TASK = 1;
			}

			break;
	 }
}


void main(void)
{
	unsigned char t,t1,q;
CMCON = 0xff;
T0CS = 0;
PSA = 0;//prescale for timer0
PS0 = 0;
PS1 = 0;
PS2 = 0;
//ADCON1 = 0x07;
adress = 0x00;
Bptr = 0;
TRISA=0xff;
TRISB3 = 0;
TURBO_DIR = 0;
RA3 = 1;
NEW_TASK = 0;
T2CON = 0;
TMR2ON = 1;
CCP1M3 = 1;
CCP1M2 = 1;
PR2 = PR2VAL;
RBPU = 0; //set pull ups
SCL_DIR = 1;
SDA_DIR = 1;
INTEDG = 0; //interrup on falling EDGE
INTE = 1; //enable interrupt on RB0
T0IF = 0;
T0IE = 1; //enable tmr0 int
GIE = 1;
cont_mode = EEREAD(CONT_ADR);
flash_mode = EEREAD(FLASH_ADR);
flash_time = EEREAD(TIME_ADR);
/*
	CCPR1L = cont_mode >> 2;
	if (cont_mode & 0x02) CCP1X = 1;
	else
	CCP1X = 0;
	if (cont_mode & 0x01) CCP1Y = 1;
	else
	CCP1Y = 0;
*/
			CCPR1L = 0;
			CCP1X = 0;
			CCP1Y = 0; 

#ifdef SIMPLE_TEST  
			CCPR1L = 0xb;
			CCP1X = 0;
			CCP1Y = 0; 
#endif
//RC3 = 0;
//TRISC3 = 0;
turboflag = 0;
//flash_time = 100;



while(1)
{

if 	(t0flag) 
{
	I2CLOOP();
	t0flag = 0;
}
	I2CLOOP();
if (NEW_TASK)
{
	NEW_TASK = 0;
	switch (B[0] & 0xf0)
	{
		case     SET_CONT:
			EESAVE(CONT_ADR,B[2]);		//saves the value recived
			cont_mode = B[2];
			CCPR1L = B[2] >> 2;
			if (B[2] & 0x02) CCP1X = 1;
			else
			CCP1X = 0;
			if (B[2] & 0x01) CCP1Y = 1;
			else
			CCP1Y = 0;  
			break;
		case     SET_FLASH: 
			if (B[2] != 0) 
			{
				EESAVE(FLASH_ADR,B[2]);
				flash_mode = B[2]; 
			}
			else
			{ 
				EESAVE(FLASH_ADR,cont_mode);//store the value of the light if 0 else store value
				flash_mode = cont_mode;
			}   
			break;
		case     SET_TIME:   
			EESAVE(TIME_ADR,B[2]);		// save time
			flash_time = B[2];
			break; 
		case     OFF:
			CCPR1L = 0;
			CCP1X = 0;
			CCP1Y = 0;   
			break;       
		case     ON:   
			CCPR1L = cont_mode >> 2;
			if (cont_mode & 0x02) CCP1X = 1;
			else
			CCP1X = 0;
			if (cont_mode & 0x01) CCP1Y = 1;
			else
			CCP1Y = 0;  		    
			break;
		case     TURBO:   
			if (B[2] == 0)
			turboflag = 0;
			else
			turboflag = 1;

		default:
			break;
	}    

}
}



}

⌨️ 快捷键说明

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