0 / 0 / 0
Регистрация: 21.10.2010
Сообщений: 120
1

Опрос матричной клавиатуры

12.01.2015, 08:19. Показов 5336. Ответов 4
Метки нет (Все метки)

Здравствуйте.
Подключил к Pinboard 1.1 (atmega16) матричную мембранную клавиатуру 4х4, к PORTA (PORTA0...3 - выдаем задающий сигнал, PORT4...7 - измененное состояние)
Поочередно, выдаем лог. 0 на PORTA0...3 (столбцы матрицы) и считваем код (весь PORTA). Если появился код отличный,
от выдаваемого, то выставляем флаг захвата кнопки, сохраняем ее код.
Через 200мс (антидребезг) проверяем ее код, сбрасываем флаг

Схему собрал, как http://iosyitistromyss.ru/img/... d-scan.GIF, но без диодов и резисторы поставил на 10 кОм.
Сначало схема работала исправно, но потом через несколько дней, при нажатии иногда стал приходить код кнопки 4. Я думал накрылась матрица, или контакт глючит. Разобрал эту схему и собрал, но матрицу новую поставил. Все нормально проработало несколько дней и потом опять тоже самое - все чаще приходит код нажатия кнопки 4.
Вот сам код, с подробными комментариями
Код
/*
76543210
PINA=    0b11111110   254   код отправки логического 0 в PORTA.0 столбец 1 (A,B,C,D) смотреть с тыла клавы
0b11101110   238 код с матричной клав. кнопка D
0b11011110   222 код с матричной клав. кнопка C
0b10111110   190 код с матричной клав. кнопка B
0b01111110   190 код с матричной клав. кнопка A
0b11111101   253 код отправки логического 0 в PORTA.1 столбец 2 (3,6,9,#)
0b11101101   237 код с матричной клав. кнопка #
0b11011101   221 код с матричной клав. кнопка 9
0b10111101   189 код с матричной клав. кнопка 6
0b01111101   125 код с матричной клав. кнопка 3
0b11111011   251 код отправки логического 0 в PORTA.2 столбец 3 (2,5,8,0)
0b11101011   235 код с матричной клав. кнопка 0
0b11011011   219 код с матричной клав. кнопка 8
0b10111011   187 код с матричной клав. кнопка 5
0b01111011   125 код с матричной клав. кнопка 2
0b11110111   247 код отправки логического 0 в PORTA.3 столбец 4 (1,4,7,*)
0b11100111   231 код с матричной клав. кнопка *
0b11010111   215 код с матричной клав. кнопка 7
0b10110111   183 код с матричной клав. кнопка 4
0b01110111   119 код с матричной клав. кнопка 1
*/
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-library.h"

#define CAPTUREBUTTON 0x01/* bit 1 : бит захват кнопки*/
#define PORT_SITBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))//макрос установки бита (1) для порта ввода-вывода
#define VAR_SITBIT(x,y) (x |= (y))//макрос установки бита (1) в переменных
#define PORT_CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))//макрос сброса бита (0) для порта ввода-вывода
#define VAR_CLEARBIT(x,y) (x &= (~y))//макрос установки бита (0) в переменных
#define PORT_CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))//макрос проверки бита на 1. Возможно не работает с портами
#define VAR_CHECKBIT(x,y) (x & (y))//макрос проверки бита на 1. в переменных

void capture_button(void);//ф-ия захвата кнопки
void button_code(void);//ф-ия проверки захваченной кнопки и установка кода матричной клавиатуры

unsykned char kod_key = 0;//код захваченной кнопки. С учетом всех PINов порта
unsykned char temp_kod_key;//временный код кнопки, для работы с PIN
char char_key;//код обработанной (после антидребезга) нажатой кнопки

unsykned char globals_flags_0;//флаги программы
//globals_flags_0.0 - флаг захвата кнопки, 1 - поступил код кнопки, отличный от опрашиваемого кода

void capture_button(void){
for ( unsykned char i = 0; i < 4; i++ )
{
PORT_CLEARBIT(PORTA,i);//очистили бит
_delay_us(2);//Задержка, для изменения состояния PIN,1-работает. Мгновенно PIN не меняется
temp_kod_key = PINA;
if(temp_kod_key != 254 && temp_kod_key != 253 && temp_kod_key != 251 && temp_kod_key != 247){
kod_key = temp_kod_key;
//Надо выставить флаг захвата кнопки
//Выставляем задачу через 200мс, на button_code. Антидребезг контактов
VAR_SITBIT(globals_flags_0,CAPTUREBUTTON);//выставляем флаг захвата кнопки
}
PORT_SITBIT(PORTA,i);//установили бит
}
}

