Хорошо, поэтому для следующего кода, когда отладчик входит в оператор switch, он переходит из
строка 41 -> строка 38 -> строка 26
Тогда он постоянно колеблется между строками 38 и 26. Это даже не вводит первое утверждение случая, которое смущает меня, поскольку я работал над назначениями до раннего утра. Он не должен вводить любые другие случаи, так как PORTA инициализируется всеми нулями, и значение по умолчанию должно направлять отладчик на первый случай. Вы даже можете попробовать сами и посмотреть, что я имею в виду.
#include <avr/io.h>
int main(void)
{
DDRA = 0x00; //PORTA = 0x00;
DDRB = 0xFF; //PORTB = 0x00;
typedef enum {
wtf, //wait for PA3 to be pressed
wth, //wait for PA2 to be pressed
dooropens, //yay
}doorstate;
doorstate state = wtf;
while (1)
{
switch(state)
{
case wtf:
if (PORTA == 0x04) {
state = wth;
PORTA = 0x00; //releases button
}
else
state = wtf;
break;
case wth:
if (PORTA == 0x02)
state = dooropens;
else
state = wtf;
break;
case dooropens:
PORTB = 0x01;
if (PORTA == 0x80) {
state = wtf;
PORTB = 0x00;
}
break;
default:
state = wtf;
}
}
}
Вот инструкции, если вам нужно лучше понять, что он должен делать.
Домохозяйство имеет цифровую кодовую систему блокировки на дверях. Система имеет кнопки на клавиатуре. Кнопка «X» подключается к PA0, «Y» к PA1 и «#» к PA2. Нажатие и отпускание «#», затем «Y», должно отпереть дверь, установив PB0 в 1. Любая другая последовательность не может разблокироваться. Нажатие кнопки изнутри дома (PA7) блокирует дверь (PB0 = 0). В целях отладки присвойте каждому состоянию номер и всегда записывайте текущее состояние в PORTC (рассмотрите возможность использования переменной состояния enum). Также убедитесь, что одновременно нажимается только одна кнопка