Понеділок, 29.04.2024, 15:50
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Квітень 2024  »
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
2930

Опрос матричной клавиатуры. Пример использования автомата (State Machine) для Atmega8.



Есть в сети хорошая статья Библиотека для опроса матричной клавиатуры.Код "заточен" под Atmega16,но подходит под любую Мегу.

Особенности модуля:

- простая интеграция с готовым проектом
- поддержка всех микроконтроллеров семейства mega
- возможность использования с любым из трех компиляторов CodeVision, IAR, GCC
- поддержка клавиатур 4х4 и 3х4
- поддержка работы на общей шине
- возможность подключения к одному или двумя портами
- программная антидребезговая защита
- возможность установки произвольных кодов кнопок

Заинтересовавшись данным материалом? я решил переложить код под Atmega8 ,причем клавиатуру посадить на PORTB (PB1...PB7),и сделать выход на управление 8-ю нагрузками (PORTD - целиком).

Схема получилась вот такая:

Файл main.c:
//******************************************************************************
//
//
//
//******************************************************************************
#include <avr/io.h>
#include <util/delay.h>
#include "keyboard.h"

#define sbi(reg,bit) reg |= (1<<bit)
#define cbi(reg,bit) reg &= ~(1<<bit)
#define CheckBit(reg,bit) (reg&(1<<bit))

unsigned char buf = 0;

int main( void )
{
        DDRD |= _BV(PD0);//выход
DDRD |= _BV(PD1);//...
DDRD |= _BV(PD2);//...
DDRD |= _BV(PD3);//выход
        DDRD |= _BV(PD4);//выход
DDRD |= _BV(PD5);//...
DDRD |= _BV(PD6);//...
DDRD |= _BV(PD7);//выход

    PORTD = 0x00;

  KEYB_Init();
  
  while(1)
  {
     _delay_ms(10);
     KEYB_ScanKeyboard();
     buf = KEYB_GetKey();
     if (buf=='1')
   {  
if (CheckBit(PIND, 0)) cbi(PORTD, 0);  //если канал 1 включен, выключаем
        else sbi(PORTD, 0);  // если канал 1 выключен, включаем
        }
     if (buf=='2')
   {  
if (CheckBit(PIND, 1)) cbi(PORTD, 1);  //если канал 2 включен, выключаем
        else sbi(PORTD, 1);  // если канал 2 выключен, включаем
        }
     if (buf=='3')
   {  
if (CheckBit(PIND, 2)) cbi(PORTD, 2);  //если канал 3 включен, выключаем
        else sbi(PORTD, 2);  // если канал 4 выключен, включаем
        }
     if (buf=='4')
   {  
if (CheckBit(PIND, 3)) cbi(PORTD, 3);  //если канал 4 включен, выключаем
        else sbi(PORTD, 3);  // если канал 4 выключен, включаем
        }
     if (buf=='5')
   {  
if (CheckBit(PIND, 4)) cbi(PORTD, 4);  //если канал 5 включен, выключаем
        else sbi(PORTD, 4);  // если канал 5 выключен, включаем
        }
     if (buf=='6')
   {  
if (CheckBit(PIND, 5)) cbi(PORTD, 5);  //если канал 6 включен, выключаем
        else sbi(PORTD, 5);  // если канал 6 выключен, включаем
        }
     if (buf=='7')
   {  
if (CheckBit(PIND, 6)) cbi(PORTD, 6);  //если канал 7 включен, выключаем
        else sbi(PORTD, 6);  // если канал 7 выключен, включаем
        }
     if (buf=='8')
   {  
if (CheckBit(PIND, 7)) cbi(PORTD, 7);  //если канал 8 включен, выключаем
        else sbi(PORTD, 7);  // если канал 8 выключен, включаем
        }
  }
  return 0;
}
Проверено - работает!



Файл проекта для AVRStudio здесь .
Файла проекта для Proteusздесь

Архив записей
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0