📄 iic.c
字号:
#include "stc51reg.h"
#include <intrins.h>
extern void delay (unsigned int delaydata);
//************************************************************
void config()
{
WDT_CONTR = 0x00; // Watchdog Timer Control Register
}
//初始化单片机,
//***********************************************************
//***********************************************************
unsigned char send(unsigned char _data1,unsigned char _data2,unsigned char _data3)
{
unsigned char i;
clk=1; // start
delay(1);
sda=0;
delay(1);
clk=0;
delay(1);
i=0;
if(_data1&0x80)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x40)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x20)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x10)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x08)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x04)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x02)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data1&0x01)
sda=1;
else
sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
clk=1; //ack
delay(1);
clk=0;
delay(1);
if(_data2&0x80)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x40)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x20)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x10)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x08)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x04)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x02)
{
sda=1;
}
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data2&0x01)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
clk=1; //ack
delay(1);
clk=0;
delay(1);
if(!(_data1&0x01))
{
if(_data3&0x80)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x40)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x20)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x10)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x08)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x04)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x02)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
if(_data3&0x01)
sda=1;
else sda=0;
delay(1);
clk=1;
delay(1);
clk=0;
delay(1);
clk=1; //ack
delay(1);
clk=0;
delay(1);
sda=0;//stop bit
delay(1);
clk=1;
delay(1);
sda=1;
}
else
{
clk=1;
delay(1);
if(sda)
i=i+128;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+64;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+32;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+16;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+8;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+4;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+2;
clk=0;
delay(1);
clk=1;
delay(1);
if(sda)
i=i+1;
clk=0;
delay(1);
sda=0;
delay(1);
clk=1; //ack
delay(1);
clk=0;
delay(1);
sda=0;//stop bit
delay(1);
clk=1;
delay(1);
sda=1;
}
return i;
}
//模拟SPI时序,data1,data2是写入的两个数据,这里仅返回第二个数据
//*************************************************************************
//*************************************************************************
void write_reg(unsigned char port,unsigned char reg,unsigned char dat)
{
send(0x90,(((port-1)<<4)+reg),dat);
}
//写寄存器,port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据
//*************************************************************************
//*************************************************************************
unsigned char read_reg(unsigned char port,unsigned char reg)
{
return send(0x91,(((port-1)<<4)+reg),0x00);
}
//读寄存器,琾ort为子串口的路数,reg为寄存器的地址,返回寄存器的值
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -