Особенности модуля:
- простая интеграция с готовым проектом
- простая интеграция с готовым проектом
- поддержка всех микроконтроллеров семейства 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 : здесь