void IIC_Init(void)
{
SCL_DIR = 0;
SDA_DIR = 0;
SCL_PIN = 1;
SDA_PIN = 1;
}
void IICstart(void)
{
SCL_DIR = 0;
SDA_DIR = 0;
SDA_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SDA_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
void IICstop(void)
{
SCL_DIR = 0;
SDA_DIR = 0;
SDA_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SDA_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
void IICsend(unsigned char data)
{
unsigned char i=8,n;
SCL_DIR = 0;
SDA_DIR = 0;
for(n=0; n<8; n++)
{
SDA_PIN = 0;
if(data&0x80)
{
SDA_PIN = 1;
}
data = data << 1;
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
}
unsigned char IICreceive(void)
{
unsigned char i=8;
unsigned char data=0;
SCL_DIR = 0;
SDA_DIR = 1;
while(i)
{
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
data<<=1;
data|=SDA_PIN ;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
i--;
}
SCL_PIN = 0;
return(data);
}
void IICreadack(void)
{
SDA_PIN = 0;
SDA_DIR = 1;
if(SDA_PIN == 1)
{
for(;;) ;//NACK
}
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SDA_DIR = 0;
SDA_PIN = 0;
}
void IICsendack(void)
{
SCL_DIR = 0;
SDA_DIR = 0;
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SDA_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
void IICsendNack(void)
{
SCL_DIR = 0;
SDA_DIR = 0;
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SDA_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 1;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
SCL_PIN = 0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
//************以下两个函数基于文件夹“TCA6424 SCAN5 51(pudn)”***********//
void wr_IIC(char a,char b,char c,char d)
{
unsigned char command;
IICstart();
command=0x44;
IICsend(command);
IICreadack();
IICsend(a);
IICreadack();
IICsend(b);
IICreadack();
IICsend(c);
IICreadack();
IICsend(d);
IICreadack();
IICstop();
}
unsigned char rd_IIC(char a)
{
unsigned char i,command,com_data;
IICstart();
command=0x44;
IICsend(command);
IICreadack();
IICsend(a);
IICreadack();
IICstart();
command=0x45;
IICsend(command);
IICreadack();
com_data = IICreceive();
IICsendNack();
IICstop();
return(com_data);
}
这套程序是刚做的时候用的测试程序,还是能用的,开发难点在IIC