Простейший код для обработки нажатия любой клавиши - 8051 - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь найти лучший подход к моей проблеме.У меня есть микроконтроллер AT89S52 с 3 кнопками, подключенными к 3 отдельным контактам GPIO, так что микроконтроллер может выполнять различные функции на основе этих кнопок.

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

Код, представленный ниже, может работать, если я добавлю триггер Шмитта в свое оборудование, но я не хочуповторить мою печатную плату (снова).

Без добавления прерываний, есть ли способ изменить код, показанный всего несколькими строками, чтобы надежно обнаружить нажатие клавиши пользователя?

Я спрашиваю, потому что клавиши испытывают явление, называемое «подпрыгиванием», когда, как только кто-то нажимает клавишу, она на самом деле дрожит на высокой скорости, и микроконтроллер будет видеть, что клавиша нажимается и отпускается несколько раз.Я не хочу, чтобы это произошло, если пользователь законно нажал клавишу только один раз.

;KEY1I, KEY2I and KEY3I = GPIO pins connected to the keys
;Pin value is low when key is held down

w4key:
  ;begin key scan
  jnb KEY1I,w4keyend
  jnb KEY2I,w4keyend
  jnb KEY3I,w4keyend
  ;here, nothing is pressed so scan again
sjmp w4key
w4keyend:
  ;key pressed. Hope for release
  jnb KEY1I,w4key
  jnb KEY2I,w4key
  jnb KEY3I,w4key
  ;here, key is released so return.
ret

mainline:
  ;do something
  acall w4key
  ;do another thing
...

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать таймер (AT89S52 имеет несколько таймеров, вы можете использовать один из них, если они не используются в вашем проекте) и синхронный конечный автомат.Конечный автомат имеет 4 состояния для каждого ключа и определенные переходы.Я нашел эту ссылку, которая объясняет концепцию довольно тщательно.Хотя приведенный пример кода в этой ссылке написан на C, вы можете легко «перевести» его на свой код сборки.Если вам нужна помощь в этом, просто оставьте комментарий.

https://www.eeweb.com/profile/tommyg/articles/debouncing-push-buttons-using-a-state-machine-approach

...