常用位操作,读8位 I2C 1302 18B20 .

/*1302*/

unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)

{ 

    unsigned char i;

    for(i=8; i>0; i--)

    {

        ACC = ACC >>1;         			//相当于汇编中的 RRC 

        ACC7 = DS1302_IO;

        DS1302_CLK = 1;

        DS1302_CLK = 0;

    } 

    return(ACC); 

}





/*读18b20*/

/*-----------------------------读一个字节------------------------------*/

readonechar(void)

{

	 uchar i=0;

	 uchar dat=0;

	 for(i=8;i>0;i--)

	 	{

		DQ=1;

		delay_us(1);

		DQ=0;

		dat>>=1;

		DQ=1;

		if(DQ)

		dat|=0x80;

		delay_us(4);

		}

		return(dat);

}



/*读I2C*/

uchar read_byte()			 //读一个字节的函数

{

	uchar i,j,k;

	scl=0;

	delaywus();

	sda=1;

	delaywus();

	for(i=0;i<8;i++)		 //8个循环,读一个字节

	{

		scl=1;

		delaywus();

		j=sda;

		k=(k<<1)|j;			 //按位相或,把数据移入k

		scl=0;

		delaywus();

	}

	return k;				//返回值是K,读得的数据

}


你可能感兴趣的:(位操作)