常用位操作,写8位 12864串口模式 I2C 1302 18B20

/*以1302为例*/
void DS1302InputByte(unsigned char d)  //实时时钟写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;            //相当于汇编中的 RRC
        DS1302_CLK = 1;   //先写底位
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}
/*以18b20为例*/
/*---------------------------写一个字节------------------------------*/
writeonechar(uchar dat)
{
  unsigned  char  i=0;
  for(i=8;i>0;i--)
  {
  DQ=0;
  DQ=dat&0x01;
  delay_us(5);
  DQ=1;
  dat>>=1;
  }
  delay_us(4);
}

/*I2C*/
void write_byte(uchar dat)   // 写函数
{
 char i;
 uchar temp;
 temp=dat;
 delaywus();
 scl=0;
 for(i=0;i<8;i++)
  {
  temp=temp<<1;        //把temp左移一位
  sda=CY;        //把进位中的位送到SDA
  delaywus();
  scl=1;
  delaywus();
  scl=0;
  delaywus();
 }
 sda=1;  /*总线释放**/
 delaywus();
}

/*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,读得的数据
}

/*12864*/
void write_zj(uchar bbyte)
{    char i;
       for(i=0;i<8;i++)
 {
        SID=bbyte&0x80; //取出最高位
        SCLK=1;
        SCLK=0;
        bbyte<<=1; //左移
        }
}

原文地址:https://www.cnblogs.com/riskyer/p/3262971.html