入力としてディップ スイッチを使用し、出力として 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;
}
また、私が抱えている別の問題は、一度に 1 つの LED しかオフにならないことです。1 つのスイッチを切り替えてから別のスイッチを切り替えた場合、最初に切り替えたスイッチの LED は、もう一方のスイッチを切り替えるとすぐにオンに戻ります。