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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TextLCD.h"
00003 
00004 #include "PS2Keyboard.h"
00005 
00006 TextLCD lcd(p24, p26, p27, p28, p29, p30);
00007 PS2Keyboard ps2kb(p12, p11);
00008 
00009 PS2Keyboard::keyboard_event_t evt_kb;
00010 
00011 int     shift, ctrl, alt, numlock = 0, capslock = 0;
00012 
00013 char kb_getc() {
00014     char    ascii;
00015     
00016     ascii = 0;
00017     while(ascii == 0) {
00018         if (ps2kb.processing(&evt_kb)) {
00019             lcd.locate(0, 1);
00020             for (int i = 0; i < evt_kb.length; i++) {
00021                 lcd.printf("%02X", evt_kb.scancode[i]);
00022             }
00023             for (int i = 0; i < 16 - evt_kb.length * 2; i++) {
00024                 lcd.printf("-");
00025             }
00026             if ( evt_kb.length == 1) {
00027                 switch (evt_kb.scancode[0]) {
00028                     //Keyboard mode key -Make-
00029                     case (0x12) : shift = 1; lcd.locate(11,0); lcd.putc('S'); break;
00030                     case (0x59) : shift = 1; lcd.locate(11,0); lcd.putc('S'); break;
00031                     case (0x14) : ctrl = 1; lcd.locate(12,0); lcd.putc('C'); break;
00032                     case (0x11) : alt = 1; lcd.locate(13,0); lcd.putc('A'); break;
00033                     case (0x77) : numlock = (numlock) == 0 ? 1 : 0;
00034                                     if (numlock == 1) {lcd.locate(14,0); lcd.putc('N');}
00035                                     else {lcd.locate(14,0); lcd.putc(' ');} break;
00036                     case (0x58) : capslock = (shift) == 1 ? !capslock : capslock; 
00037                                     if (capslock == 1) lcd.locate(15,0), lcd.putc('L'); 
00038                                     else lcd.locate(15,0), lcd.putc(' '); break;
00039                     //Character keys(ASCII) -Make-    
00040                     case (0x29) : ascii = ' '; break; //space
00041                     case (0x0D) : ascii = 0x09; break; //tab
00042                     case (0x66) : ascii = 0x08; break; //BS
00043                     case (0x5A) : ascii = 0x0D; break; //ENTER
00044                     case (0x76) : ascii = 0x1B; break; //ESC
00045                     case (0x1C) : ascii = (shift + capslock) == 1 ? 'A' : 'a'; break;
00046                     case (0x32) : ascii = (shift + capslock) == 1 ? 'B' : 'b'; break;
00047                     case (0x21) : ascii = (shift + capslock) == 1 ? 'C' : 'c'; break;
00048                     case (0x23) : ascii = (shift + capslock) == 1 ? 'D' : 'd'; break;
00049                     case (0x24) : ascii = (shift + capslock) == 1 ? 'E' : 'e'; break;
00050                     case (0x2B) : ascii = (shift + capslock) == 1 ? 'F' : 'f'; break;
00051                     case (0x34) : ascii = (shift + capslock) == 1 ? 'G' : 'g'; break;
00052                     case (0x33) : ascii = (shift + capslock) == 1 ? 'H' : 'h'; break;
00053                     case (0x43) : ascii = (shift + capslock) == 1 ? 'I' : 'i'; break;
00054                     case (0x3B) : ascii = (shift + capslock) == 1 ? 'J' : 'j'; break;
00055                     case (0x42) : ascii = (shift + capslock) == 1 ? 'K' : 'k'; break;
00056                     case (0x4B) : ascii = (shift + capslock) == 1 ? 'L' : 'l'; break;
00057                     case (0x3A) : ascii = (shift + capslock) == 1 ? 'M' : 'm'; break;
00058                     case (0x31) : ascii = (shift + capslock) == 1 ? 'N' : 'n'; break;
00059                     case (0x44) : ascii = (shift + capslock) == 1 ? 'O' : 'o'; break;
00060                     case (0x4D) : ascii = (shift + capslock) == 1 ? 'P' : 'p'; break;
00061                     case (0x15) : ascii = (shift + capslock) == 1 ? 'Q' : 'q'; break;                      
00062                     case (0x2D) : ascii = (shift + capslock) == 1 ? 'R' : 'r'; break;                      
00063                     case (0x1B) : ascii = (shift + capslock) == 1 ? 'S' : 's'; break;                      
00064                     case (0x2C) : ascii = (shift + capslock) == 1 ? 'T' : 't'; break;                       
00065                     case (0x3C) : ascii = (shift + capslock) == 1 ? 'U' : 'u'; break;                     
00066                     case (0x2A) : ascii = (shift + capslock) == 1 ? 'V' : 'v'; break;                     
00067                     case (0x1D) : ascii = (shift + capslock) == 1 ? 'W' : 'w'; break;                      
00068                     case (0x22) : ascii = (shift + capslock) == 1 ? 'X' : 'x'; break;                       
00069                     case (0x35) : ascii = (shift + capslock) == 1 ? 'Y' : 'y'; break;
00070                     case (0x1A) : ascii = (shift + capslock) == 1 ? 'Z' : 'z'; break;                             
00071                     case (0x45) : ascii = shift == 1 ? '0' : '0'; break;
00072                     case (0x16) : ascii = shift == 1 ? '!' : '1'; break;
00073                     case (0x1E) : ascii = shift == 1 ? '"' : '2'; break;
00074                     case (0x26) : ascii = shift == 1 ? '#' : '3'; break;
00075                     case (0x25) : ascii = shift == 1 ? '$' : '4'; break;
00076                     case (0x2E) : ascii = shift == 1 ? '%' : '5'; break;
00077                     case (0x36) : ascii = shift == 1 ? '&' : '6'; break;
00078                     case (0x3D) : ascii = shift == 1 ? '\'' : '7'; break;
00079                     case (0x3E) : ascii = shift == 1 ? '(' : '8'; break;
00080                     case (0x46) : ascii = shift == 1 ? ')' : '9'; break;
00081                     case (0x4E) : ascii = shift == 1 ? '=' : '-'; break;
00082                     case (0x7B) : ascii = shift == 1 ? '-' : '-'; break;
00083                     case (0x4A) : ascii = shift == 1 ? '?' : '/'; break;
00084                     case (0x41) : ascii = shift == 1 ? '<' : ','; break;
00085                     case (0x49) : ascii = shift == 1 ? '>' : '.'; break;
00086                     case (0x6A) : ascii = shift == 1 ? '|' : '\\'; break;                                             
00087                     case (0x5B) : ascii = shift == 1 ? '{' : '['; break;
00088                     case (0x5D) : ascii = shift == 1 ? '}' : ']'; break;                       
00089                     case (0x4C) : ascii = shift == 1 ? '+' : ';'; break;
00090                     case (0x79) : ascii = shift == 1 ? '+' : '+'; break;
00091                     case (0x51) : ascii = shift == 1 ? '_' : '\\'; break;
00092                     case (0x54) : ascii = shift == 1 ? '`' : '@'; break;
00093                     case (0x55) : ascii = shift == 1 ? '~' : '^'; break;
00094                     case (0x7C) : ascii = shift == 1 ? '*' : '*'; break;
00095                     case (0x52) : ascii = shift == 1 ? '*' : ':'; break;
00096                     //Function keys -Make-
00097                     case (0x05) : ascii = 0x05; break; //F1
00098                     case (0x06) : ascii = 0x06; break; //F2
00099                     case (0x04) : ascii = 0x04; break; //F3
00100                     case (0x0C) : ascii = 0x12; break; //F4
00101                     case (0x03) : ascii = 0x03; break; //F5
00102                     case (0x0B) : ascii = 0x11; break; //F6
00103                     case (0x83) : ascii = 0x13; break; //F7
00104                     case (0x0A) : ascii = 0x10; break; //F8
00105                     case (0x01) : ascii = 0x01; break; //F9
00106                     case (0x09) : ascii = 0x02; break; //F10
00107                     case (0x78) : ascii = 0x14; break; //F11
00108                     case (0x07) : ascii = 0x07; break; //F12
00109                     //Tenkeys -Make-                                           
00110                     case (0x75) : ascii = numlock == 1 ? '8' : 0x15; break; //UP
00111                     case (0x72) : ascii = numlock == 1 ? '2' : 0x16; break; //DOWN
00112                     case (0x6B) : ascii = numlock == 1 ? '4' : 0x17; break; //LEFT 
00113                     case (0x74) : ascii = numlock == 1 ? '6' : 0x18; break; //RIGHT
00114                     case (0x6C) : ascii = numlock == 1 ? '7' : 0x1C; break; //HOME
00115                     case (0x69) : ascii = numlock == 1 ? '1' : 0x1D; break; //END
00116                     case (0x70) : ascii = numlock == 1 ? '0' : 0x1E; break; //INS
00117                     case (0x7D) : ascii = numlock == 1 ? '9' : 0x19; break; //PAGE UP
00118                     case (0x7A) : ascii = numlock == 1 ? '3' : 0x1A; break; //PAGE DOWN
00119                     case (0x71) : ascii = numlock == 1 ? '.' : 0x7F; break; //DEL
00120                     case (0x73) : ascii = numlock == 1 ? '5' : '5'; break;                                                                                                                                                                                             
00121                 }                  
00122             } else {
00123                 //Keyboard mode key -Break- F0xx
00124                 if ( evt_kb.length == 2 && evt_kb.scancode[0] == 0xF0) {
00125                     switch (evt_kb.scancode[1]) {
00126                         case (0x12) : shift = 0; lcd.locate(11,0); lcd.putc(' '); break;
00127                         case (0x59) : shift = 0; lcd.locate(11,0); lcd.putc(' '); break;
00128                         case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
00129                         case (0x11) : alt = 0; lcd.locate(13,0); lcd.putc(' '); break;
00130                     }
00131                 } else {
00132                     //Keyboard right mode keys, Arrow, Del -Make- E0xx
00133                     if ( evt_kb.length == 2 && evt_kb.scancode[0] == 0xE0) {
00134                         switch (evt_kb.scancode[1]) {
00135                             case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
00136                             case (0x11) : alt = 0;  lcd.locate(13,0); lcd.putc(' '); break;
00137                             case (0x4A) : ascii = '/'; break;
00138                             case (0x75) : ascii = 0x15; break; //UP
00139                             case (0x72) : ascii = 0x16; break; //DOWN
00140                             case (0x6B) : ascii = 0x17; break; //LEFT
00141                             case (0x74) : ascii = 0x18; break; //RIGHT
00142                             case (0x70) : ascii = 0x1E; break; //INSERT
00143                             case (0x71) : ascii = 0x7F; break; //DEL
00144                             case (0x5A) : ascii = 0x0D; break; //ENTER
00145                         }
00146                     } else {
00147                         //Keyboard right mode keys -Break- E0F0xx
00148                         if ( evt_kb.length == 3 && evt_kb.scancode[0] == 0xE0 && evt_kb.scancode[1] == 0xF0) {
00149                             switch (evt_kb.scancode[2]) {
00150                                 case (0x14) : ctrl = 0; lcd.locate(12,0); lcd.putc(' '); break;
00151                                 case (0x11) : alt = 0; lcd.locate(13,0); lcd.putc(' '); break;
00152                             }
00153                         }
00154                     }                 
00155                 }
00156             }
00157         } 
00158     } //while(ascii == 0)
00159     return ascii;
00160 } //kb_getc()
00161 
00162 int main() {
00163     char    chr;
00164 
00165     lcd.locate(0, 0);
00166     lcd.printf("PS/2 Keyboard");
00167     wait(2.0);
00168 
00169     lcd.cls();
00170     while (1) {
00171         chr = kb_getc();
00172         lcd.locate(0, 1); //Scan code
00173         for (int i = 0; i < evt_kb.length; i++) {
00174             lcd.printf("%02X", evt_kb.scancode[i]);
00175         }
00176         for (int i = 0; i < 16 - evt_kb.length * 2; i++) {
00177             lcd.printf("-");
00178         }        
00179         lcd.locate(0,0);
00180         lcd.printf("           ");
00181         lcd.locate(0,0); //Character name or key name
00182         if (chr != 0) {
00183             switch (chr) {
00184                 case (0x01) : lcd.printf("F9"); break;
00185                 case (0x02) : lcd.printf("F10"); break;
00186                 case (0x03) : lcd.printf("F5"); break;                
00187                 case (0x04) : lcd.printf("F3"); break;
00188                 case (0x05) : lcd.printf("F1"); break;
00189                 case (0x06) : lcd.printf("F2"); break;
00190                 case (0x07) : lcd.printf("F12"); break;
00191                 case (0x08) : lcd.printf("BS"); break;
00192                 case (0x09) : lcd.printf("TAB"); break;
00193                 case (0x0D) : lcd.printf("ENTER"); break;                                
00194                 case (0x10) : lcd.printf("F8"); break;
00195                 case (0x11) : lcd.printf("F6"); break;                                                
00196                 case (0x12) : lcd.printf("F4"); break;
00197                 case (0x13) : lcd.printf("F7"); break;                                
00198                 case (0x14) : lcd.printf("F11"); break;
00199                 case (0x15) : lcd.printf("UP ARROW"); break;
00200                 case (0x16) : lcd.printf("DOWN ARROW"); break;
00201                 case (0x17) : lcd.printf("LEFT ARROW"); break;
00202                 case (0x18) : lcd.printf("RIGHT ARROW"); break;
00203                 case (0x19) : lcd.printf("PAGE UP"); break;
00204                 case (0x1A) : lcd.printf("PAGE DOWN"); break;
00205                 case (0x1B) : lcd.printf("ESC"); break;
00206                 case (0x1C) : lcd.printf("HOME"); break;
00207                 case (0x1D) : lcd.printf("END"); break;
00208                 case (0x1E) : lcd.printf("INS"); break;                                                
00209                 case (0x7F) : lcd.printf("DEL"); break;                
00210                 default: lcd.printf("ASCII %c", chr); break; // ASCII character
00211             }
00212         } 
00213     } //while(1)
00214 } //main()