//以下是TDA7449D——I2C程序
#include
#include
#include "ls.h"
unchar bit_flag;
//=======以下是启动I2C===============
void I2C_start(void)
{
SDA_3H;
delay_nus(5);
SCL_3H;
delay_nus(5);
SDA_3L;
delay_nus(5);
SCL_3L;
}
//=======以下是停止I2C===============
void I2C_stop(void)
{
SDA_3L;
delay_nus(5);
SCL_3H;
delay_nus(5);
SDA_3H;
delay_nus(5);
SCL_3L;
}
//=======向I2C写数据后 读I2C回应0为OK 1为错误要重写===============
void I2C_ACK(void)
{
DDRB&=0xFB;//设PB2为输入
PORTB|=0x4;//设PB2为上拉
delay_nus(5);
SCL_3H;
delay_nus(5);
bit_flag=0;//清标志
if(PINB&0x4) bit_flag=1;
// yu:goto yu;
DDRB|=0x4;//设PB2为输出
//PORTB&=0xFB;//设PB2输出为0
delay_nus(5);
SCL_3L;
}
//=======向I2C读数据后向I2C回应0为正确===============
void i2c_mack (void)
{
//SDA_1L;
//SDA_2L;
SDA_3L;
asm("nop");
//SCL_1H;
//SCL_2H;
SCL_3H;
asm("nop");
//SCL_1L;
//SCL_2L;
SCL_3L;
}
//=======向I2C读数据后向I2C回应0为错误===============
void i2c_mnack (void)
{
//SDA_1H;
//SDA_2H;
SDA_3H;
asm("nop");
//SCL_1H;
//SCL_2H;
//SCL_3H;
asm("nop");
//SCL_1L;
//SCL_2L;
SCL_3L;
}
//===================向I2C写8位数据==================
void I2C_wrbyt(unchar byte_data)
{
unchar i;
for(i=0;i<8;i++)
{
if(byte_data&0x80)
{
SDA_3H;
delay_nus(5);
SCL_3H;
delay_nus(5);
SCL_3L;
delay_nus(5);
}
else
{
SDA_3L;
delay_nus(5);
SCL_3H;
delay_nus(5);
SCL_3L;
delay_nus(5);
}
byte_data<<=1;
delay_nus(5);
}
}
//==================向I2C写数据=======================
void wr_nbyte(unchar COMMAN,unchar DATA)//写音量指令
{ //数据 指令
cl:I2C_start();//启动I2C
I2C_wrbyt(0x88);//写入芯片地址
I2C_ACK();
if(bit_flag!=0)goto cl;
I2C_wrbyt(COMMAN);//指令输入选择
I2C_ACK();
if(bit_flag!=0)goto cl;
I2C_wrbyt(DATA);
I2C_ACK();
if(bit_flag!=0)goto cl;
I2C_stop();//结束I2C
//================
}