单片机如何清零寄存器某一位, *** 作方法解析

单片机如何清零寄存器某一位, *** 作方法解析,第1张

     单片机如何清零寄存器

  置位就是把该位置1,清零就是把该位置0

  硬件自动清零就是当某种条件成立,硬件会自动把该位清零。

  比如定时计数器工作时,当定时时间到了,定时中断请求标志位硬件自动置位,当cpu响应了中断以后就会自动把该位清零。

  所谓的软件清零,就是要在程序中,通过指令把该位清零。

  写1清零应该是某些单片机特有的,比如AVR单片机,要把某个寄存器清零,先写1-既是输入高电平,这样可以使内部的一个三极管导通接地,电容放电,进行清零!

  这都是对某些特殊的寄存器,比如中断标志位等,需要这样 *** 作。对于一般的寄存器比如PORTA口等,置位就是写1,清零就是写0

  mcs51如何对工作寄存器某一位清零:

  1、读出这个寄存器的值。

  2、如果要清除第5位,就让读出来的数和0b11011111(二进制)位与。同理啊。

  3、将位与后的结果写回去。

  单片机寄存器某一位置位或清零

  程例一:将寄存器中的某一位置1或则清0,保持其他位不变。

  int l_data;

  void SetBit(int pos)//将某一位置位的 *** 作

  {

  if((pos 》= 0) && (pos 《= 31))

  {

  l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0

  }

  }

  void ClrBit(int pos)//将某一位清0的 *** 作

  {

  if((pos 》= 0) && (pos 《= 31))

  {

  l_data &= ~BIT_MASK(pos);

  }

  }

  说明:

  该 *** 作的依据如下

  1.0|1 == 1,1|1 == 1,故无论0还是1同1执行| *** 作,结果为1;无论0还是1同0执行| *** 作,都将保持不变。

  2.1&0 == 0,0&0 == 0,故无论0还是1同0执行& *** 作,结果为0;无论0还是1同1执行& *** 作,都将保持不变。

  程例二、判断寄存器某一位为0还是1

  bool is1(int pos)//判断某一位是否为1

  {

  if((pos 》= 0) && (pos 《= 31))

  {

  if(l_data & (BIT_MASK(pos)) == 0x1)

  {

  return true;

  }

  else

  {

  return false;

  }

  }

  }

  程例三、将寄存器的某一位取反(1-》0;0-》1)

  void ReverseBit(int pos)//将某一位取反

  {

  if((pos 》= 0) && (pos 《= 31))

  {

  l_data ^= BIT_MASK(pos);

  }

  }

  说明:与0异或,保持不变;与1异或,取反。

  程例四、保留2个数的不同部分,将它们合并为1个数

  方法一:这两个数除了有效位之外,其他位均为0,可以将其先适当移位 *** 作,然后在“|”运算。

  例一:将temp中的低8位和t中的高4位组合成一个12位数

  unsigned short temp = 0x00AB;

  unsigned char t = 0xC0;

  temp = temp《《4;

  temp |= (t》》4);

  例二:保留channel的底4位,将其作为result的高4位,result的低4位设置为0xC;

  channel = (channel《《4) | 0x0C;

  方法二:如果这2个数除了有效位之外,其他位需要保留为1,方法是先与适当的数“|”,之后2个数“&”

  例一:保留temp的高4位和line的底4位,并将其组合成result。由于line的其他位全位1,所以必须先将temp的其他位全部设置为1,之后2个数“&”即可。

  unsigned char result;

  unsigned char temp = 0xAB;

  unsigned char line = 0xFE;

  temp |= 0x0F;

  result = temp&line;

  程例五、将一个16位数的高低8位分别拆成2个8位数,方法是通过多字节数赋给少字节数,多字节数高位字节部分将被自动截取的原理。

  unsigned short temp = 0xCDAB;

  unsigned char fir;

  unsigned char sec;

  fir = temp》》8;

  sec = temp;

  程例六、如果CPU没有来算数移位 *** 作,如何用逻辑移位 *** 作实现。

  例如:line = 0xFE,如何实现其的左移 *** 作后,右边补入的是1而不是默认的0。

  line = (line《《1)|0x01;

  如果要清零寄存器某一位可使用按位与(&)运算符。

  例如要将PB1清零而其他位不变。

  为何 写成PORTB&0xfd?

  0xfd的二进制是11111101,右数第二位的0对应的引脚就是PB1,和0按位与后,这个位上的值就是0

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存