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

📄 lly.c

📁 数码管 按键芯片zlg7290的atmega128 的c语言程序
💻 C
字号:
/*
函数:TWI_Puts()
功能:I2C总线综合发送函数,向从机发送多个字节的数据
参数:
	SlaveAddr:从机地址(7位纯地址,不含读写位)
	SubAddr:从机的子地址
	SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
	*dat:要发送的数据
	Size:数据的字节数
返回:
	0:发送成功
	1:在发送过程中出现异常
说明:
	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
	当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
*/
uchar TWI_Puts(unsigned char SlaveAddr,
    unsigned int SubAddr,
	unsigned char SubMod,
	char *dat,
	unsigned int Size
)
{
   	unsigned char i;
	char a[3];
//检查长度
	if ( Size == 0 ) return 0;
//准备从机地址
	a[0] = (SlaveAddr << 1);
//检查子地址模式
	if ( SubMod > 2 ) SubMod = 2;
//确定子地址
	switch ( SubMod )
	{
	case 0:
		break;
	case 1:
		a[1] = (char)(SubAddr);
		break;
	case 2:
		a[1] = (char)(SubAddr >> 8);
		a[2] = (char)(SubAddr);
		break;
	default:
		break;
	}
	SubMod++;
	Start();
	Wait();
	if(TestACK()!=START)
	{
	   return 0;
	}
	for ( i=0; i<SubMod; i++ )
	{
		Writebyte(a[i]);
	    Wait();
	    if(TestACK()!=SLA_W_ACK)
	    {
	      return 0;
	    }
	}
//发送数据
	do
	{
		Writebyte(*dat++);
	    Wait();
	    if(TestACK()!=SLA_W_ACK)
	    {
	      return 0;
	    }
	} while ( --Size != 0 );
//发送完毕,停止I2C总线,并返回结果
	Stop();
	delay(10);
	if ( Size == 0 )
	{
		return 0;
	}
	else
	{
		return 1;
	}
}


/*
函数: TWI_Gets()
功能:I2C总线综合接收函数,从从机接收多个字节的数据
参数:
	SlaveAddr:从机地址(7位纯地址,不含读写位)
	SubAddr:从机的子地址
	SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
	*dat:保存接收到的数据
	Size:数据的字节数
返回:
	0:接收成功
	1:在接收过程中出现异常
说明:
	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
	当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
*/
uchar TWI_Gets
(
	unsigned char SlaveAddr,
	unsigned int SubAddr,
	unsigned char SubMod,
	char *dat,
	unsigned int Size
)
{
//定义临时变量
	unsigned char i;
	uchar a[3];
//检查长度
	if ( Size == 0 ) return 0;
//准备从机地址
	a[0] = (SlaveAddr << 1);
//检查子地址模式
	if ( SubMod > 2 ) SubMod = 2;
//如果是有子地址的从机,则要先发送从机地址和子地址
	if ( SubMod != 0 )
	{
	//确定子地址
		if ( SubMod == 1 )
		{
			a[1] = (char)(SubAddr);
		}
		else
		{
			a[1] = (char)(SubAddr >> 8);
			a[2] = (char)(SubAddr);
		}
	//发送从机地址,接着发送子地址
		SubMod++;
		Start();
	    Wait();
	    if(TestACK()!=START)
	     {
	       return 0;
	     }
		for ( i=0; i<SubMod; i++ )
	     {
		   Writebyte(a[i]);
	       Wait();
	       if(TestACK()!=SLA_R_ACK)
	        {
	          return 0;
	        }
	     }
	}
//这里的I2C_Start()对于有子地址的从机是重复起始状态
//对于无子地址的从机则是正常的起始状态
	/*Start();
	Wait();
    if(TestACK()!=START)
	 {
	    return 0;
	 }
//发送从机地址
	Writebyte(a[0]+1);
	Wait();
	if(TestACK()!=SLA_R_ACK)
	{
	     return 0;
	}
//接收数据*/
	for (;;)
	{
		*dat++ = TWDR;
		TWCR=(1<<TWINT)|(1<<TWEN);
		Wait();
	    if(TestACK()!=DATA_R_ACK)
	     {
	       return 0;
	     }
		if ( --Size == 0 )
		{
			break;
		}
	}
//接收完毕,停止I2C总线,并返回结果
	Stop();
	return 0;
}

⌨️ 快捷键说明

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