H W Ответов: 2

Конечный автомат для получения пароля пользователя с помощью клавиатуры 4x4


когда я запускаю эту функцию теперь у которой есть случай проверить правильность пароля или нет похоже что она сравнивает первый элемент и игнорирует остальные это в c

void Enter_password(){

	key= get_key();

	if (key >= 0 && key <=9){

		switch (password_input){

		case FIRST:
			password[0]= key;

			HAL_Delay(300);
			password_input = SECOND;

			break;

		case SECOND:

			password[1]= key;

			HAL_Delay(300);
			password_input = THIRD;

			break;

		case THIRD:

			password[2]= key;

			HAL_Delay(300);
			password_input = FOURTH;

			break;

		case FOURTH:

			password[3]= key;

			HAL_Delay(300);
			password_input = CHECK;

		case CHECK:

			for (int i=0; i<sizeof(password_ACT_DEACT); i++){

				if (password[i] != password_ACT_DEACT[i]){

					TextLCD_Cmd(&lcd,0x80);
					TextLCD_Puts(&lcd,"Wrong!");
FLAG= false;
                    HAL_Delay(2000);
                    password_input= FIRST;
					break;
				}

				else {

					TextLCD_Cmd(&lcd,0x80);
					TextLCD_Puts(&lcd,"RIGHT!!");
FLAG=true;
					HAL_Delay(2000);
					password_input= FIRST;

					break;

				}

			}

		default:
			TextLCD_Clear(&lcd);
			password_input= FIRST;
			break;
		}
	}

}


Что я уже пробовал:

Я сделал конечный автомат, чтобы взять у пользователя 4-значный ввод и проверить, правильно ли он работает или нет

Rick York

Ваше наблюдение верно. Он смотрит только на первый элемент.

Это раздел вопросов и ответов. У вас есть вопрос?

H W

как это исправить?

2 Ответов

Рейтинг:
2

CPallini

Ваш код должен быть заключен в бесконечный цикл

void Enter_password()
{
  for (;;)
  {
    key= get_key();
    if (key >= 0 && key <=9){
      //...
    }//<- if closing brace
  }
}


Обратите внимание, что ваш код может быть упрощен без использование государственной машины: a for петли с последующей проверкой пароля будет вполне достаточно.


H W

• На основе микроконтроллера STM32
• Сигнализация имеет панель доступа, состоящую из дисплея и клавиатуры. Пользовательский интерфейс-это
отображается на дисплее, представляющем состояние сигнализации, а также возможность
активируйте/деактивируйте сигнализацию с помощью клавиатуры.
o код состоит из 4 цифр.
o существует обычный код активации/деактивации (7392)

4
o существует мастер-код для отключения сработавшей сигнализации (6510)
• Три светодиода (зеленый, желтый и красный), указывающие состояние
o зеленый цвет указывает на то, что сигнализация деактивирована (состояние ожидания). (Нажатие кнопки активации
код войдет в состояние постановки на охрану)
o желтый цвет указывает на то, что сигнализация находится в состоянии постановки на охрану. (Либо отключите сигнализацию
или покиньте помещение в течение 30 секунд. Время идет обратный отсчет показанный на экране
дисплей в противном случае срабатывает сигнализация)
o красный цвет означает, что сигнализация полностью включена и активна. (Любой датчик сработал
это состояние будет бить тревогу)

H W

Я пытаюсь сделать то, что выше, поэтому я использую переключатель для пароля, а затем будет один для светодиодов@CPallini

Рейтинг:
0

Rick York

Во-первых, поскольку это раздел вопросов и ответов, всегда помните, что нужно задавать вопросы. Вам нужно пересмотреть проверьте случае в своем заявлении переключиться на что-то вроде этого :

case CHECK :
    Flag = true;    // initialize to true
    for( int i=0; i < sizeof( password_ACT_DEACT ); i++ )
    {
        if( password[i] != password_ACT_DEACT[i] )
        {
            Flag = false;   // character did not match
            break;          // end the loop, have an answer
        }
    }

    TextLCD_Cmd(&lcd,0x80);
    if( Flag )
        TextLCD_Puts(&lcd,"RIGHT!!");
    else
        TextLCD_Puts(&lcd,"Wrong!");

    HAL_Delay(2000);
    password_input= FIRST;
    break;