Подпрограмма обработки клавиатуры (асм PIC)

Категория: 2. Обработчики клавиатуры
Автор: DARK Просмотров: 480

Подпрограмма обработки клавиатуры

Изначально данная подпрограмма была подсмотрена у Alex… При первом знакомстве, не произвела никакого впечатления, наоборот, показалась неоправданно громоздкой и сложной. При более внимательном знакомстве и выяснения алгоритма работы, был сделан вывод, что первое впечатление ошибочно. На самом деле алгоритм до боли прост… А самое главное, поражает то, с какой легкостью обрабатываются как кратковременные, так и продолжительные нажатия клавиш. Лично я ни, в интернете, ни тем более сам, никогда не видел и не делал обработку клавиатуры настолько просто. Для меня обработка клавиатуры всегда была проблемой вселенского масштаба, особенно после самоучителя Корабельникова Е. А.

   Поэтому, с разрешения и с помощью автора, было решено написать эту статью. Данная идея была реализована самим автором на Си, а мной портировано на ассемблер для PIC18 и оформлено в более менее презентабельный вид. И в моей коллекции подпрограмм стало больше на одну, очень достойную программу больше.

   Основная идея алгоритма заключается в использовании только флагов (для каждой кнопки назначен свой флаг, причем их м.б. до 4 штук на кнопку) кнопок и запоминания предыдущего состояния кнопок. В каждом цикле обработки клавиш происходит лог. И флага предыдущего состояния кнопки с инверсным значением флага текущего состояния кнопки… Т.о. возможны варианты развития событий:

   1. Ни одна кнопка не была нажата ни в предыдущем, ни в текущем цикле обработки. Соответственно оба флага равны нулю и их лог. И (напоминаю, флаг текущего состояния кнопки при лог. И берется инверсный) также будет лог. 0.

   2. В предыдущем цикле кнопка была нажата, но в текущем еще не отпущена, соответственно оба флага будут иметь значение 1 и 1, но т.к. значение второго всегда берется в инверсном значении, то и их лог. И также будет лог. 0.

   3. В предыдущем цикле кнопка была еще нажата, но в текущем уже отпущена. Соответствующие флаги будут уже 1 и 0 и их лог. И с инверсным значением второго флага даст лог. 1. Что и является признаком сработавшей кнопки.

   Таким образом имеем:

для одной кнопки необходимо минимум три флага:

   1. предыдущее состояние кнопки.

   2. текущее состояние кнопки.

   3. флаг срабатывания кнопки.

   Вывод:

   Из всего вышесказанного следует, что обработку клавиатуры можно делать практически с любой частотой… Почему «практически»? Потому, что необходима минимальная задержка после обнаружения факта нажатия, чтобы переждать «дребезг» контактов самой кнопки для предотвращения ложного срабатывания. Роль этой задержки в подавляющем большинстве случаев с успехом может выполнить основной цикл программы. В данном случае это реализуется крайне просто!

   Также выше было упомянуто что, для каждой кнопки необходимо минимум три флага. Почему минимум? Потому, что три флага нужно только для обработки однократного нажатия, но факт длительного удержания кнопки не обнаруживается, поэтому необходимо еще по одному флагу и по минимум одному регистру для каждой кнопки, для которой необходимо обнаруживать факт длительного нажатия.

   Итак. Общий принцип обработки ясен. Структура программы начинает вырисовываться:

klv tab

 

 Исходный текст программы с комментариями, проект в Протеусе можно скачать здесь


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2019 © ChipMK.ru

ChipMk.ru Яндекс Метрика