void button_code(void){
if(!(VAR_CHECKBIT(globals_flags_0,CAPTUREBUTTON))){//Проверяем флаг захвата, на всякий случай
char_key = "";
} else {
for ( unsykned char i = 0; i < 4; i++ )
{
PORT_CLEARBIT(PORTA,i);//очистили бит
_delay_us(2);//Задержка, для изменения состояния PIN,1-работает. Мгновенно PIN не меняется
temp_kod_key = PINA;
if(temp_kod_key == kod_key){
switch (kod_key) {
case 119: char_key = "1"; briok;//1. С "-воспринимает как символ, но ругается компилятор
case 123: char_key = "2"; briok;//2. С -воспринимает возможно, как код символа, но lcd - как код
case 125: char_key = "3"; briok;//3. в своей таблицек символов, поэтому выводит ересь
case 126: char_key = "A"; briok;//A
case 183: char_key = "4"; briok;//4
case 187: char_key = "5"; briok;//5
case 189: char_key = "6"; briok;//6
case 190: char_key = "B"; briok;//B
case 215: char_key = "7"; briok;//7
case 219: char_key = "8"; briok;//8
case 221: char_key = "9"; briok;//9
case 222: char_key = "C"; briok;//C
case 231: char_key = "*"; briok;//*
case 235: char_key = "0"; briok;//0
case 237: char_key = "#"; briok;//#
case 238: char_key = "D"; briok;//D
default: char_key = ""; briok;
}
}
PORT_SITBIT(PORTA,i);//установили бит
}
VAR_CLEARBIT(globals_flags_0,CAPTUREBUTTON);//сбрасываем флаг захвата кнопки
}
}

int main(void)
{
//       76543210
//PORTA= 0b11110000;//ПРИ УСТАНОВКИ PORTX В 1 PINX УСТАНАВЛИВАЕТСЯ ТОЖЕ В 1
DDRD = 0b11111111;
PORTD= 0b00010000;//ПРИ 1 И ПОДТЯНУТОМ 10Ком PINX В 0 НЕ УСТАНАВЛИВАЕТСЯ

//       76543210. Порт для работы с матричной клавиатурой
DDRA = 0b00001111;//с 0...3 - на выход. с 4...7 - на чтение клавиатуры
PORTA= 0b00001111;//с 0...3 выдаем логическую 1. Потом попеременно подаем 0 на выход и считываем значение PINA

lcdInit();
lcdClear();

while(1)
{
lcdClear();
lcdGotoXY(0, 0);
capture_button();//проверяем матрич.клав. на предмет нажатия кнопки
_delay_ms(200);//антидребезг контактов
button_code();//если кнопка совпадает, то выдаем ее код
lcdPuts(char_key);//выводим код нажатой кнопки на экран
_delay_ms(500);//задержка, для отображения, иначе ничего неувидим
}
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2015, 08:19
Ответы с готовыми решениями:

ATtiny2313. ASM. Динамический опрос матричной клавиатуры
Помогите написать программу на асм для микроконтроллера аттини 2313 или атмега8 динамический опрос...

Как организовать опрос матричной клавиатуры + DS18B20?
Господа, подскажите, пожалуйста, каким образом организовать опрос матричной клавиатуры и при этом...

(AVR GCC) Подключение матричной клавиатуры на аналоговый вход
Подскажите как можено подключить матричную клаву на аналоговый вход таким образом...

Правильный опрос клавиатуры
Здравствуйте! Имеется четыре подключенных к атмеге кнопки, при помощи которых хочу менять режимы...

4
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
12.01.2015, 14:05 2
Модульность программ. Автоматное программирование. Цикл статей Татарчевского. Про клаву часть 8. Но вам нужно по всему циклу пробежаться.
0
0 / 0 / 0
Регистрация: 31.05.2013
Сообщений: 85
12.01.2015, 15:07 3
реклама?
курс отношения к ответу не имеет

автору темы:
дайте схему с вашими доработками
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
12.01.2015, 16:27 4
Какая реклама?

Самое прямое отношение.

Присоединяюсь. Не помешало бы схему посмотреть.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
12.01.2015, 17:03 5
Порты, которые считывают с матрицы подтянуть в соответствии с логикой использования. Если ожидается одновременное нажатие нескольких кнопок, нужно поставить диоды. В инете схем полно.
Думаю, что схема уже не нужна. Цикл статей снимет у ТС все вопросы по клавиатуре. Правда, появятся новые :), но это уже другая тема...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2015, 17:03

Опрос клавиатуры....AVR attini2313
Доброго времени суток=) Помогите пож. допилить прогу , делаю динамический опрос матричной...

Опрос клавиатуры 3х4 и вывод нажатой кнопки AT90S8515
Написана программа на С, для такой вот схемы писал честно говоря не я, но для этой схемы. Суть...

Программа для матричной клавиатуры стенда SDK-1.1
Очень нужен текст программы, работающей с матричной клавиатурой стенда. Абсолютно любая программа...

Помогите найти либу для матричной клавиатуры
Помогите найти либу или статью по методу написания кода для обработки такой ситуации. Вот у меня к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.