我使用 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 会在我翻转另一个开关时重新亮起。