Если в проекте много кнопок и ламп, я все это вешаю на микросхему TPIC6B595 (74HC595 + ULN2803). 8 кнопок + 8 ламп.
В регистр (595) записывается один 0 и 8 раз "двигается". В процессе зажигая(если нужно) лампы и опрашивая кнопки. Все это тактируется одним из таймеров (Timer0) чтоб свечение ламп было ровным. По окончании 8 тактов имеем в переменной состояние кнопок. НО эта информация не передается сразу на обработку. Состояние трех последних тактов "накапливается" в трех переменных и при их равенстве отправляется на обработку. Это и есть защита от дребезга. В приложенном примере - отправляется в подпрограмму-декодер после чего получаю код нажатой кнопки и флаг состояния. Этот код и обрабатывается программой. В примере программа реагирует и на длинное нажатие кнопок - декодер выдает соответствующий код.
Пример - это кусок бОльшего проекта. Программа на BascomAVR. Пр нажатии кнопки загорится соответствующая ей лампа, если её удерживать, то эта лампа погаснет, а остальные загорятся. При отпускании кнопки все лампы гаснут.
TEST_V14.bas - программа
drv_595_key_lamp_dim.bas - "драйвер" . Переменные и описание
drv_595_key_lamp_sub.bas - Программа "драйвера". Здесь же ПП "Sb_595_test1" Которая "реагирует" на кнопки и зажигает лампы.
Мне так удобно писать кусками. При необходимости цепляя код к нужному проекту. Есть ещё нюансы в работе с кнопками: Чаще всего кнопку обрабатывают сразу после нажатия, НО по моему лучше это делать после
отпускания кнопки, особенно если эта же кнопка должна еще реагировать и на длинное нажатие. А если нужно реагировать на комбинированные нажатия, то не представляю как это сделать до отпускания кнопок. В примере программа реагирует и на нажатие (зажигает 1 лампу) и на отпускание (гаснет все). А так же на удержание(все горят, кроме одной).
P.S. В схеме забыл нарисовать диоды перед каждой кнопкой.
- Вложения
-
- Пример на TPIC6B595.7z
- Пример на TPIC6B595
- (34.75 KiB) Скачиваний: 107