Главная » Компьютерная электроника
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей


Набор небольших вибро-моторчиков, 10 шт.

Подключаем PS/2 клавиатуру к PIC

Клавиатура является самым распространенным устройством для ввода информации в компьютер. Поэтому важно знать принцип работы и интерфейс связи клавиатуры.

В данной статье описывается устройство, которое позволяет принимать данные от клавиатуры и отображать нажатые клавиши на устройстве вывода. В качестве примера, мы разработаем простейшее устройство с использованием клавиатуры PS/2, микроконтроллера PIC и семисегментного индикатора.

Проект с использованием PS/2 клавиатуры и PIC

Идея проекта

Главной целью данного проекта является создание устройства, способного работать с PS/2 девайсами, а конкретно с PS/2 клавиатурой. Клавиатура будет подключена к микроконтроллеру PIC, который в свою очередь будет обрабатывать коды нажатых клавиш и выводить символы клавиш на семисегментный индикатор.

PS/2 - это последовательный интерфейс с тактовым сигналом 10-16 кГц, поэтому в PIC нам надо использовать прерывания, для детектирования заднего фронта импульсов.

Список используемых радиоэлементов

Микроконтроллер PIC18F452 (даташит)
7805 - пятивольтовый регулятор напряжения
Кварцевый резонатор 20 МГц
PS/2 коннектор (мама)
7-ми сегментный индикатор
Резисторы

Дополнительно, потребуется программатор для прошивки PIC, макетная плата и перемычки (ну или протравленная печатная плата).

Схемотехника

Как видно из принципиальной схемы ниже, устройство очень простое и основные детали это: 78L05, PIC18F452 и PS/2 разъем.

Схемотехника устройства

В разъеме PS/2 пины 2 и 6 не используются, 4-ый пин - питание +5В, 3-ий пин - общий. 5-ый пин - тактовый сигнал, а 1-ый пин - данные.

7-ми сегментный индикатор я использовал с общим катодом.

Немного теории о PS/2

Как уже было сказано выше, в PS/2 используется последовательный протокол передачи информации с двумя линиями: тактовый сигнал и линия данных.

PS/2 папаPS/2 мама

Назначение выводов 6-pin Mini-DIN (PS/2):
1 - Данные
2 - Не используется
3 - Общий (земля)
4 - Питание (+5V)
5 - Тактовый сигнал
6 - Не используется

На рисунке выше показана распиновка PS/2 разъемов папа (слева) и мама (справа). Обычно, разъем типа "папа" используется на стороне устройства - мышь, клавиатура, а разъем типа "мама" на компьютере. В нашем случае (т.к. у нас приемная сторона) мы будет использовать коннектор типа "мама" (можно вырезать с какой-нибудь сгоревшей материнской платы).

Диаграмма сигналов PS/2

Диаграмма сигналов PS/2

На рисунке выше показана стандартная временная диаграмма выходных данных для PS/2 устройств. Последовательность следующая:
1. Вывод данных устанавливается в низкий логический уровень
2. Вывод тактового сигнала устанавливается в низкий уровень
3. Вывод данных продолжает находиться в низком уровне (стартовый бит)
4. Тактовый сигнал переходит в высокий логический уровень
5. Начинается передача восьми битов с данными
6. Далее идет бит контроля четности
7. А за ним стоповый бит

Все данные принимаются по спаду положительного синхроимпульса.

Скан-коды клавиш

Каждая клавиша клавиатуры содержит свой уникальный код, т.н. скан-код.

Коды клавиш клавиатуры

Коды специальных клавиш клавиатуры

Как видно из картинок выше, большинство клавиш клавиатуры содержит 8-ми битные значения (1 байт), однако некоторые клавиши, содержат многобайтовую последовательность.

Скан-код клавиши J

Рассмотрим пример того, как происходит формирование скан-кодов клавиш. Если на клавиатуре нажимается какая-либо клавиша, то на выходе клавиатуры появляется скан-код нажатой клавишы. Когда клавиша отжимается, то на выходе формируется код 0xF0 и скан-код отжатой клавиши. Т.о. можно определить удерживается ли клавиша нажатой или нет, но нам это пока что не нужно.

