📄 i2c.c
字号:
/*======================================================================================*/
#pragma sfr
#define SDA P5.1//P2.1
#define SCL P5.0// P2.2
unsigned char Savedate[7];
unsigned char Senddate[7];
extern unsigned char D_TMPset,M_MODset,C_Settime,M_FANset,D_TMPsetp,C_SettimeB;
extern sreg unsigned char M_flag;
#define f_rmtok M_flag.0 //remote signal receive ok
#define f_PWRon1 M_flag.1 //power on flag
extern sreg unsigned char M_flag;
#define f_rmtok M_flag.0 //remote signal receive ok
extern sreg unsigned char M_flag4;
#define f_SLEEP M_flag4.7
extern sreg unsigned char flag;
#define f_settm flag.2
extern sreg unsigned char M_flag;
#define f_ton M_flag.3 //time set of power on
#define f_toff M_flag.4
extern sreg unsigned char M_flag;
#define f_iicen M_flag.6
void S_datepro(void);
/*======================================================================================*/
void Delay_Time()
{
register unsigned char i;
for(i=0;i<2;i++) {}
}
/*======================================================================================*/
//I2c Start bit
//__|---
//_|--|_
/*======================================================================================*/
void Start_S()
{
PM5.0=0;PM5.1=0;// PM1=0xfc;
Delay_Time();
SCL = 1;
Delay_Time();
SDA = 1;
Delay_Time();
SCL = 1;
Delay_Time();
SDA = 0;
Delay_Time();
}
/*======================================================================================*/
//Send a byte to I2C
/*======================================================================================*/
void Data_S(unsigned char byte)
{
SCL = 0;PM5.1=0;PM5.0=0;// PM2.1=0;PM2.2=0;//PM1=0xfc;
Delay_Time(); SDA = ((byte & 0x80)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 1*/
Delay_Time(); SDA = ((byte & 0x40)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 2*/
Delay_Time(); SDA = ((byte & 0x20)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 3*/
Delay_Time(); SDA = ((byte & 0x10)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 4*/
Delay_Time(); SDA = ((byte & 0x08)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 5*/
Delay_Time(); SDA = ((byte & 0x04)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 6*/
Delay_Time(); SDA = ((byte & 0x02)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
SCL = 0;/*bit 7*/
Delay_Time(); SDA = ((byte & 0x01)!=0);
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
}
/*======================================================================================*/
//get a ack from I2C
/*======================================================================================*/
unsigned char A_S()
{
unsigned char sda;
SCL = 0;PM5.1=1;PM5.0=0;// PM2.1=1;PM2.2=0;//PM1=0xfd;
Delay_Time();
Delay_Time();
SCL = 1; sda = SDA;
Delay_Time();
Delay_Time(); return(sda);
}
/*======================================================================================*/
//I2c Stop bit
//__|--
// __|-
/*======================================================================================*/
void Stop_S()
{
PM5.1=0;
PM5.0=0;//PM2.1=0;PM2.2=0;//PM1=0xfc;
Delay_Time();
SCL = 0;
Delay_Time();
SDA = 0;
Delay_Time();
SCL = 1;
Delay_Time();
SDA = 1;
PM5.0=0;
PM5.1=1;
}
/*======================================================================================*/
//get a byte
/*======================================================================================*/
sreg unsigned char c;
unsigned char Data_G()
{
SCL = 0;PM5.1=1;PM5.0=0;//PM2.1=1;PM2.2=0;// PM1=0xfd;
Delay_Time();
Delay_Time();
SCL = 1; c.7 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.6 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.5 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.4 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.3 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.2 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.1 = SDA;
Delay_Time();
Delay_Time();
SCL = 0;
Delay_Time();
Delay_Time();
SCL = 1; c.0 = SDA;
Delay_Time();
Delay_Time();
return c;
}
/*======================================================================================*/
//no ack to I2C
/*======================================================================================*/
void noA_S()
{
SCL = 0;PM5.1=0;PM5.0=0;// PM2.1=0;PM2.2=0;//PM1=0xfc;
SDA = 0;
Delay_Time();
Delay_Time();
SCL = 1;
Delay_Time();
Delay_Time();
}
/*======================================================================================*/
void I2C_Get()
{unsigned char F_ack=1,i,F_Geten=0;
Start_S();
Data_S(0xa0);
F_ack=A_S();
for(i=0;i<200;i++)
{
if(!F_ack)
{Data_S(0x00);
F_ack=1;
break;
}
else
{if(i>150)
return;
}
}
Start_S();
Data_S(0xa1);
F_ack=A_S();
for(i=0;i<200;i++)
{
if(!F_ack)
{F_Geten=1;
break;
}
else
{if(i>150)
return;
}
}
if(F_Geten)
{
F_Geten=0;
for(i=0;i<=5;i++)
{
Savedate[i]=Data_G();
if(i>=5)
{ S_datepro();
return;
}
else
noA_S();
}
}
}
//================================================
void S_datepro()
{register unsigned char k,reg1 ;
for(k=0;k<=5;k++)
{
reg1+=Savedate[k];
}
if(Savedate[6]==reg1);
{
M_MODset=Savedate[0];
D_TMPset=Savedate[1];
M_FANset=Savedate[2];
C_SettimeB=C_Settime=Savedate[3];
D_TMPsetp=Savedate[4];
reg1=Savedate[5];
reg1&=0b00000001;
if(reg1==1)
f_PWRon1=1;
reg1=Savedate[5];
reg1&=0b00000010;
if(reg1==2)
f_SLEEP=1;
reg1=Savedate[5];
reg1&=0b00000100;
if(reg1==4)
f_settm=1;
if(C_Settime!=0)
{
if(f_SLEEP)
{
f_PWRon1=1;
f_toff=1;
}
if(f_settm)
{
f_PWRon1=0;
f_ton=1;
}
}
}
}
//================================================
void I2C_Sent()
{register unsigned char F_ack=1,i,j=0,Sendbuf=0,reg1,k=0;
if(f_iicen)
{ f_iicen=0;
//Senddate[0]=0xf9;
Senddate[0]=M_MODset;
Senddate[1]=D_TMPset;
Senddate[2]=M_FANset;
Senddate[3]=C_SettimeB;
Senddate[4]=D_TMPsetp;
if(f_PWRon1)
Senddate[5]=1;
else
Senddate[5]=0;
if(f_SLEEP)
Senddate[5]+=2;
if(f_settm)
Senddate[5]+=4;
for(k=0;k<=5;k++)
{
reg1+=Senddate[k];
}
Senddate[6]=reg1;
// Senddate[8]=0x0f;
Start_S();
Data_S(0xa0);
F_ack=A_S();
for(i=0;i<200;i++)
{
if(!F_ack)
{ F_ack=1;
Data_S(0x00);
break;
}
else
{
if(i>150)
return;
}
}
for(i=0;i<200;i++)
{F_ack=A_S();
if(!F_ack)
{ i=0;
if(j>=6)
{
Stop_S();
break;
}
F_ack=1;
Sendbuf=Senddate[j] ;
Data_S(Sendbuf);
j++;
}
else
{
if(i>150)
return;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -