//以下是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寫數(shù)據(jù)后 讀I2C回應(yīng)0為OK 1為錯誤要重寫===============
void I2C_ACK(void)
{
DDRB&=0xFB;//設(shè)PB2為輸入
PORTB|=0x4;//設(shè)PB2為上拉
delay_nus(5);
SCL_3H;
delay_nus(5);
bit_flag=0;//清標(biāo)志
if(PINB&0x4) bit_flag=1;
// yu:goto yu;
DDRB|=0x4;//設(shè)PB2為輸出
//PORTB&=0xFB;//設(shè)PB2輸出為0
delay_nus(5);
SCL_3L;
}
//=======向I2C讀數(shù)據(jù)后向I2C回應(yīng)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讀數(shù)據(jù)后向I2C回應(yīng)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位數(shù)據(jù)==================
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寫數(shù)據(jù)=======================
void wr_nbyte(unchar COMMAN,unchar DATA)//寫音量指令
{ //數(shù)據(jù) 指令
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();//結(jié)束I2C
//================
}