Работа с протоколом...
 
Уведомления
Очистить все

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

1 Посты
1 Пользователи
0 Likes
7,084 Просмотры
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
Topic starter  

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

Документацию на протокол PS/2 можно посмотреть здесь: https://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();
}


Цитата