Страница 1 из 5
Подключить много кнопок на мало выводов.
Добавлено: Пн июн 29, 2026 23:51:07
Призрачный Суслик
Может кто чего либо предложит умного :
Есть ОМК Atmel AT90S2313. Это готовое устройство, которое дорабатывается, заменять ОМК нельзя. У него задействован SPI + INT0 + 7 выводов на стандартный ЖК индикатор. 4 данных, R/W, команды/данные, строб. Надо дополнительно подключить к нему 12 условных "кнопок". Все кнопки на замыкание. Может быть одновременно нажато любое количество "кнопок". "Дребезг" контактов расценивается как "очень большой". Максимальная частота срабатываний, это доли герц. Самое главное замыкание любой кнопки должно формировать сигнал прерывания INT1 для вывода ОМК из состояния "SLEEP". Электричество экономится. Размыкание, как угодно. Какие идеи тут можно придумать ? С одной стороны хорошо бы их собрать в матрицу 4х3 и для сканирования использовать порт данных ЖК, но как при этом сделать формирования сигнала прерывания. Опять же постоянно нажатая кнопка не должна мешать выводу на ЖК. Поэтому толька вывод. После обмена с ЖК ставятся все в "1" а с другой стороны "матрицы" собираем диодами лог. "1" для прерывания. Наверное через конденсатор, что бы формировался короткий импульс.
Я не программист, я только схему рисую и описываю для программиста что надо делать.
Картинки вставить не могу, пишу с чужого "интернета", "своего" теперь нет.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 01:14:11
ejsanyo
Что-нибудь вроде пары штук
PCF8574 не рассматривается повесить? Не понял кстати, осталась ещё свободная пара ног, чтобы сделать ногодрыгом I2C мастер? В этих чипах кстати подтяжка к плюсу есть, хоть и не очень сильная, и делать импульс прерывания при изменении состояния своих "входовыходов" они умеют. Но по опыту говорю сразу, фильтр дребезга делайте снаружи, да как следует, плюс с защитой входов снабберами! Может даже и предварительный буфер на старой ТТЛ логике не помешал бы перед чипами. А то, например, чипы от NXP у меня в таких жёстких условиях просто изредка сбоили, а от Ti - клинило с закороткой питания! А в остальном да, удобные и дешёвые расширители ввода вывода.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 02:01:46
Zapolyarny
Выводы индикатора для кнопок - стандартная практика. Чтобы постоянно нажатая кнопка не изменяла что-то на индикаторе, последовательно к ней подключают резистор (он вообще обязателен для любых кнопок как минимум на этапе макетирования для защиты порта при ошибке программиста).
Кроме того, совместное использование кнопок и индикатора может быть двумя способами:
попеременным, когда порты переключаются на вход, а затем обратно на выход;
параллельным, когда порты только на выход, общий кнопок задействует ещё один вход на микроконтроллере.
Что же касается внешних прерываний для вывода из спящего режима, то не вижу проблемы, почему в спящем режиме не отставить хоть все порты на вход, и если надо, добавить ещё высокоомный резистор(ов) на общем кнопок, чтобы подтянуть к любой удобной для ТЗ цепи питания,
Конденсатор для формирования импульса и дополнительные действия для антидребезга (кроме программных) вряд ли нужны.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 07:43:55
akl
Призрачный Суслик писал(а): Пн июн 29, 2026 23:51:07
Может кто чего либо предложит умного :
Есть ОМК Atmel AT90S2313. Это готовое устройство, которое дорабатывается, заменять ОМК нельзя. У него задействован SPI + INT0 + 7 выводов на стандартный ЖК индикатор. 4 данных, R/W, команды/данные, строб. Надо дополнительно подключить к нему 12 условных "кнопок". Все кнопки на замыкание. Может быть одновременно нажато любое количество "кнопок". "Дребезг" контактов расценивается как "очень большой". Максимальная частота срабатываний, это доли герц. Самое главное замыкание любой кнопки должно формировать сигнал прерывания INT1 для вывода ОМК из состояния "SLEEP". Электричество экономится...Поэтому толька вывод. После обмена с ЖК ставятся все в "1" а с другой стороны "матрицы" собираем диодами лог. "1" для прерывания...
Как вариант подключения кнопок с обслуживанием по прерыванию INT1.
Спойлер
;30.06.2026
;проба принять данные с клавиатуры
;
.INCLUDE "2313def.inc"
.org $0
RJMP START
.org $02
;INT1:
OUT GIMSK,ZH
RET
;*********
START:
CLI
LDI R16,LOW(RAMEND)
OUT SPL,R16
SER ZL
CLR ZH
OUT DDRB,ZL
OUT PORTB,ZH
OUT PORTD,ZH
NOP
SBI PORTD,PD3
OUT DDRD,ZL
LDI R16,1<<SE|1<<SM
OUT MCUCR,R16
LDI R16,1<<INT1
OUT GIMSK,R16
OUT GIFR,R16
CBI DDRD,PD3
SEI
WAIT:
SLEEP
NOP
OUT PORTB,ZL
NOP
OUT DDRB,ZH
OUT PORTD,ZL
NOP
OUT DDRD,ZH
IN R20,PINB
IN R21,PIND
;0 значение регистров - нажатая кнопка
RJMP START
.EXIT
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 08:51:26
Призрачный Суслик
ejsanyo писал(а): Вт июн 30, 2026 01:14:11
Что-нибудь вроде пары штук
PCF8574 не рассматривается повесить?
Места особо нет, да и программист программный I2C скорее всего не сдюжит. Я сам его особенности слабо понимаю, что бы внятно объяснить. Была идея на сдвиговом регистре, и SPI , для формирования "бегущего нуля" но пока раздумываю о более простых реализациях, так как места в конструктиве немного и задача максимально упростить программую часть, а с регистром могут быть конфликты, когда по SPI что-то придёт во время цикла опроса "кнопок".
ejsanyo писал(а): Вт июн 30, 2026 01:14:11
В этих чипах кстати подтяжка к плюсу есть, хоть и не очень сильная, и делать импульс прерывания при изменении состояния своих "входовыходов" они умеют.
Как я понял даташит, только с 2х выводов
ejsanyo писал(а): Вт июн 30, 2026 01:14:11
Но по опыту говорю сразу, фильтр дребезга делайте снаружи, да как следует, плюс с защитой входов снабберами!
Как ? По подробнее можно ? Просто RC цепочки в виде ФНЧ помогают плохо.
ejsanyo писал(а): Вт июн 30, 2026 01:14:11
Может даже и предварительный буфер на старой ТТЛ логике не помешал бы перед чипами.
Устройство с автономным питанием и нужно стремиться к минимуму потребления.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 09:00:43
Призрачный Суслик
akl писал(а): Вт июн 30, 2026 07:43:55
Как вариант подключения кнопок с обслуживанием по прерыванию INT1.
Резистивная развязка. Только тут момент, при передаче данных в индикатор, и нескольких одновременно замкнутых кнопках всё хорошо, а при чтении микромощного порта индикатора, боюсь, могут быть проблемы. Дуумаю, надо диодами отвязывать, катодами к выводам ОМК, анодами к "кнопкам".
В SLEEP все линии в "0", при опросе будет "бегущая 1", при обмене с индикатором, "1" на выходе индикатора не помешает, а вот "0" начнёт бороться с резистором подтяжки. Но резистор подтяжки можно повесить на вывод ввода-вывода и отключать при обмене с индикатором.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 09:24:54
ejsanyo
Призрачный Суслик писал(а): Вт июн 30, 2026 08:51:26
Места особо нет, да и программист программный I2C скорее всего не сдюжит. Я сам его особенности слабо понимаю, что бы внятно объяснить.
Чего там "дюжить"? В интернетах навалом готовых вариантов, спросите у нейросети "i2c bitbang avr example".

