Меню сайта
Календарь
|
Опрос матричной клавиатуры. Пример использования автомата (State Machine) для Atmega8.Особенности модуля: - простая интеграция с готовым проектом - поддержка всех микроконтроллеров семейства 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 |