⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 该程序是NECupd78F9479的开发的代LCD的空调方案
💻 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 + -