осциллограмма

На рисунке выше приведена осциллограмма PS/2 при нажатой клавиши "J". Канал 1 (желтый) на осциллограмме это таковый сигнал. Канал 2 (голубой) это сигнал данных. Для наглядности, я нанес вспомогательные линии для детектирования спада синхросигнала.
При данной осциллограмме легко можно определить скан-код нажатой клавиши. Не забываем, что слева находится младший бит (т.е. 0), а справа старший (7 бит). Т.о. в двоичном коде получилось 0011 1011, что в шестнадцатеричном является 0x3B, т.е. это скан-код клавиши "J".

Передача данных в клавиатуру

Другой функцией PS/2 протокола является передача данных обратно в клавиатуру, к примеру можно подать команду на включение/отключение светодиода Caps Lock, Num Lock и др. Но не будем на этом зацикливаться, т.к. это тема другой статьи.

Собранная схема на макетной плате выглядит следующим образом:

Собранная схема на макетной плате

Программа для PIC

ПО состоит из двух основных частей: главный цикл Main Loop и обработчика прерываний.

В Main Loop происходит прием данных и их обработка для вывода на индикатор. Ну и собственно сам вывод данных.

Часть кода Main Loop:

#include 
 #include 
 #include 
 #include 
 //7-Segment Display Output
 #define number_0 0b01111110
 ..
 ...
 ..
 #define letter_a 0b11101110
 #define letter_b 0b11111110
 ..
 ...
 ..
 void main(void){
 TRISC = 0xFF;
 TRISD = 0x01;
 PORTB = 0x00;
 PORTC = 0x00;
    //7-Seg LED is Reverse Polarity
 PORTD = 0x00 ^ 0xFF;
 Delay10KTCYx(10);
 INTCON = 0b11000000;
 OpenCapture1( C1_EVERY_FALL_EDGE & CAPTURE_INT_ON );
 OpenTimer1( TIMER_INT_ON & T1_SOURCE_INT & T1_PS_1_1 & T1_16BIT_RW );
 WriteTimer1( 0x0000 );
 while(1)
 {
    if(buf_ready == 1){
    switch(scan_code_buf[0]){
    case 0x1C : PORTD = (letter_a ^ 0xFF);
       break;
    ...
    ....
    ..
       break;
    case 0x45 : PORTD = (number_0 ^ 0xFF);
       break;
    case 0x66 : PORTD = (delete ^ 0xFF);
       break;
    default :
       break;
    }
    //Shift Buffer Forward
    scan_code_buf[0] = scan_code_buf[1];
    scan_code_buf[1] = scan_code_buf[2];
    scan_code_buf[2] = scan_code_buf[3];
    scan_code_buf[3] = scan_code_buf[4];
    scan_code_buf[4] = scan_code_buf[5];
    scan_code_buf[5] = scan_code_buf[6];
    scan_code_buf[6] = scan_code_buf[7];
    scan_code_buf_cnt--;

       if(scan_code_buf_cnt == 0)
          buf_ready = 0;
    }
       Delay10KTCYx(1);
 }
 }

Итак, в цикле Main Loop происходит обработка данных, которые поступают в fifo-буфер. В коде, который представлен ниже, происходит прием данных PS/2 по прерыванию, после чего, они помещаются в fifo-буфер. Код 0xF0 игнорируется, нас интересуют только нажатия клавиш.

Код прерываний следующий:

void InterruptHandlerHigh(void) // Declaration of InterruptHandler
 {
     //Check If TMR1 Interrupt Flag Is Set
   if(PIR1bits.CCP1IF){
     if(bit_counter < 10){
       current_scan_code = current_scan_code >> 1;
       current_scan_code += (PORTDbits.RD0*0b10000000000);
       bit_counter++;
     }
     else if(bit_counter == 10){
 scan_code_buf[scan_code_buf_cnt]=(current_scan_code>>2)&0xFF;
       scan_code_buf_cnt++;
       buf_ready = 1;
       bit_counter = 0;
     }
     WriteTimer1( 0x0000 );
     //Clear CCP1 Overflow Flag Bit
     PIR1bits.CCP1IF = 0; 
   }
     //Check If CCP1 Interrupt Flag Is Set
   else if(PIR1bits.TMR1IF){
     //Clear Timer1 Overflow Flag Bit 
     bit_counter = 0;
     PIR1bits.TMR1IF = 0;
   }
   INTCONbits.GIE = 1;
 }

