pig881 发表于 2017-5-19 16:45:39

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

我发现 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吗?

maidoo 发表于 2017-5-19 17:06:52

道理很简单:
BitSet()设置的是输出寄存器。当这个引脚作为输出时,可以控制输出电平高低。
但是 digitalRead(8)是首先把引脚设置为输入模式,然后读取的是引脚上的实际电平,并非输出寄存器的内容。

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

pig881 发表于 2017-5-19 17:09:32

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

:handshake 谢谢!
页: [1]
查看完整版本: 求教,关于bitClear()这个函数