Работа с протоколом PS/2 (клавиатура)

Делимся исходными кодами

Работа с протоколом PS/2 (клавиатура)

Сообщение Radioded » 01 дек 2009, 23:11

Недавно делал проект по защите информации "RC4 шифрование радиоканала".
Пришлось работать с интерфейсом PS/2 т.к. ввод пароля на передающем устройстве осуществлялась именно с неё. Выход Clock подключается к ножке INT1 (микроконтроллера ATmega48), а выход Data к PINC.0.

Документацию на протокол PS/2 можно посмотреть здесь: http://radioded.ru/content/view/53/49/.

А вот часть исходника:
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

//...
 
char flag=11, parity=0;
unsigned int keyboard_data;
unsigned char button, previous_button;

ISR(INT1_vect){       // обработчик прерывания
 
  if ( flag > 0){
    if ((PINC & (0x01)) == (0x01)){
      keyboard_data |= 0x8000;
      if (flag > 2) parity ^= 0x01;
    }
    keyboard_data = keyboard_data >> 1;
    flag--;
  }
   
  if (flag == 0){
    keyboard_data = keyboard_data >> 4;
    parity ^= 0x01;
    if ( ((keyboard_data & 0x0001) == 0) && (((keyboard_data & 0x0200) >> 9) == parity) && ((keyboard_data & 0x0400) != 0) ){
      button = (unsigned char) ((keyboard_data >> 1) & 0x00FF);
      switch (button) {
        case 0x1C : button='A'; break;
        case 0x32 : button='B'; break;
        case 0x21 : button='C'; break;
        case 0x23 : button='D'; break;
        case 0x24 : button='E'; break;
        case 0x2B : button='F'; break;
        case 0x34 : button='G'; break;
        case 0x33 : button='H'; break;
        case 0x43 : button='I'; break;
        case 0x3B : button='J'; break;
        case 0x42 : button='K'; break;
        case 0x4B : button='L'; break;
        case 0x3A : button='M'; break;
        case 0x31 : button='N'; break;
        case 0x44 : button='O'; break;
        case 0x4D : button='P'; break;
        case 0x15 : button='Q'; break;
        case 0x2D : button='R'; break;
        case 0x1B : button='S'; break;
        case 0x2C : button='T'; break;
        case 0x3C : button='U'; break;
        case 0x2A : button='V'; break;
        case 0x1D : button='W'; break;
        case 0x22 : button='X'; break;
        case 0x35 : button='Y'; break;
        case 0x1A : button='Z'; break;
        case 0x45 : button='0'; break;
        case 0x16 : button='1'; break;
        case 0x1E : button='2'; break;
        case 0x26 : button='3'; break;
        case 0x25 : button='4'; break;
        case 0x2E : button='5'; break;
        case 0x36 : button='6'; break;
        case 0x3D : button='7'; break;
        case 0x3E : button='8'; break;
        case 0x46 : button='9'; break;
        case 0x29 : button=' '; break;                      // space!!!
        case 0x76 : clearlcd(); home(); break;
        case 0xF0 : button ='#'; break;          // break code
        case 0x5A : button = '!'; break;         // enter
        default : button='?'; break;
    }
      
    if ((button!= previous_button)&&(button != '#')){
       PORTD ^= (1<<1);
       previous_button = button;               // обработка нажатой клавиши
    }

    
   }
   flag=11;
   parity=0;
  }
}
 

int main(void){
  EICRA |=(1<<ISC11)|(0<<ISC10);         // прерывания по нарастающему фронту
  EIMSK |= (1<<INT1);
  DDRD = 0b00000010;                // LED
  sei();
}
Аватара пользователя
Radioded
Site Admin
 
Сообщения: 180
Зарегистрирован: 07 ноя 2008, 02:47
Откуда: Москва

Вернуться в Исходники



Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей