PS2 Keyboard Handling program Both Ctrl and Alt key are do not handling yet. This program performs the original handling using my keyboard. PS2 clk -> p12 PS2 data -> p11 I thank Shinichiro Nakamura who offered PS2 library.

Dependencies:   TextLCD mbed PS2

Committer:
jf1vrr
Date:
Tue May 24 14:29:16 2011 +0000
Revision:
0:8d515d89ad8c
Rev. 0.01A new

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jf1vrr 0:8d515d89ad8c 1 #include "mbed.h"
jf1vrr 0:8d515d89ad8c 2 #include "TextLCD.h"
jf1vrr 0:8d515d89ad8c 3
jf1vrr 0:8d515d89ad8c 4 #include "PS2Keyboard.h"
jf1vrr 0:8d515d89ad8c 5
jf1vrr 0:8d515d89ad8c 6 TextLCD lcd(p24, p26, p27, p28, p29, p30);
jf1vrr 0:8d515d89ad8c 7 PS2Keyboard ps2kb(p12, p11);
jf1vrr 0:8d515d89ad8c 8
jf1vrr 0:8d515d89ad8c 9 PS2Keyboard::keyboard_event_t evt_kb;
jf1vrr 0:8d515d89ad8c 10
jf1vrr 0:8d515d89ad8c 11 int shift, ctrl, alt, numlock = 0, capslock = 0;
jf1vrr 0:8d515d89ad8c 12
jf1vrr 0:8d515d89ad8c 13 char kb_getc() {
jf1vrr 0:8d515d89ad8c 14 char ascii;
jf1vrr 0:8d515d89ad8c 15
jf1vrr 0:8d515d89ad8c 16 ascii = 0;
jf1vrr 0:8d515d89ad8c 17 while(ascii == 0) {
jf1vrr 0:8d515d89ad8c 18 if (ps2kb.processing(&evt_kb)) {
jf1vrr 0:8d515d89ad8c 19 lcd.locate(0, 1);
jf1vrr 0:8d515d89ad8c 20 for (int i = 0; i < evt_kb.length; i++) {
jf1vrr 0:8d515d89ad8c 21 lcd.printf("%02X", evt_kb.scancode[i]);
jf1vrr 0:8d515d89ad8c 22 }
jf1vrr 0:8d515d89ad8c 23 for (int i = 0; i < 16 - evt_kb.length * 2; i++) {
jf1vrr 0:8d515d89ad8c 24 lcd.printf("-");
jf1vrr 0:8d515d89ad8c 25 }
jf1vrr 0:8d515d89ad8c 26 if ( evt_kb.length == 1) {
jf1vrr 0:8d515d89ad8c 27 switch (evt_kb.scancode[0]) {
jf1vrr 0:8d515d89ad8c 28 //Keyboard mode key -Make-
jf1vrr 0:8d515d89ad8c 29 case (0x12) : shift = 1; lcd.locate(11,0); lcd.putc('S'); break;
jf1vrr 0:8d515d89ad8c 30 case (0x59) : shift = 1; lcd.locate(11,0); lcd.putc('S'); break;
jf1vrr 0:8d515d89ad8c 31 case (0x14) : ctrl = 1; lcd.locate(12,0); lcd.putc('C'); break;
jf1vrr 0:8d515d89ad8c 32 case (0x11) : alt = 1; lcd.locate(13,0); lcd.putc('A'); break;
jf1vrr 0:8d515d89ad8c 33 case (0x77) : numlock = (numlock) == 0 ? 1 : 0;
jf1vrr 0:8d515d89ad8c 34 if (numlock == 1) {lcd.locate(14,0); lcd.putc('N');}
jf1vrr 0:8d515d89ad8c 35 else {lcd.locate(14,0); lcd.putc(' ');} break;
jf1vrr 0:8d515d89ad8c 36 case (0x58) : capslock = (shift) == 1 ? !capslock : capslock;
jf1vrr 0:8d515d89ad8c 37 if (capslock == 1) lcd.locate(15,0), lcd.putc('L');
jf1vrr 0:8d515d89ad8c 38 else lcd.locate(15,0), lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 39 //Character keys(ASCII) -Make-
jf1vrr 0:8d515d89ad8c 40 case (0x29) : ascii = ' '; break; //space
jf1vrr 0:8d515d89ad8c 41 case (0x0D) : ascii = 0x09; break; //tab
jf1vrr 0:8d515d89ad8c 42 case (0x66) : ascii = 0x08; break; //BS
jf1vrr 0:8d515d89ad8c 43 case (0x5A) : ascii = 0x0D; break; //ENTER
jf1vrr 0:8d515d89ad8c 44 case (0x76) : ascii = 0x1B; break; //ESC
jf1vrr 0:8d515d89ad8c 45 case (0x1C) : ascii = (shift + capslock) == 1 ? 'A' : 'a'; break;
jf1vrr 0:8d515d89ad8c 46 case (0x32) : ascii = (shift + capslock) == 1 ? 'B' : 'b'; break;
jf1vrr 0:8d515d89ad8c 47 case (0x21) : ascii = (shift + capslock) == 1 ? 'C' : 'c'; break;
jf1vrr 0:8d515d89ad8c 48 case (0x23) : ascii = (shift + capslock) == 1 ? 'D' : 'd'; break;
jf1vrr 0:8d515d89ad8c 49 case (0x24) : ascii = (shift + capslock) == 1 ? 'E' : 'e'; break;
jf1vrr 0:8d515d89ad8c 50 case (0x2B) : ascii = (shift + capslock) == 1 ? 'F' : 'f'; break;
jf1vrr 0:8d515d89ad8c 51 case (0x34) : ascii = (shift + capslock) == 1 ? 'G' : 'g'; break;
jf1vrr 0:8d515d89ad8c 52 case (0x33) : ascii = (shift + capslock) == 1 ? 'H' : 'h'; break;
jf1vrr 0:8d515d89ad8c 53 case (0x43) : ascii = (shift + capslock) == 1 ? 'I' : 'i'; break;
jf1vrr 0:8d515d89ad8c 54 case (0x3B) : ascii = (shift + capslock) == 1 ? 'J' : 'j'; break;
jf1vrr 0:8d515d89ad8c 55 case (0x42) : ascii = (shift + capslock) == 1 ? 'K' : 'k'; break;
jf1vrr 0:8d515d89ad8c 56 case (0x4B) : ascii = (shift + capslock) == 1 ? 'L' : 'l'; break;
jf1vrr 0:8d515d89ad8c 57 case (0x3A) : ascii = (shift + capslock) == 1 ? 'M' : 'm'; break;
jf1vrr 0:8d515d89ad8c 58 case (0x31) : ascii = (shift + capslock) == 1 ? 'N' : 'n'; break;
jf1vrr 0:8d515d89ad8c 59 case (0x44) : ascii = (shift + capslock) == 1 ? 'O' : 'o'; break;
jf1vrr 0:8d515d89ad8c 60 case (0x4D) : ascii = (shift + capslock) == 1 ? 'P' : 'p'; break;
jf1vrr 0:8d515d89ad8c 61 case (0x15) : ascii = (shift + capslock) == 1 ? 'Q' : 'q'; break;
jf1vrr 0:8d515d89ad8c 62 case (0x2D) : ascii = (shift + capslock) == 1 ? 'R' : 'r'; break;
jf1vrr 0:8d515d89ad8c 63 case (0x1B) : ascii = (shift + capslock) == 1 ? 'S' : 's'; break;
jf1vrr 0:8d515d89ad8c 64 case (0x2C) : ascii = (shift + capslock) == 1 ? 'T' : 't'; break;
jf1vrr 0:8d515d89ad8c 65 case (0x3C) : ascii = (shift + capslock) == 1 ? 'U' : 'u'; break;
jf1vrr 0:8d515d89ad8c 66 case (0x2A) : ascii = (shift + capslock) == 1 ? 'V' : 'v'; break;
jf1vrr 0:8d515d89ad8c 67 case (0x1D) : ascii = (shift + capslock) == 1 ? 'W' : 'w'; break;
jf1vrr 0:8d515d89ad8c 68 case (0x22) : ascii = (shift + capslock) == 1 ? 'X' : 'x'; break;
jf1vrr 0:8d515d89ad8c 69 case (0x35) : ascii = (shift + capslock) == 1 ? 'Y' : 'y'; break;
jf1vrr 0:8d515d89ad8c 70 case (0x1A) : ascii = (shift + capslock) == 1 ? 'Z' : 'z'; break;
jf1vrr 0:8d515d89ad8c 71 case (0x45) : ascii = shift == 1 ? '0' : '0'; break;
jf1vrr 0:8d515d89ad8c 72 case (0x16) : ascii = shift == 1 ? '!' : '1'; break;
jf1vrr 0:8d515d89ad8c 73 case (0x1E) : ascii = shift == 1 ? '"' : '2'; break;
jf1vrr 0:8d515d89ad8c 74 case (0x26) : ascii = shift == 1 ? '#' : '3'; break;
jf1vrr 0:8d515d89ad8c 75 case (0x25) : ascii = shift == 1 ? '$' : '4'; break;
jf1vrr 0:8d515d89ad8c 76 case (0x2E) : ascii = shift == 1 ? '%' : '5'; break;
jf1vrr 0:8d515d89ad8c 77 case (0x36) : ascii = shift == 1 ? '&' : '6'; break;
jf1vrr 0:8d515d89ad8c 78 case (0x3D) : ascii = shift == 1 ? '\'' : '7'; break;
jf1vrr 0:8d515d89ad8c 79 case (0x3E) : ascii = shift == 1 ? '(' : '8'; break;
jf1vrr 0:8d515d89ad8c 80 case (0x46) : ascii = shift == 1 ? ')' : '9'; break;
jf1vrr 0:8d515d89ad8c 81 case (0x4E) : ascii = shift == 1 ? '=' : '-'; break;
jf1vrr 0:8d515d89ad8c 82 case (0x7B) : ascii = shift == 1 ? '-' : '-'; break;
jf1vrr 0:8d515d89ad8c 83 case (0x4A) : ascii = shift == 1 ? '?' : '/'; break;
jf1vrr 0:8d515d89ad8c 84 case (0x41) : ascii = shift == 1 ? '<' : ','; break;
jf1vrr 0:8d515d89ad8c 85 case (0x49) : ascii = shift == 1 ? '>' : '.'; break;
jf1vrr 0:8d515d89ad8c 86 case (0x6A) : ascii = shift == 1 ? '|' : '\\'; break;
jf1vrr 0:8d515d89ad8c 87 case (0x5B) : ascii = shift == 1 ? '{' : '['; break;
jf1vrr 0:8d515d89ad8c 88 case (0x5D) : ascii = shift == 1 ? '}' : ']'; break;
jf1vrr 0:8d515d89ad8c 89 case (0x4C) : ascii = shift == 1 ? '+' : ';'; break;
jf1vrr 0:8d515d89ad8c 90 case (0x79) : ascii = shift == 1 ? '+' : '+'; break;
jf1vrr 0:8d515d89ad8c 91 case (0x51) : ascii = shift == 1 ? '_' : '\\'; break;
jf1vrr 0:8d515d89ad8c 92 case (0x54) : ascii = shift == 1 ? '`' : '@'; break;
jf1vrr 0:8d515d89ad8c 93 case (0x55) : ascii = shift == 1 ? '~' : '^'; break;
jf1vrr 0:8d515d89ad8c 94 case (0x7C) : ascii = shift == 1 ? '*' : '*'; break;
jf1vrr 0:8d515d89ad8c 95 case (0x52) : ascii = shift == 1 ? '*' : ':'; break;
jf1vrr 0:8d515d89ad8c 96 //Function keys -Make-
jf1vrr 0:8d515d89ad8c 97 case (0x05) : ascii = 0x05; break; //F1
jf1vrr 0:8d515d89ad8c 98 case (0x06) : ascii = 0x06; break; //F2
jf1vrr 0:8d515d89ad8c 99 case (0x04) : ascii = 0x04; break; //F3
jf1vrr 0:8d515d89ad8c 100 case (0x0C) : ascii = 0x12; break; //F4
jf1vrr 0:8d515d89ad8c 101 case (0x03) : ascii = 0x03; break; //F5
jf1vrr 0:8d515d89ad8c 102 case (0x0B) : ascii = 0x11; break; //F6
jf1vrr 0:8d515d89ad8c 103 case (0x83) : ascii = 0x13; break; //F7
jf1vrr 0:8d515d89ad8c 104 case (0x0A) : ascii = 0x10; break; //F8
jf1vrr 0:8d515d89ad8c 105 case (0x01) : ascii = 0x01; break; //F9
jf1vrr 0:8d515d89ad8c 106 case (0x09) : ascii = 0x02; break; //F10
jf1vrr 0:8d515d89ad8c 107 case (0x78) : ascii = 0x14; break; //F11
jf1vrr 0:8d515d89ad8c 108 case (0x07) : ascii = 0x07; break; //F12
jf1vrr 0:8d515d89ad8c 109 //Tenkeys -Make-
jf1vrr 0:8d515d89ad8c 110 case (0x75) : ascii = numlock == 1 ? '8' : 0x15; break; //UP
jf1vrr 0:8d515d89ad8c 111 case (0x72) : ascii = numlock == 1 ? '2' : 0x16; break; //DOWN
jf1vrr 0:8d515d89ad8c 112 case (0x6B) : ascii = numlock == 1 ? '4' : 0x17; break; //LEFT
jf1vrr 0:8d515d89ad8c 113 case (0x74) : ascii = numlock == 1 ? '6' : 0x18; break; //RIGHT
jf1vrr 0:8d515d89ad8c 114 case (0x6C) : ascii = numlock == 1 ? '7' : 0x1C; break; //HOME
jf1vrr 0:8d515d89ad8c 115 case (0x69) : ascii = numlock == 1 ? '1' : 0x1D; break; //END
jf1vrr 0:8d515d89ad8c 116 case (0x70) : ascii = numlock == 1 ? '0' : 0x1E; break; //INS
jf1vrr 0:8d515d89ad8c 117 case (0x7D) : ascii = numlock == 1 ? '9' : 0x19; break; //PAGE UP
jf1vrr 0:8d515d89ad8c 118 case (0x7A) : ascii = numlock == 1 ? '3' : 0x1A; break; //PAGE DOWN
jf1vrr 0:8d515d89ad8c 119 case (0x71) : ascii = numlock == 1 ? '.' : 0x7F; break; //DEL
jf1vrr 0:8d515d89ad8c 120 case (0x73) : ascii = numlock == 1 ? '5' : '5'; break;
jf1vrr 0:8d515d89ad8c 121 }
jf1vrr 0:8d515d89ad8c 122 } else {
jf1vrr 0:8d515d89ad8c 123 //Keyboard mode key -Break- F0xx
jf1vrr 0:8d515d89ad8c 124 if ( evt_kb.length == 2 && evt_kb.scancode[0] == 0xF0) {
jf1vrr 0:8d515d89ad8c 125 switch (evt_kb.scancode[1]) {
jf1vrr 0:8d515d89ad8c 126 case (0x12) : shift = 0; lcd.locate(11,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 127 case (0x59) : shift = 0; lcd.locate(11,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 128 case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 129 case (0x11) : alt = 0; lcd.locate(13,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 130 }
jf1vrr 0:8d515d89ad8c 131 } else {
jf1vrr 0:8d515d89ad8c 132 //Keyboard right mode keys, Arrow, Del -Make- E0xx
jf1vrr 0:8d515d89ad8c 133 if ( evt_kb.length == 2 && evt_kb.scancode[0] == 0xE0) {
jf1vrr 0:8d515d89ad8c 134 switch (evt_kb.scancode[1]) {
jf1vrr 0:8d515d89ad8c 135 case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 136 case (0x11) : alt = 0; lcd.locate(13,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 137 case (0x4A) : ascii = '/'; break;
jf1vrr 0:8d515d89ad8c 138 case (0x75) : ascii = 0x15; break; //UP
jf1vrr 0:8d515d89ad8c 139 case (0x72) : ascii = 0x16; break; //DOWN
jf1vrr 0:8d515d89ad8c 140 case (0x6B) : ascii = 0x17; break; //LEFT
jf1vrr 0:8d515d89ad8c 141 case (0x74) : ascii = 0x18; break; //RIGHT
jf1vrr 0:8d515d89ad8c 142 case (0x70) : ascii = 0x1E; break; //INSERT
jf1vrr 0:8d515d89ad8c 143 case (0x71) : ascii = 0x7F; break; //DEL
jf1vrr 0:8d515d89ad8c 144 case (0x5A) : ascii = 0x0D; break; //ENTER
jf1vrr 0:8d515d89ad8c 145 }
jf1vrr 0:8d515d89ad8c 146 } else {
jf1vrr 0:8d515d89ad8c 147 //Keyboard right mode keys -Break- E0F0xx
jf1vrr 0:8d515d89ad8c 148 if ( evt_kb.length == 3 && evt_kb.scancode[0] == 0xE0 && evt_kb.scancode[1] == 0xF0) {
jf1vrr 0:8d515d89ad8c 149 switch (evt_kb.scancode[2]) {
jf1vrr 0:8d515d89ad8c 150 case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 151 case (0x11) : alt = 0; lcd.locate(13,0); lcd.putc(' '); break;
jf1vrr 0:8d515d89ad8c 152 }
jf1vrr 0:8d515d89ad8c 153 }
jf1vrr 0:8d515d89ad8c 154 }
jf1vrr 0:8d515d89ad8c 155 }
jf1vrr 0:8d515d89ad8c 156 }
jf1vrr 0:8d515d89ad8c 157 }
jf1vrr 0:8d515d89ad8c 158 } //while(ascii == 0)
jf1vrr 0:8d515d89ad8c 159 return ascii;
jf1vrr 0:8d515d89ad8c 160 } //kb_getc()
jf1vrr 0:8d515d89ad8c 161
jf1vrr 0:8d515d89ad8c 162 int main() {
jf1vrr 0:8d515d89ad8c 163 char chr;
jf1vrr 0:8d515d89ad8c 164
jf1vrr 0:8d515d89ad8c 165 lcd.locate(0, 0);
jf1vrr 0:8d515d89ad8c 166 lcd.printf("PS/2 Keyboard");
jf1vrr 0:8d515d89ad8c 167 wait(2.0);
jf1vrr 0:8d515d89ad8c 168
jf1vrr 0:8d515d89ad8c 169 lcd.cls();
jf1vrr 0:8d515d89ad8c 170 while (1) {
jf1vrr 0:8d515d89ad8c 171 chr = kb_getc();
jf1vrr 0:8d515d89ad8c 172 lcd.locate(0, 1); //Scan code
jf1vrr 0:8d515d89ad8c 173 for (int i = 0; i < evt_kb.length; i++) {
jf1vrr 0:8d515d89ad8c 174 lcd.printf("%02X", evt_kb.scancode[i]);
jf1vrr 0:8d515d89ad8c 175 }
jf1vrr 0:8d515d89ad8c 176 for (int i = 0; i < 16 - evt_kb.length * 2; i++) {
jf1vrr 0:8d515d89ad8c 177 lcd.printf("-");
jf1vrr 0:8d515d89ad8c 178 }
jf1vrr 0:8d515d89ad8c 179 lcd.locate(0,0);
jf1vrr 0:8d515d89ad8c 180 lcd.printf(" ");
jf1vrr 0:8d515d89ad8c 181 lcd.locate(0,0); //Character name or key name
jf1vrr 0:8d515d89ad8c 182 if (chr != 0) {
jf1vrr 0:8d515d89ad8c 183 switch (chr) {
jf1vrr 0:8d515d89ad8c 184 case (0x01) : lcd.printf("F9"); break;
jf1vrr 0:8d515d89ad8c 185 case (0x02) : lcd.printf("F10"); break;
jf1vrr 0:8d515d89ad8c 186 case (0x03) : lcd.printf("F5"); break;
jf1vrr 0:8d515d89ad8c 187 case (0x04) : lcd.printf("F3"); break;
jf1vrr 0:8d515d89ad8c 188 case (0x05) : lcd.printf("F1"); break;
jf1vrr 0:8d515d89ad8c 189 case (0x06) : lcd.printf("F2"); break;
jf1vrr 0:8d515d89ad8c 190 case (0x07) : lcd.printf("F12"); break;
jf1vrr 0:8d515d89ad8c 191 case (0x08) : lcd.printf("BS"); break;
jf1vrr 0:8d515d89ad8c 192 case (0x09) : lcd.printf("TAB"); break;
jf1vrr 0:8d515d89ad8c 193 case (0x0D) : lcd.printf("ENTER"); break;
jf1vrr 0:8d515d89ad8c 194 case (0x10) : lcd.printf("F8"); break;
jf1vrr 0:8d515d89ad8c 195 case (0x11) : lcd.printf("F6"); break;
jf1vrr 0:8d515d89ad8c 196 case (0x12) : lcd.printf("F4"); break;
jf1vrr 0:8d515d89ad8c 197 case (0x13) : lcd.printf("F7"); break;
jf1vrr 0:8d515d89ad8c 198 case (0x14) : lcd.printf("F11"); break;
jf1vrr 0:8d515d89ad8c 199 case (0x15) : lcd.printf("UP ARROW"); break;
jf1vrr 0:8d515d89ad8c 200 case (0x16) : lcd.printf("DOWN ARROW"); break;
jf1vrr 0:8d515d89ad8c 201 case (0x17) : lcd.printf("LEFT ARROW"); break;
jf1vrr 0:8d515d89ad8c 202 case (0x18) : lcd.printf("RIGHT ARROW"); break;
jf1vrr 0:8d515d89ad8c 203 case (0x19) : lcd.printf("PAGE UP"); break;
jf1vrr 0:8d515d89ad8c 204 case (0x1A) : lcd.printf("PAGE DOWN"); break;
jf1vrr 0:8d515d89ad8c 205 case (0x1B) : lcd.printf("ESC"); break;
jf1vrr 0:8d515d89ad8c 206 case (0x1C) : lcd.printf("HOME"); break;
jf1vrr 0:8d515d89ad8c 207 case (0x1D) : lcd.printf("END"); break;
jf1vrr 0:8d515d89ad8c 208 case (0x1E) : lcd.printf("INS"); break;
jf1vrr 0:8d515d89ad8c 209 case (0x7F) : lcd.printf("DEL"); break;
jf1vrr 0:8d515d89ad8c 210 default: lcd.printf("ASCII %c", chr); break; // ASCII character
jf1vrr 0:8d515d89ad8c 211 }
jf1vrr 0:8d515d89ad8c 212 }
jf1vrr 0:8d515d89ad8c 213 } //while(1)
jf1vrr 0:8d515d89ad8c 214 } //main()