четвер, 15 січня 2015 р.

Матрична клавіатура 3х4 на Atmega8 CodeVision AVR





#define COLUMN 3  // Кількість колонок
#define ROW 4     // Кількість рядків
#include <mega8.h>
#include <delay.h>
unsigned char button;//Номер кнопки (позиційний)
//Значення що подаються для сканування рядків
unsigned char key_tab[ROW] ={0b11111110,
                             0b11111101,
               0b11111011,
        0b11110111};
// Функція опитування клавіатури
unsigned char scan_key(void)
{
unsigned char key_value = 0;
unsigned char i;

for(i = 0;i < ROW;i++)//Виводимо почерзі 0 в рядки
  {
  PORTB = key_tab[i]; 
  delay_us(100);

    switch (PINB & 0xF0)// Зчитуємо значення з порта В
    {                   //та обчислюємо номер кнопки
    case 0b11100000:
    key_value = 1 + i * COLUMN;
    return (key_value);
    case 0b11010000:
    key_value = 2 + i * COLUMN;
    return (key_value);
    case 0b10110000:
    key_value = 3 + i * COLUMN;
    return (key_value);
    break;
    }
  }
}
void main(void)
{
// Масив цифр для індикатора
unsigned char num[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

    DDRB |= (1 << 3)|(1 << 2)|(1 << 1)|(1 << 0); // Порт вихода
    DDRB &= ~(1 << 7)|(1 << 6)|(1 << 5)|(1 << 4); // Порт входа
    PORTB = 0xF0; // Встановлюємо лог. 1 в порт входа
    DDRD = 0xFF; // Виход на індикатор
    PORTD = 0x00;
    delay_us(100);
while(1)
{
for(button=1;button<10;button++)
    {
     if(scan_key()==button) // Виводим значення натисненої кнопки на індикатор
        PORTD = num[button];
    }
if(scan_key()==11)     // 0 на 11 кнопці
PORTD = num[0];
    }
}


Немає коментарів :

Дописати коментар