Примеры с сайта AVR+ Electronics

Автор: Internet. Опубликовано в Начинающим CV AVR

Содержание материала

Работа с матричной клавиатурой 4х4.

Сегодня поговорим о работе МК с матричной клавиатурой. Собственно матричная клавиатура представляет собой n-количество кнопок подключённых матрицей, тем самым уменьшается количество используемых пинов МК, но для работы нужно использовать динамический опрос. Что касается динамического опроса, всё что нужно от МК, это поочередно опускать столбцы матрицы в лог.0 и слушать строки, когда происходит нажатие кнопки, вычисляем в каком столбце и в какой строке было нажатие. А далее, обрабатываем полученные данные, как хотим. Для наглядного примера я написал программу под клавиатуру 4х4. Программа как обычно под Codevision. Вот схема:



Code
/*****************************************************
Автор: Krik99
Project : 4x4 keys
Chip type           : ATtiny2313
Clock frequency     : 4,000000 MHz
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
#define stolb1 PORTB.7
#define stolb2 PORTB.6
#define stolb3 PORTB.5
#define stolb4 PORTB.4
#define str1 PINB.3
#define str2 PINB.2
#define str3 PINB.1
#define str4 PINB.0
unsigned char button[16];
void usart_tx(unsigned char data){
    while ( !(UCSRA & (1<<5)) );    //ждём очистки регистра данных USART       
    UDR=data;    //отправить
/*
void usart_tx_text(flash char *text){
  for(;*text;text++)usart_tx(*text);         
unsigned char usart_rx(void){ 
    while ( !(UCSRA & (1<<7)) );    //ждём очистки регистра данных USART      
    return UDR;    //читаем данные
*/   
void main(void){    
unsigned char x;
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port B initialization
PORTB=0xFF;
DDRB=0xF0;
// Port D initialization
PORTD=0x00;
DDRD=0x00;
// USART initialization
// USART Baud rate: 9600
UCSRB=0x08; UCSRC=0x06; UBRRL=0x19;
         
while (1)
      {    
      for (x = 0; x < 4; x++){   //проверяем 4 столбца
         delay_ms(6);                   //делаем задержку в 6мс
         switch(x){       //управление столбцами
            case 0:{ stolb4=1; stolb1=0;  break; };  //1 столбец
            case 1:{ stolb1=1; stolb2=0;  break; };  //2 столбец
            case 2:{ stolb2=1; stolb3=0;  break; };  //3 столбец
            case 3:{ stolb3=1; stolb4=0;  break; };  //4 столбец
         } 
         delay_ms (3);                  //задержка                  
         button[0+x]=str1;   //проверка 1 строки
         delay_ms (3);                  //задержка
         button[4+x]=str2;   //проверка 2 строки
         delay_ms (3);                  //задержка
         button[8+x]=str3;   //проверка 3 строки
         delay_ms (3);                  //задержка
         button[12+x]=str4;  //проверка 4 строки
      }
      if(button[0]==0) usart_tx('0'); delay_ms(15);   //если нажат клавиша 0
      if(button[1]==0) usart_tx('1'); delay_ms(15);   //если нажат клавиша 1
      if(button[2]==0) usart_tx('2'); delay_ms(15);   //если нажат клавиша 2
      if(button[3]==0) usart_tx('3'); delay_ms(15);   //если нажат клавиша 3
      if(button[4]==0) usart_tx('4'); delay_ms(15);   //если нажат клавиша 4
      if(button[5]==0) usart_tx('5'); delay_ms(15);   //если нажат клавиша 5
      if(button[6]==0) usart_tx('6'); delay_ms(15);   //если нажат клавиша 6
      if(button[7]==0) usart_tx('7'); delay_ms(15);   //если нажат клавиша 7
      if(button[8]==0) usart_tx('8'); delay_ms(15);   //если нажат клавиша 8
      if(button[9]==0) usart_tx('9'); delay_ms(15);   //если нажат клавиша 9
      if(button[15]==0) usart_tx(' r'); delay_ms(15);  //если нажат клавиша 16           
      };
}

Что касается программы, там всё просто. Программа сканирует клавиатуру и по нажатию кнопок 0…9 отправляет значение по UART. 15 клавиша это перейти на строку ниже. Если будет большая загрузка МК, программу обработку кнопок желательно запускать по прерыванию. Можно было это всё завести от внешних прерываний, но тогда надо использовать ещё одну ножку. Ну, вот собственно и всё, исходник можно скачать здесь: 4d1854_key.zip (исходный код, прошивка,  proteus).