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
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()
Generated on Wed Jul 13 2022 03:09:09 by 1.7.2