极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13087|回复: 2

求教,关于bitClear()这个函数

[复制链接]
发表于 2017-5-19 16:45:39 | 显示全部楼层 |阅读模式
我发现 bitClear() 和  bitSet() 好像起不了作用, 经常是设置或是清0以后,用 digitalRead()去读取还是会变动 ,下面是我的测试代码


void printdelay()
{
    Serial.println();

     Serial.print("digi 13: ");
     Serial.println(digitalRead(13));

     Serial.print("digi 12: ");
     Serial.println(digitalRead(12));
   
     Serial.print("digi 11: ");
     Serial.println(digitalRead(11));
   
     Serial.print("digi 10: ");
     Serial.println(digitalRead(10));
     
     Serial.print("digi 9: ");
     Serial.println(digitalRead(9));

     Serial.print("digi 8: ");
     Serial.println(digitalRead(8));


     delay(500);
      Serial.println();
  
  }

void setup() {
Serial.begin(9600);

}

void loop() {
  
  bitSet(PORTB, 0);
  bitSet(PORTB,1);
  bitClear(PORTB,2);
  bitClear(PORTB,3);
  bitSet(PORTB,4);
  bitSet(PORTB,5);
  
  
  printdelay();

}

如上面代码, 照理 这里输出应该是   110011, 可是输出偏偏是  111011 ,

难道 bitClear 只能对其中一位进行清除置0吗?
回复

使用道具 举报

发表于 2017-5-19 17:06:52 | 显示全部楼层
道理很简单:
BitSet()设置的是输出寄存器。当这个引脚作为输出时,可以控制输出电平高低。
但是 digitalRead(8)是首先把引脚设置为输入模式,然后读取的是引脚上的实际电平,并非输出寄存器的内容。

如果你执意想读取原来设置的输出寄存器内容,那就不能用digitalRead(8),直接访问 PORTB 寄存器。
if (PORTB & (1<<3)) Serial.println("1") else Serial.println("0");
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-5-19 17:09:32 | 显示全部楼层
maidoo 发表于 2017-5-19 17:06
道理很简单:
BitSet()设置的是输出寄存器。当这个引脚作为输出时,可以控制输出电平高低。
但是 digit ...

谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 00:17 , Processed in 0.040256 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表