|
sout
|
||||||
Опрос матричной клавиатуры 5*3 с помощью прерывания25.10.2016, 11:38. Показов 7823. Ответов 25
Метки нет (Все метки)
Здравствуйте!
Начал изучение atmega с матричной клавиатуры и возник затык. На данном этапе хочу сделать, чтобы при нажатии на любую кнопку моргали светодиоды. Вроде бы в дебаггере все нормально, нажатия на кнопки распознаются, порт А открывается, а при прогоне на железе светодиоды не загораются. Клавиатура на 5 строк и 3 столбца, подключена к порту C, светодиоды к порту А. Пишу в AVR Studyo 4. Подскажите, что я делаю не так и как делать правильно! http://i82.***********/big/2016/1026/4c/2c2065ff4fe46693c25578e7d8cefc4c.jpg
|
||||||
| 25.10.2016, 11:38 | |
|
Ответы с готовыми решениями:
25
Опрос матричной клавиатуры Опрос матричной клавиатуры 3х3 Опрос матричной клавиатуры. Подтверждение отправки |
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
| 25.10.2016, 12:26 | |
|
Совет: сотрите и начните сначала, с чтения какой-нибудь статьи про матричную клавиатуру. Вы только читаете все 7 пинов - а надо по очереди занулять столбцы и читать строки (или наоборот).
Бонусом: а pouse у вас вообще работает? Не должна: оптимизатор точно заметит, что она ничего не делает.
0
|
|
|
sout
|
|
| 25.10.2016, 12:37 | |
|
Почему же, сначала я подаю 1 на все 3 столбца, таким образом нахожу строку в которой нажата кнопка. Затем подаю 1 на все строки и нахожу столбец. Так и вычисляю нажатую кнопку.
pouse убрал, использую delay. Уже перечитал гору статей по данному вопросу, почти все используют разные порты для строк и столбцов, что мне не подходит. Как реализовать опрос используя один порт не могу понять. |
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 25.10.2016, 12:54 | |
|
Наберите в гуглопоиске
arduino matrix keyboard и изучите первые три ссылки (библиотеку и пример без неё)
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
| 25.10.2016, 13:05 | |
|
А, виноват, невнимательно прочитал.
С одним портом - точно так же, как с двумя: - выставляете DDRC=7 (C0-C2 - выходы, остальные входы) - по очереди пишете в PORTC числа ~1, ~2, ~4 (установлены все биты, кроме бита нужного выхода) - после записи - читаете PINC и проверяете биты C3-C7, если какой-то из них 0 - кнопка нажата if( !(PINC&8) ) кнопка нажата if( !(PINC&16) ) кнопка нажата Сорри, налажал, ниже меня поправили... Но всё равно точно так же, как с двумя =) А с вашим алгоритмом - просто надо всё наоборот делать: надо подавать 0 на все три столбца (и 1 на все строки), и искать строку, в которую придёт этот 0. И наоборот. Потому как подтяжка есть только вверх. Но общепринятый алгоритм всё-таки другой.
0
|
|
|
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 150
|
|||||||
| 25.10.2016, 13:08 | |||||||
Поэтому проверки надо заменить на что-то вроде:
0
|
|||||||
|
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 150
|
||
| 25.10.2016, 13:12 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
| 25.10.2016, 13:24 | |
|
Mitzsshtomki, спасибо, я был неправ.
0
|
|
|
sout
|
||||||
| 25.10.2016, 13:32 | ||||||
|
Mitzsshtomki,
Чтобы не сгорели порты у меня стоят резисторы R1-R8, должно спасти в случае чего. Изменил код, как вы посоветовали, теперь зависает цикл проверки как-будто какая-то кнопка нажата.
|
||||||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 25.10.2016, 13:42 | |
|
Все-таки зря не читаете
http://chipenable.ru/index.php/programm ... chine.html http://www.labfor.ru/guidomce/mpu-leso1/3 http://iosyitistromyss.ru/matr... atura.html http://avr-stort.ru/?p=1244
0
|
|
|
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 150
|
||
| 25.10.2016, 14:40 | ||
А как определяете, что зависает именно в этом цикле? В логике есть ещё одна неточность: переменная key не сбрасывается в 0, поэтому один раз среагировав на нажатие кнопки светодиоды будут моргать с частотой срабатывания прерывания.
0
|
||
|
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
|
||
| 25.10.2016, 17:06 | ||
{ ... pouse(10); //Задержка для устранения всяких переходных процессов, важно ее не забыть! ... pouse(10); //Задержка для устранения всяких переходных процессов, важно ее не забыть! ... while ((PINC&_BV(j))==0x00); //Ждем пока кнопку отпустят ... } Не надо так
0
|
||
|
sout
|
|
| 25.10.2016, 17:11 | |
|
В дебаггере выполнение останавливается на этом цикле, но cycle counter растет.
Насчет key я так сделал специально, чтобы проверить, но диоды не загораются. Все же завтра попробую переписать программу по общепринятому алгоритму. http://i85.***********/big/2016/1026/af/0e55ad4a06ca50806f498e5c52bfd2af.jpg |
|
|
sout
|
||
| 25.10.2016, 17:12 | ||
|
||
|
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 150
|
||
| 26.10.2016, 00:22 | ||
0
|
||
|
sout
|
||||||
| 26.10.2016, 08:49 | ||||||
|
По совету x893 еще раp перечитал все статьи. По совету oomomstir все переписал с начала, прерывание выкинул. В дебаггере все работает правильно, а на железе нет! Я все-таки порт сжег, или в коде ошибка?
|
||||||
|
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 150
|
|||
| 26.10.2016, 10:14 | |||
А в коде есть ошибки: - раз уж стали опрашивать строки -- в цикле устанавливать низкий уровень на одном из пинов порта С -- то только этот один пин должен быть выходным, а остальные входными (регистр DDRC должен меняться вместе с регистром PORTC); - в цикле проверка нажатия кнопки не правильная -- на сроку подаёте низкий уровень, а ищите колонки с высоким уровнем; - в том же цикле проверка отжатия кнопки так же не правильная -- цикл while будет бесконечно крутиться при отжатой кнопке, т.е. пока кнопку не нажмёте. Ваш первый вариант (хоть и был своеобразным, но всё же имел право на существование) после всех внесённых исправлений по виду был рабочим, Вы его на железе проверяли?
0
|
|||
|
sout
|
||||
| 26.10.2016, 10:59 | ||||
|
||||
|
sout
|
|
| 26.10.2016, 11:57 | |
|
Проверил мегу, похоже все-таки спалил первые 4 вывода порта С
|
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 26.10.2016, 12:09 | |
|
Отключите фьюз JTAG
0
|
|
| 26.10.2016, 12:09 | |
|
Помогаю со студенческими работами здесь
20
ATtiny2313. ASM. Динамический опрос матричной клавиатуры Как организовать опрос матричной клавиатуры + DS18B20? Сканирование матричной клавиатуры Эквивалентная схема матричной клавиатуры Метод опроса матричной клавиатуры. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|