Даже в Codevision издревле готовая, стабильно работающая библиотека есть.
Призрачный Суслик писал(а): Вт июн 30, 2026 08:51:26
Как я понял даташит, только с 2х выводов
Как вы так поняли? I2C ноги придётся самостоятельно подтянуть к плюсу. Ногу выхода прерывания нужно также самому подтянуть к плюсу. А ноги "вводавывода" как раз сами всё тянут, все 8 штук. Принцип у них такой же, как был, например, в портах 8051-ых контроллеров. Зафигачиваете за напись 0xFF, все ноги подтягиваются, дальше читаете порт - ноги, которые вашими кнопками сели на землю, прочитаются нулями, а остальные по прежнему единицами.
Призрачный Суслик писал(а): Вт июн 30, 2026 08:51:26
Как ? По подробнее можно ? Просто RC цепочки в виде ФНЧ помогают плохо.
Подтяжечный резюк, потом кондёр на землю и параллельно ему снаббер, потом ещё последовательно RC-цепочка, как-то хотя бы так. Но баланс сопротивлений не забывайте учитывать, чтобы даже несмотря на эту RC-цепочку кнопка прожимала вход достаточно, чтобы он распознался как 0.
Призрачный Суслик писал(а): Вт июн 30, 2026 08:51:26
Устройство с автономным питанием и нужно стремиться к минимуму потребления.
Ну какой-нибудь КМОП буферок взять, что-ли? Пару банальных 74HC04? А может и загнаться, напихать одновибраторов вроде
CD4098? На них прям хороший дебаунч можно сделать.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 09:54:14
akl
ATtiny2313A с прерываниями по перепаду. 12 кнопок обслужит по UART.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 11:58:11
Zapolyarny
Призрачный Суслик писал(а): Вт июн 30, 2026 09:00:43
а при чтении микромощного порта индикатора, боюсь, могут быть проблемы. Дуумаю, надо диодами отвязывать, катодами к выводам ОМК, анодами к "кнопкам".
Все порты - "микромощные", за исключением некоторых специализированных. "Микромощность" вполне выражается в некоторых единицах измерения. И не надо бояться или жалеть резисторы сопротивлением в несколько десятков и даже сотен кОм (а не 300 Ом, как предложили выше).
Зачем читать индикатор? Программа не в состоянии запомнить, что она с ним делала?
В любом случае, подобные манипуляции надо описывать сразу, а не в процессе. Без чёткого озвучивания ТЗ ничего путного не выйдет, а советовать что-то - зря тратить время.
ejsanyo писал(а): Вт июн 30, 2026 09:24:54
Ну какой-нибудь КМОП буферок взять, что-ли? Пару банальных 74HC04? А может и загнаться, напихать одновибраторов вроде CD4098? На них прям хороший дебаунч можно сделать.
Это всё абсолютно лишнее, так как решается программно.
Вы предлагаете программный I2C, который на три порядка сложнее антидребезга, а антидребезг решаете аппаратно. Это просто нелогично.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 12:04:56
veso74
Если есть программист, скажите ему: "Нужно еще 12 кнопок". Он (вероятно) найдет способ.
Иначе без опыта в проектировании (программного кода) и без полного описания функций устройства, обсуждение просто пустой тратой времени.
Насколько сложен (программный) интерфейс I2C? Даже в AТtiny13 сводится к 30-40 строкам программного кода.
Два PCF8574, с INT на нажатие кнопки и пробуждения МК, и все. А "антидребезг" кнопок просто будет реализован с помощью еще несколько строки кода.
Лично бы перенес старое устройство на новый MK (с большим количеством пинов (32, 48, 64) и бесконечно большими возможностями).
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 13:40:37
ejsanyo
Zapolyarny писал(а): Вт июн 30, 2026 11:58:11
Вы предлагаете программный I2C, который на три порядка сложнее антидребезга, а антидребезг решаете аппаратно. Это просто нелогично.
..."нелогично на первый взгляд" вы хотите сказать. Поскольку там у меня ещё говорилось о том, что в жизни PCF8574, да и прочие подобные чипы дребезг по входам, особенно на длинных проводах, очень не любят. Могут от этого глючить, в некоторых случаях, даже до закоротки питания. Если у вас провода до кнопок короткие, да и кнопки резиновые, вроде калькуляторных, то можно и напрямую подключать.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 14:44:13
Zapolyarny
Я сказал именно то, что хотел. Нелогично на любой взгляд. Нет смысла использовать дополнительные компоненты, если в них нет смысла. Начиная с расширителей портов I/O.
Замечу, что все кнопки с механическим контактом, даже резиновые, имеют дребезг. Но ни об их конструкции, ни о длине проводов ТС не сообщал, и если это не район гроз и пылевых бурь или не другая планета, то наличие супрессоров и рубильника для заземления цепей не видится необходимым.
В жизни (пока ещё вне её нет опыта), мне ни разу не попадалось, что бы дребезг приводил к короткому замыканию цепей питания. Если рассмотреть дребезг как сигнал, то Ваше утверждение о "нелюбви" PCF8574 и подобных микросхем к сигналам некоторой частоты и формы выглядит странным. Но могу допустить, что такое случалось. В этом случае я бы назвал выбор такой микросхемы плохим решением для данной задачи и поискал бы другое, а не обвешивал ещё большим числом компонентов.
Проще тогда предложить, например:
https://www.puntoflotante.net/DATASHEET-TM1637.pdf - тут и куча кнопок, и толерантность к дребезгу, и I2C. Это не единственный вариант, подобных решений много.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 15:41:23
akl
Zapolyarny писал(а): Вт июн 30, 2026 11:58:11...И не надо бояться или жалеть резисторы сопротивлением в несколько десятков и даже сотен кОм (а не 300 Ом, как предложили выше).
Зачем читать индикатор?
Читать желательно флаг BUSY.
Все, что выше бред.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 15:51:06
ejsanyo
Почему-то мой встроенный визионер подсказывает, что у автора там именно что не просто кнопки, а что-то вроде концевиков стоит, на каком-то "не очень бытовом" оборудовании. Тем более привычка называть контроллеры "ОМК"...
Да уж понятно, что PCF8574 для этого нифига не лучшее решение. Лучшее - это тупо параллельный порт. Просто бывает так, что других альтернатив особо нет, когда у контроллера закончились ноги.
Не I2C, ну ладно, для программного ногодрыга не суть. Но есть ещё пара нюансов: Во первых, автору придётся перепахивать индикацию. Или как, чисто для ввода TM1637 пользовать? Во вторых - TM1637 не умеет в 2 и более нажатые кнопки сразу, только одиночные замыкания.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 16:29:31
Zapolyarny
akl писал(а): Вт июн 30, 2026 15:41:23
Читать желательно флаг BUSY.
Да, спасибо, забыл про него.
ejsanyo писал(а): Вт июн 30, 2026 15:51:06
Или как, чисто для ввода TM1637 пользовать? Во вторых - TM1637 не умеет в 2 и более нажатые кнопки сразу, только одиночные замыкания.
Конечно только для кнопок, индикатор не является обязательным условием. Если TM1637 не способно опросить нажатие нескольких кнопок (при двух входах кажется вероятным возможность определения двух кнопок из разных рядов, а все 12 сразу вряд ли надо из-за физиологических особенностей пользователя), значит, найти контроллер, какой сумеет, BC6088AEC например. Кроме того, любое предложение внешнего дополнительного контроллера в итоге равносильно предложению ещё одного микроконтроллера (притом, это может оказаться даже дешевле)