Как видно из кода выше, прерывание захвата скан кода и прерывание timer1 используются вместе, чтобы обеспечить "захват" 8-ми бит, т.к. нам не нужны стартовые, стоповые биты и бит контроля четности.

Как видно из видео выше, устройство прекрасно работает и отображает нажатые цифры и буквы. Единственное, я не стал отображать такие клавиши как W, N и т.п., т.к. на семисегментном индикаторе сделать это не реально.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МК PIC 8-бит
PIC18F4520
1 Поиск в магазине ОтронВ блокнот
Линейный регулятор
LM7805
1 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор47 мкФ1 Поиск в магазине ОтронВ блокнот
Резистор
330 Ом
7 Поиск в магазине ОтронВ блокнот
Кварц20 МГц1 Поиск в магазине ОтронВ блокнот
Семисегментный индикатор1 Поиск в магазине ОтронВ блокнот
РазъемPS21 Поиск в магазине ОтронВ блокнот
Батарея9 В1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

Колтыков А.В. Опубликована: 2011 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (11) | Я собрал (0) | Подписаться

0
Дмитрий #
Неплохо, но не объяснено, каким образом передаются сканы длиннее одного байта (например с 0xF0 вначале), последовательно друг за другом, начиная с младших битов?
Ответить
0
talibanich #
Да. К примеру при нажатии клавиши Enter кейпеде справа идет посылка из 2 байтов: E0 5A, если клавишу отжимаем, то уже идет три байта: E0 F0 5A
Все коды можно посмотреть в этой таблице
Ответить
0
Алексей #
Скажите, а частота синхросигнала имеет значение? У меня задача обратная, сделать устройство генерирующее скан-коды. Точнее так, есть компьютеры без клавиатур, мониторов и т.д., нужно их настроить(диагностика, поставить ОС), а с собой обычно ноутбук. Чтобы еще и клавиатуру не носить с собой, хочу чтобы нажатие на кнопки ноутбука передавались в некое устройство, а оно имитировало клавиатуру. И нет ли чего готового или придется паять микроконтроллер?
Ответить
0
Alex #
Я так понял, что тестовая схема создавалась в Протеусе, у меня появилась необходимость воссоздать её там. Подскажите, как добавить PS/2 порт на мод. схему, в элементах нигде не могу найти.
Ответить
0
Игорь #
Почему на осциллограмме показано 11011100, а вы пишете, что получилось 0011 1011?
Ответить
0
roman #
При передаче байта данных, первым битом идет младший. Что и фиксирует осциллограмма.
Ответить
0
Konstantin #
А как определяется нажатие нескольких клавиш?
Ответить
0
cspy #
Не получением кода отжатия.
Ответить
0
Александр #
В тексте написано "7-ми сегментный индикатор ... с общим катодом", а в схеме использован с общим анодом. Программу (выводимые комбинации бит) надо переделывать или код унифицирован?
Ответить
0
Евгений #
А скажите зачем использовать еще прерывания по таймеру ? В осциллограмме видно, что при спаде CLOCK сигнала, бит данных уже точно установлен, почему нельзя просто его считать и ждать следующего прерывания, по спаду?
Ответить
0
Artos5 #
Скажите, клавиатуру надо как то инициализировать?
У меня почему то клавиатура выдает только 6 бит (6 клоков). Иногда бывает 7 бит...
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

МиниПК MK809V - 4 ядра, Android 4.4.2
МиниПК MK809V - 4 ядра, Android 4.4.2
Лазерный модуль 650нм 5мВт AVR-программатор USB ASP
вверх