Клавиатура
Общий случай. Можно использовать стандартную матрицу кнопок. Их количество определяется числом строк и столбцов линий сканирования.
![](https://kazus.ru/nuke/objects/articles/46/image/keyb.gif)
Для этой схемы выводы Тn программируется как выходы, а Kn как входы. При сканировании на одну из линий Т поочередно подается лог "0" и проверяется состояние линий К. Если одна из линий К имеет уровень лог "0", то соответствующая кнопка считается замкнутой. Диоды VDn защищают сканирующие выходы от пробоя при нажатых нескольких кнопках, резисторы Rn подтягивают входы. Иногда, для предотвращения ложных срабатываний, имеется смысл устанавливать конденсаторы Cn. Если имеется возможность подключить ко входам портов внутренние подтягивающие резисторы, то внешние резисторы (R1, R2) можно исключить.
При использовании "резиновой" клавиатуры с микроконтроллером, на диодах, защищающих сканирующие выходы, падает 0,7 вольт. Нажатая клавиша тоже имеет некоторое сопротивление. В результате, иногда, на входах не хватает напряжения для "распознавания" лог "0". В таком случае вместо диодов можно поставить резисторы 150 - 200 Ом.
Вариант 1. Вот еще пример подключения клавиатуры с использованием меньшего числа портов микроконтроллера. Для стандартного включения матрицы 4*3 понадобится 7 портов, а в этом примере, за счет более сложной программной обработки понадобится всего 4. При опросе поочередно на одной из четырех линий устанавливают лог "0", а другие программируют как входы. При этом, они обязательно должны быть подтянуты к высокому уровню. В этом примере подтяжка осуществляется внутренними резисторами. По состоянию входов вычисляется нажатая кнопка.
![](https://kazus.ru/nuke/objects/articles/46/image/keypad.gif)
В схеме используются стандартные диоды (например импортные 1N4148). Автор программы предупреждает, что возможно наличие ошибок, но при трансляции в MPLAB все проходит гладко. Код был написан для микроконтроллера PIC16F84, но при желании может быть легко перенесен на другой тип.
Загрузить код программы обработки клавиатуры под PIC16F84
Светодиоды
Очень интересна тема подключения светодиодов. При большом количестве последних всегда жалко тратить свободные порты на индикацию и очень не хочется вводить дополнительные элементы. Тем не менее, существует много способов подключения светодиодов. Один из них - встречное включение. На таблице ниже можно увидеть сколько светодиодов можно подключить к определенному числу портов:
Портов |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Св.диодов |
2 |
6 |
12 |
20 |
30 |
42 |
56 |
Логика работы такова: чтобы зажечь необходимый светодиод нужно установить соответствующие порты как выходы и подать требуемые логические уровни. Не используемы выводы микроконтроллера программируются как входы, чтобы не засвечивать не нужные светодиоды. В принципе, можно засветить любую комбинацию светодиодов, используя временное мультиплексирование, но при таком способе незначительно снижается яркость свечения.
![](https://kazus.ru/nuke/objects/articles/46/image/12led4pin.gif)
Сопротивления в цепях порядка 200-300 Ом.
Управление нагрузкой 220В
Для плавного управления нагрузкой, например, лампой освещения, можно использовать симистор. Открывается симистор током при подачи на управляющий электрод импульса. Закрывается, когда ток, проходящий через него, становится равным нулю, когда переменное напряжение меняет знак. Для управления симистором удобно использовать микроконтроллер, который, отслеживая переход напряжения через ноль, выдает управляющий импульс открывания в каждой полуволне в определенный момент времени (дважды за период). Временные диаграммы показаны на рисунке:
![](https://kazus.ru/nuke/objects/articles/46/image/timesim.gif)
Пример схемной реализации представлен на рисунке ниже. На выводе ZERO микроконтроллера присутствует лог "1", когда в сети 220В положительная полуволна и лог "0", когда отрицательная. На резисторе R1 падает лишнее напряжение, а внутренние диоды микроконтроллера защищают кристалл от пробоя высоким напряжением. Для передачи в нагрузку максимальной мощности нужно выдавать импульс управления (вывод SIM) сразу после того, как на выводе ZERO изменится уровень сигнала. Для уменьшения мощности в нагрузке управляющий импульс надо задерживать на необходимое время, но не более 10 мсек (одна полуволна), иначе начнется следующая полуволна.
![](https://kazus.ru/nuke/objects/articles/46/image/simsch.gif)
Длительность управляющего импульса для данной схемной реализации должна быть не менее 100 мкс.
В принципе, из схемы можно исключить транзистор. Но для обеспечения необходимого тока открывания симистора (около 100 мА для данного типа) необходимо объединить несколько портов микроконтроллера, так как один порт обеспечивает только 20 мА. Выводы микроконтроллера, в этом случае, нужно будет подключить непосредственно к положительному выводу конденсатора С1. Также, нужно изменить полярность управляющих импульсов на противоположную. Транзистор, примененный в схеме - BC817, симистор - ТС106-10.