iic.c

来自「本程式通过4*4键盘的输入控制步进马达的正转和反转,停止转动以及加速和减速.」· C语言 代码 · 共 105 行

C
105
字号

/* ---------------------GESTIONE BUS I2C--------------------- */
/* Author : toniobr		Date : 11/2003 						  */
/* ---------------------------------------------------------- */

#include	<pic.h>
#include	"delay.h"
#define PORTBIT(adr,bit)	((unsigned)(&adr)*8+(bit))

static bit SCL @ PORTBIT(PORTA,0);		//porta per i dati rx e tx
static bit SDA @ PORTBIT(PORTA,1);		//porta per il clock
static bit TRISA_SDA @ PORTBIT(TRISA,1);


#define TCLOCK 5	// 0-255 uSec (5 uS equivale a una frequenza di 100 Khz)

/*Comando start*/
iic_start()
{	
	TRISA_SDA=0;		
	SDA=1;
	SCL=1;
	DelayUs(TCLOCK);
	SDA=0;
	DelayUs(TCLOCK);
	SCL=0;
	DelayUs(TCLOCK);
}

/* Comando stop*/
iic_stop()
{		
	TRISA_SDA=0;
	SCL=1;
	DelayUs(TCLOCK);
	SDA=1;
}

/* Legge lo stato del bit di acknoveldge*/
char iic_r_ack()
{		
	TRISA_SDA=1;
	SCL=1;
	DelayUs(TCLOCK);
	if(!SDA){
		SCL=0;
		DelayUs(TCLOCK);
		return 0;
	}
	else{
		SCL=0;
		DelayUs(TCLOCK);
		return 1;
	}
}

/* Invia il bit di ack */
iic_w_ack(char value)
{		
	TRISA_SDA=0;
	SDA=value;
	SCL=1;
	DelayUs(TCLOCK);
	SCL=0;
	DelayUs(TCLOCK);
}

/* Scrive su un device*/
iic_write(char value)
{		
	char i;
	TRISA_SDA=0;
	for(i=1;i<=8;i++)	//invia gli 8 bit
	{
		//SDA=(bit)(value & 0b10000000);		//msb first  da provare
		if (value&0b10000000)
			SDA=1;
		else
			SDA=0;
		value=value<<1;
		SCL=1;
		DelayUs(TCLOCK);
		SCL=0;
		DelayUs(TCLOCK);
	}	
}

/* Legge da un device*/
char iic_read()
{		
	char i;
	char value=0;
	TRISA_SDA=1;
	for(i=1;i<=8;i++)	//riceve gli 8 bit
	{
		SCL=1;
		value=value<<1;
		value|=SDA;		//msb first
		DelayUs(TCLOCK);
		SCL=0;
		DelayUs(TCLOCK);
	}
	return value;
}

⌨️ 快捷键说明

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