Que tipo de botões são esses? Imaginemos que são botões que ficam no mesmo sítio.
//isto é um código que parece mais complexo do que é, mas é feito assim para veres todos os passos.
void loop(){
unsigned char botao1 = digitalRead(PINO1);
unsigned char botao2 = digitalRead(PINO2);
unsigned char led1 = botao1;
digitalWrite(PINO_LED1, led1);
unsigned char led2 = botao2 && !(botao1);
digitalWrite(PINO_LED2, led2);
Agora imaginemos que tens um botão de pulso. Sempre que carregas o LED muda de estado. Aqui vais precisar de algo que guarde o estado do LED para ver se está ligado ou não.
unsigned char led1=0; //guarda o estado do LED. Tem de ser fora da loop porque tem de guardar o valor entre ciclos.
unsigned char led2=0; //guarda o estado do LED
unsigned char botao1anterior=0;
unsigned char botao2anterior=0;
void loop() {
unsigned char botao1 = digitalRead(PINO1); //lê o botão
unsigned char botao2 = digitalRead(PINO2);
//compara o estado do botão.
if (botao1 != botao1anterior && botao1 == 0) {
led1 ^= 1UL << 1; //esta é uma maneira de fazer isto mais... chique. em baixo mostro outra maneira.
}
//este caso é diferente... aqui queres saber se o led1 está ligado. Para isso podes colocar um if antes.
if (led1 == 0) { //estou a assumir que 1 = ligado.
if (botao2 != botao2anterior && botao2 == 0) {
(led2 == 0) ? led2 = 1 : led2 = 0; //também funciona.
}
}
digitalWrite(PINO_LED1, led1);
digitalWrite(PINO_LED2, led2);
A maneira mais directa sem saber imenso de C para inverter o bit seria algo como:
if (led2 == 0) led2=1;
else led2 = 0;
Mas apeteceu-me pensar um bocado nisto.
Não compilei, mas é bastante provável que o código funcione. Deve haver uns parêntesis mal colocados e tal, mas de certeza que sabes como corrigir.
De qualquer forma, a maneira de fazer isto é colocar o que tentaste fazer e porque não funciona e ajudamos-te dessa forma. Mas eu hoje estou aborrecido e decidi colocar isto aqui.