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

📄 iic.c

📁 7寸TFT电视的源程序
💻 C
字号:
#include "target.h"

#define I2C_DELAY_TIME				8
#define CHECK_I2C_ACK_TIME			200

#define iic_ClrSda()		Clr_P1_5()
#define iic_SetSda()		Set_P1_5()
#define iic_ClrScl()		Clr_P1_4()
#define iic_SetScl()		Set_P1_4()

#define iic_GetSda()		Get_P1_5()


#include "iiccore.c"

/*******************************************************************
	send bytes to I2c device
	addr: 	Slave device address
	subadr: Sub address 
	ptrdata: point a buffer which to been send
	len:the length of data which to be send
*******************************************************************/
unsigned char iic_WriteBytes(unsigned char addr,unsigned char subadr,unsigned char *ptrdata,unsigned char len)
{
	unsigned char ack;
	unsigned char i;

	ShowLcdHex(0x40,addr);

	iic_StartCode();

	iic_SendData(addr&0xfe);
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	iic_SendData(subadr);
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}
	ShowLcdHex(0x44,subadr);

	for(i=0;i<len;i++){
		iic_SendData(ptrdata[i]);
		ack = iic_CheckAck();

		if( !ack )
		{
			return FALSE;
		}
		ShowLcdHex(0x46+2*i,ptrdata[i]);
	}

	iic_StopCode();

	return TRUE;
}

/*******************************************************************
	send one byte to I2c device
	addr: 	Slave device address
	subadr: Sub address 
	ucdata: data to been send
*******************************************************************/
unsigned char iic_WriteByte(unsigned char addr,unsigned char subadr,unsigned char ucdata)
{
	return iic_WriteBytes(addr,subadr,&ucdata,1);
}

/*******************************************************************
	Read data from I2c Slave device
	addr: 	Slave device address
	subadr: Sub address 
	ptrdata: point a buffer that store one unsigned char data
	len:the length of data which to be read
*******************************************************************/
#if 0
unsigned char iic_ReadBytes(unsigned char addr,unsigned char subadr,unsigned char* ptrdata,unsigned char len)
{
	unsigned char i;
	unsigned char ack;

	iic_StartCode();

	iic_SendData(addr & 0xfe);	// write sub address
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	iic_SendData(subadr);
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}
	iic_StartCode();		// re-start

	iic_SendData(addr | 0x01);	// read data
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	for(i=0;i<len;i++){
		ptrdata[i] = iic_GetData();
		if(i!=len-1)
			iic_SendAck();
	}

	iic_SendUnack();		//last byte should send unack to stop the process
	iic_StopCode();

	return TRUE;
}
#endif
/*******************************************************************
	Read data from I2c Slave device
	addr: 	
	subadr: Sub address 
	ptrdata: point a buffer that store one unsigned char data
*******************************************************************/
#if 0 //
unsigned char iic_ReadByte(unsigned char addr,unsigned char* ptrdata)
{
	unsigned char ack;

	iic_StartCode();
	iic_SendData(addr | 0x01);	// read data
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	*ptrdata =  iic_GetData();

	iic_SendUnack();		//last byte should send unack to stop the process
	iic_StopCode();

	return TRUE;
}
#endif
/*
	Following is for EEprom function
*/

unsigned char WriteEepromBytes(unsigned char subadr,unsigned char *ptrdata,unsigned char len)
{
	unsigned char ack;
	unsigned char i;
	unsigned char code addr = 0xa0;
	for(i = 0;i<10;i++){
		iic_StartCode();

		iic_SendData(addr&0xfe);
		ack = iic_CheckAck();
		if( ack )
			break;
	}
	if(i>=10)
		return FALSE;
	iic_SendData(subadr);
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	for(i=0;i<len;i++){
		iic_SendData(ptrdata[i]);
		ack = iic_CheckAck();

		if( !ack )
		{
			return FALSE;
		}
	}

	iic_StopCode();

	return TRUE;
}


unsigned char ReadEepromBytes(unsigned char subadr,unsigned char* ptrdata,unsigned char len)
{
	unsigned char i;
	unsigned char ack;
	unsigned char code addr = 0xa0;

	for(i = 0;i<10;i++){
		iic_StartCode();

		iic_SendData(addr&0xfe);
		ack = iic_CheckAck();
		if( ack )
			break;
	}
	if(i>=10)
		return FALSE;

	iic_SendData(subadr);
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}
	iic_StartCode();		// re-start

	iic_SendData(addr | 0x01);	// read data
	ack = iic_CheckAck();
	if( !ack )
	{
		return FALSE;
	}

	for(i=0;i<len;i++){
		ptrdata[i] = iic_GetData();
		if(i!=len-1)
			iic_SendAck();
	}

	iic_SendUnack();		//last byte should send unack to stop the process
	iic_StopCode();

	return TRUE;
}

#ifdef __AT24C02_TEST__

void Test24c02(unsigned int uikey)
{
	static unsigned char addr = 0;
	unsigned char uctemp;
	unsigned char i;
	switch(uikey){
		case EJECT_KEY:
			for(i=0;i<16;i++){
				uctemp = addr+i;
				WriteEepromBytes(addr+i,&uctemp,1);
			}
		break;
		case UP_KEY:
			addr += 16;
			ShowLcdHex(0x24,addr);
			break;
		case DOWN_KEY:
			addr -= 16;
			ShowLcdHex(0x24,addr);
			break;

		case ENTER_KEY:
			for(i=0;i<16;i++){
				uctemp = 0xff;
				ReadEepromBytes(addr+i,&uctemp,1);
				ShowLcdHex(0x40+i*2,uctemp);
			}
			ShowLcdHex(0x24,addr);
			break;
	}
}
#endif

⌨️ 快捷键说明

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