Обратная связь



Авторизироваться


Нет аккаунта?
Присоединяйтесь



Забыли пароль?
Восстановление пароля

  • :
  • :
Реклама на сайте Контакты Отзывы Обратная связь Войти / Зарегистрироваться

Схемотехника: Матричная клавиатура 5*4

Присоединяйтесь к нам в соц. сетях!

Всем привет, в данной статье я бы хотел рассказать, как работать с матричной клавиатурой 5х4, подключенной к контроллеру pic18f4520, используя компилятор для 18 серии PIC-контроллеров: HI-TECH. Наша клавиатура выглядит следующим образом:

Матричная клавиатура 5*4

Внешний вид не дает нам никакой полезной информации, поэтому я выкладываю матрицу кодов для каждой кнопки:

Коды кнопок матричной клавиатуры 5*4

В этом случае видно, что для управления нужно 5 выходов и 4 входа или наоборот.

Мы будем делать по варианту:
По a,b,c,d, будем выдавать 0 в цикле, а с входов 1,2,3,4 будем искать этот 0, что будет соответствовать нажатию кнопки, т.к по умолчанию у нас входа будут подтянуты к плюсу через резистор 10кОм. При нажатии на любую кнопку состояние светодиода будет меняться на противоположное: если светился, то выключится и наоборот.

Данный пример был собран на реальной печатной плате и является полностью работоспособным. При использовании эмуляторов, таких как Proteus, симуляция, возможно, будет происходить не совсем в реальном времени.

Ниже собственно говоря сама схема:

Матричная клавиатура 5*4

Итак, преступим к написанию кода:

#define _XTAL_FREQ 40000000 // частота процессора
#include <htc.h> //подключаем бибилиотеку компилятора hi-tech
//--------------------мои
unsigned char i_b,i_a,porb,pora[4],buttons[5][4],button_reset,timer1;//глобальные переменные

#define priority_int_on IPEN=1
#define priority_int_off IPEN=0
#define higth_int_on GIE=1//высокоприоритетные прерывания
#define low_int_on PEIE=1//низкоприоритетные прерывания
#define higth_int_off GIE=0
#define low_int_off PEIE=0

void my_buttons (void);//функция собственно обработки кнопок

void main(void)
{
OSCCON = 0b01111100;//конфигурация осцилятора
ADON = 0;//для конфигурации цифровых портов
ADCON1 = 0x0f;//выстовляем порты как цифровые
LATA = 0x00;//устанавливаем низкий уровень на порту А
TRISA = 0b10001111;//устанавливаем выводы порта а как входа если 1 или как выхода если 0
TRISB = 0b00100000;//аналогично для порта б
higth_int_on;
low_int_on;
porb=0b00100000;//этот байт мы будем двигать вправо на 1 бит за такт потом инферсировать чтобы двигать логический 0
//---------------------------------

T1CON=0b10110000;//включаем таймер 1, время срабатывания 0,05сек для запрета повторного нажатия на кнопку
//---------------------------------
while (1)
{
my_buttons ();//обработка нажатия клавиш
}
}
//------------------------------------------------------------------------------
void my_buttons (void)
{
if (button_reset==0)//если не установлен флаг запрета повторного нажатия
{
if (porb==1)//если байт сдвига с конечном положении
{
porb=0b00100000;//возвращаем в начальное
}
for (i_b=0;i_b<5;i_b++)
{
porb=porb>>1;//соответственно двигаем
LATB=~porb;//инвертируем
for (i_a=0;i_a<4;i_a++)//получаем значения входом для каждого сдвига
{
switch (i_a)
{
case 0:
pora[0]=RA0;
break;

case 1:
pora[1]=RA1;
break;

case 2:
pora[2]=RA2;
break;

case 3:
pora[3]=RA3;
break;
}
buttons[i_b][i_a]=pora[i_a];
}
}
for (i_b=0;i_b<5;i_b++)//пробегаемся по всей матрице 4х5 и смотрим на наличие 0 т.к мы двигали 0
{
for (i_a=0;i_a<4;i_a++)
{
if (buttons[i_b][i_a]==0)//если нашли 0 запускаем таймер для блокировки повторного нажатия
{
LATA4=~LATA4;
TMR1ON=1;
TMR1IE=1;
button_reset=1;
}
}

}
}
}

void interrupt tc_int(void)
{
//моя функция таймера для клавиатуры-------------------------
if (TMR1IF==1)//если таймер сработал
{
TMR1IF=0;//сбрасываем флаг таймера
timer1++;
if (timer1==10)
{
button_reset=0;//таймер посчитал 10 раз по 0.05 сек
timer1=0;
TMR1ON=0;
TMR1IE=0;
}
}
}

А также если у вас HI-Tech компилятор то не забудьте выставить конфигурационные биты:

Конфигурационные биты

Как обычно прилагаю архив со всеми файлами+проект.
Для просмотра вам понадобится MPlab IDE+proteus.
Моя почта mish-c@yandex.ru
Skype - mr.Hron

Скачать файлы