Но всё это не нужно - в рамках озвученного ТС со всем этим пока справляется то, что уже есть.
---
Есть чуть скромнее:
https://bitcode.com.cn/en/bc6301/ - на 30 кнопок, корпус SO-14.
Описание:
Поддерживает нормально разомкнутые/нормально замкнутые клавиши.
Поддерживает произвольное количество комбинаций клавиш.
Поддерживает произвольное определение длительного нажатия.
Однопроводной интерфейс (UART, 9600 бод).
Прямой вывод значений клавиш.
Рабочее напряжение: 2,2–5,5 В
Рабочий ток: 2,7 мкА (@3 В).
Красота.
Заказать, что ли...

Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 17:41:50
linux_rulezz
Когда мне нужно было много кнопок к 20-лапому МК подключить, я просто воткнул несколько мультиплексоров. Вуаля! Кнопка — штука очень медленная, это вам не концевик на скорости, который может быть за 10мс пройден…
Подключить многогого кнопок на малололо выводов.
Добавлено: Вт июн 30, 2026 18:19:21
petrenko
B oписании в том числе пишут : "
AT90S2313 Product details
...
AVR® RISC Architecture
...
– On-chip Analog Comparator
...
"
Cкажите пожалуйста, Вы этот самый " On-chip Analog Comparator " и его входы AIN1 AIN0 ещё не задействовали ?
( есть интересные варианты, говорят .. )
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июн 30, 2026 20:14:37
BOB51
Примените стандартное решение по общему управлению дисплеем и клавиатурной.
Правда понадобиться внешний дешифратор...
Вот примерно, как в этом антиквариате:
Спойлер

Собственно там принцип развертки дешифратором с возвратом (возможно на линию с прерыванием и/или еще одну Линию Возврата Клавиатуры добавить можно)..

Подключить многогого кнопок на малололо выводов.
Добавлено: Ср июл 01, 2026 09:06:53
petrenko
BOB51 писал(а): Вт июн 30, 2026 20:14:37
..
Правда понадобит
-ь-ся внешний дешифратор ...
..
Но у него {нетвёрдо}-кристаллический (
, а в данной Вами схеме светодиодовый с общим катодом )
И ещё он просил, чтоб можно было нажать хоть все 12кнопок одновременно
, да ещё и энергопотребление поменьше.
Задаче не совсем простая
(, хотя и не шибко сложная. )
Re: Подключить многог кнопок на мало выводов.
Добавлено: Ср июл 01, 2026 09:19:54
linux_rulezz
А в чем проблема контроля нажатия хоть всех кнопок одновременно?
Скажем, ряды клавиш подключаем к ногам МК напрямую, а по столбцам пускаем "сканирующую единицу" хоть сдвиговым регистром… За несколько микросекунд можно всю матрицу таким образом просканировать.