【发布时间】:2019-01-06 08:56:18
【问题描述】:
我使用 DIP 开关作为输入,使用 LED 作为输出,以类似于任何给定输入的补码。我正在编写一个 Arduino Uno 来尝试这样做。我对按位效率也不是很有经验;有没有办法大大减少我的代码行数?
我目前拥有的是一堆 if 语句。
#include <avr/io.h>//library used to access the pin addresses
int main () {
DDRB |= 0b00001111;
DDRD &= ~(0b11110000);
while (1) {
if (PIND & 0b00010000) {
PORTB |= 0b00001110;
PORTB &= ~(0b00000001);
}
else if (PIND & 0b00100000) {
PORTB |= 0b00001101;
PORTB &= ~(0b00000010);
}
else if (PIND & 0b00110000) {
PORTB |= 0b00001100;
PORTB &= ~(0b00000011);
}
else if (PIND & 0b01000000) {
PORTB |= 0b00001011;
PORTB &= ~(0b00000100);
}
else if (PIND & 0b01010000) {
PORTB |= 0b00001010;
PORTB &= ~(0b00000101);
}
else if (PIND & 0b01100000) {
PORTB |= 0b00001001;
PORTB &= ~(0b00000110);
}
else if (PIND & 0b01110000) {
PORTB |= 0b00001000;
PORTB &= ~(00000111);
}
else if (PIND & 0b10000000) {
PORTB |= 0b00000111;
PORTB &= ~(0b00001000);
}
else if (PIND & 0b10010000) {
PORTB |= 0b00000110;
PORTB &= ~(0b00001001);
}
else if (PIND & 0b10100000) {
PORTB |= 0b00000101;
PORTB &= ~(0b00001010);
}
else if (PIND & 0b10110000) {
PORTB |= 0b00000100;
PORTB &= ~(0b00001011);
}
else if (PIND & 0b11000000) {
PORTB |= 0b00000011;
PORTB &= ~(0b00001100);
}
else if (PIND & 0b11010000) {
PORTB |= 0b00000010;
PORTB &= ~(0b00001101);
}
else if (PIND & 11100000) {
PORTB |= 0b00000001;
PORTB &= ~(0b00001110);
}
else if (PIND & 11110000) {
PORTB |= 0b00000000;
PORTB &= ~(0b00001111);
}
}
return 0;
}
另外,我遇到的另一个问题是一次只关闭一个 LED;如果我先拨动一个开关,然后再拨另一个,当我拨动另一个开关时,我拨动的第一个开关的 LED 就会重新亮起。
【问题讨论】:
-
这些测试看起来不对。而不是
else if (PIND & 0b10110000) {,我希望else if ((PIND & 0b11110000) == 0x0b10110000) {。 -
如果你使用这种方法(你不应该),你应该在 tf-else if-else 链之前将 PIND once 读入一个变量并测试它而不是重复- 阅读随时可能改变的 PIND。
标签: c arduino embedded ones-complement