00001 /******************* 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: driver for 8242 keyboard controler 00004 * 00005 *File: keyboard.c 00006 *Author: Book Chen 00007 *Date: 2010.01.01 00008 ******************** 00009 */ 00010 #include "includes.h" 00011 00012 const U8 KeyboardName[]="KEYBOARD"; 00013 U16 TheKeyCode; 00014 KEYBOARD_CONTROL KeyboardCtrl; 00015 00016 void KeyboardInit(void){ 00017 PicIrqDisable(IRQ1_KEYBOARD); 00018 KeyboardCtrl.State=GENERALCODE_STATE; 00019 KeyboardCtrl.Timer=0; 00020 KeyboardCtrl.LedValue=0; 00021 KeyboardCtrl.LedChange=false; 00022 KeyboardCtrl.Ack=false; 00023 KeyboardCtrl.ScrollLock=false; 00024 KeyboardCtrl.CapsLock=false; 00025 KeyboardCtrl.NumLock=false; 00026 KeyboardCtrl.Shift=false; 00027 KeyboardCtrl.Pause=false; 00028 KeyboardCtrl.LeftCtrl=false; 00029 KeyboardCtrl.LeftShift=false; 00030 KeyboardCtrl.LeftAlt=false; 00031 KeyboardCtrl.RightCtrl=false; 00032 KeyboardCtrl.RightShift=false; 00033 KeyboardCtrl.RightAlt=false; 00034 KeyboardCtrl.KeyBuffer.Put=0; 00035 KeyboardCtrl.KeyBuffer.Get=0; 00036 OsEventAdd(&KeyboardCtrl.KeyboardEvent,&KeyboardName,OS_EVENT_KEYBOARD); 00037 InterruptIrqHandlerSet(IRQ1_KEYBOARD,KeyboardHandler); 00038 PicIrqEnable(IRQ1_KEYBOARD); 00039 } 00040 00041 void KeyboardHandler(void){ 00042 U8 ScanCode; 00043 U8 KeyCode; 00044 U8 KeyStatus; 00045 00046 ScanCode=InByte(KB_DATA_REG); 00047 if(ScanCode==KB_ACK){ 00048 KeyboardCtrl.Ack=true; 00049 return; 00050 } 00051 switch(KeyboardCtrl.State){ 00052 case GENERALCODE_STATE: 00053 if(ScanCode==0xe0){ 00054 KeyboardCtrl.State=EXTENDCODE_STATE; 00055 break; 00056 } 00057 else if(ScanCode==0xe1){ 00058 KeyboardCtrl.State=EXTENDCODE2_1STCODE_STATE; 00059 break; 00060 } 00061 KeyStatus=ScanCode&0x80; 00062 ScanCode=ScanCode&0x7f; 00063 switch(ScanCode){ 00064 case KEY_0: 00065 if(KeyboardCtrl.LeftShift==true) KeyCode=')'; 00066 else if(KeyboardCtrl.RightShift==true) KeyCode=')'; 00067 else KeyCode='0'; 00068 break; 00069 case KEY_1: 00070 if(KeyboardCtrl.LeftShift==true) KeyCode='!'; 00071 else if(KeyboardCtrl.RightShift==true) KeyCode='!'; 00072 else KeyCode='1'; 00073 break; 00074 case KEY_2: 00075 if(KeyboardCtrl.LeftShift==true) KeyCode='@'; 00076 else if(KeyboardCtrl.RightShift==true) KeyCode='@'; 00077 else KeyCode='2'; 00078 break; 00079 case KEY_3: 00080 if(KeyboardCtrl.LeftShift==true) KeyCode='#'; 00081 else if(KeyboardCtrl.RightShift==true) KeyCode='#'; 00082 else KeyCode='3'; 00083 break; 00084 case KEY_4: 00085 if(KeyboardCtrl.LeftShift==true) KeyCode='$'; 00086 else if(KeyboardCtrl.RightShift==true) KeyCode='$'; 00087 else KeyCode='4'; 00088 break; 00089 case KEY_5: 00090 if(KeyboardCtrl.LeftShift==true) KeyCode='%'; 00091 else if(KeyboardCtrl.RightShift==true) KeyCode='%'; 00092 else KeyCode='5'; 00093 break; 00094 case KEY_6: 00095 if(KeyboardCtrl.LeftShift==true) KeyCode='^'; 00096 else if(KeyboardCtrl.RightShift==true) KeyCode='^'; 00097 else KeyCode='6'; 00098 break; 00099 case KEY_7: 00100 if(KeyboardCtrl.LeftShift==true) KeyCode='&'; 00101 else if(KeyboardCtrl.RightShift==true) KeyCode='&'; 00102 else KeyCode='7'; 00103 break; 00104 case KEY_8: 00105 if(KeyboardCtrl.LeftShift==true) KeyCode='*'; 00106 else if(KeyboardCtrl.RightShift==true) KeyCode='*'; 00107 else KeyCode='8'; 00108 break; 00109 case KEY_9: 00110 if(KeyboardCtrl.LeftShift==true) KeyCode='('; 00111 else if(KeyboardCtrl.RightShift==true) KeyCode='('; 00112 else KeyCode='9'; 00113 break; 00114 case KEY_a: 00115 if(KeyboardCtrl.CapsLock==true) KeyCode='A'; 00116 else if(KeyboardCtrl.LeftShift==true) KeyCode='A'; 00117 else if(KeyboardCtrl.RightShift==true) KeyCode='A'; 00118 else KeyCode='a'; 00119 break; 00120 case KEY_b: 00121 if(KeyboardCtrl.CapsLock==true) KeyCode='B'; 00122 else if(KeyboardCtrl.LeftShift==true) KeyCode='B'; 00123 else if(KeyboardCtrl.RightShift==true) KeyCode='B'; 00124 else KeyCode='b'; 00125 break; 00126 case KEY_c: 00127 if(KeyboardCtrl.CapsLock==true) KeyCode='C'; 00128 else if(KeyboardCtrl.LeftShift==true) KeyCode='C'; 00129 else if(KeyboardCtrl.RightShift==true) KeyCode='C'; 00130 else KeyCode='c'; 00131 break; 00132 case KEY_d: 00133 if(KeyboardCtrl.CapsLock==true) KeyCode='D'; 00134 else if(KeyboardCtrl.LeftShift==true) KeyCode='D'; 00135 else if(KeyboardCtrl.RightShift==true) KeyCode='D'; 00136 else KeyCode='d'; 00137 break; 00138 case KEY_e: 00139 if(KeyboardCtrl.CapsLock==true) KeyCode='E'; 00140 else if(KeyboardCtrl.LeftShift==true) KeyCode='E'; 00141 else if(KeyboardCtrl.RightShift==true) KeyCode='E'; 00142 else KeyCode='e'; 00143 break; 00144 case KEY_f: 00145 if(KeyboardCtrl.CapsLock==true) KeyCode='F'; 00146 else if(KeyboardCtrl.LeftShift==true) KeyCode='F'; 00147 else if(KeyboardCtrl.RightShift==true) KeyCode='F'; 00148 else KeyCode='f'; 00149 break; 00150 case KEY_g: 00151 if(KeyboardCtrl.CapsLock==true) KeyCode='G'; 00152 else if(KeyboardCtrl.LeftShift==true) KeyCode='G'; 00153 else if(KeyboardCtrl.RightShift==true) KeyCode='G'; 00154 else KeyCode='g'; 00155 break; 00156 case KEY_h: 00157 if(KeyboardCtrl.CapsLock==true) KeyCode='H'; 00158 else if(KeyboardCtrl.LeftShift==true) KeyCode='H'; 00159 else if(KeyboardCtrl.RightShift==true) KeyCode='H'; 00160 else KeyCode='h'; 00161 break; 00162 case KEY_i: 00163 if(KeyboardCtrl.CapsLock==true) KeyCode='I'; 00164 else if(KeyboardCtrl.LeftShift==true) KeyCode='I'; 00165 else if(KeyboardCtrl.RightShift==true) KeyCode='I'; 00166 else KeyCode='i'; 00167 break; 00168 case KEY_j: 00169 if(KeyboardCtrl.CapsLock==true) KeyCode='J'; 00170 else if(KeyboardCtrl.LeftShift==true) KeyCode='J'; 00171 else if(KeyboardCtrl.RightShift==true) KeyCode='J'; 00172 else KeyCode='j'; 00173 break; 00174 case KEY_k: 00175 if(KeyboardCtrl.CapsLock==true) KeyCode='K'; 00176 else if(KeyboardCtrl.LeftShift==true) KeyCode='K'; 00177 else if(KeyboardCtrl.RightShift==true) KeyCode='K'; 00178 else KeyCode='k'; 00179 break; 00180 case KEY_l: 00181 if(KeyboardCtrl.CapsLock==true) KeyCode='L'; 00182 else if(KeyboardCtrl.LeftShift==true) KeyCode='L'; 00183 else if(KeyboardCtrl.RightShift==true) KeyCode='L'; 00184 else KeyCode='l'; 00185 break; 00186 case KEY_m: 00187 if(KeyboardCtrl.CapsLock==true) KeyCode='M'; 00188 else if(KeyboardCtrl.LeftShift==true) KeyCode='M'; 00189 else if(KeyboardCtrl.RightShift==true) KeyCode='M'; 00190 else KeyCode='m'; 00191 break; 00192 case KEY_n: 00193 if(KeyboardCtrl.CapsLock==true) KeyCode='N'; 00194 else if(KeyboardCtrl.LeftShift==true) KeyCode='N'; 00195 else if(KeyboardCtrl.RightShift==true) KeyCode='N'; 00196 else KeyCode='n'; 00197 break; 00198 case KEY_o: 00199 if(KeyboardCtrl.CapsLock==true) KeyCode='O'; 00200 else if(KeyboardCtrl.LeftShift==true) KeyCode='O'; 00201 else if(KeyboardCtrl.RightShift==true) KeyCode='O'; 00202 else KeyCode='o'; 00203 break; 00204 case KEY_p: 00205 if(KeyboardCtrl.CapsLock==true) KeyCode='P'; 00206 else if(KeyboardCtrl.LeftShift==true) KeyCode='P'; 00207 else if(KeyboardCtrl.RightShift==true) KeyCode='P'; 00208 else KeyCode='p'; 00209 break; 00210 case KEY_q: 00211 if(KeyboardCtrl.CapsLock==true) KeyCode='Q'; 00212 else if(KeyboardCtrl.LeftShift==true) KeyCode='Q'; 00213 else if(KeyboardCtrl.RightShift==true) KeyCode='Q'; 00214 else KeyCode='q'; 00215 break; 00216 case KEY_r: 00217 if(KeyboardCtrl.CapsLock==true) KeyCode='R'; 00218 else if(KeyboardCtrl.LeftShift==true) KeyCode='R'; 00219 else if(KeyboardCtrl.RightShift==true) KeyCode='R'; 00220 else KeyCode='r'; 00221 break; 00222 case KEY_s: 00223 if(KeyboardCtrl.CapsLock==true) KeyCode='S'; 00224 else if(KeyboardCtrl.LeftShift==true) KeyCode='S'; 00225 else if(KeyboardCtrl.RightShift==true) KeyCode='S'; 00226 else KeyCode='s'; 00227 break; 00228 case KEY_t: 00229 if(KeyboardCtrl.CapsLock==true) KeyCode='T'; 00230 else if(KeyboardCtrl.LeftShift==true) KeyCode='T'; 00231 else if(KeyboardCtrl.RightShift==true) KeyCode='T'; 00232 else KeyCode='t'; 00233 break; 00234 case KEY_u: 00235 if(KeyboardCtrl.CapsLock==true) KeyCode='U'; 00236 else if(KeyboardCtrl.LeftShift==true) KeyCode='U'; 00237 else if(KeyboardCtrl.RightShift==true) KeyCode='U'; 00238 else KeyCode='u'; 00239 break; 00240 case KEY_v: 00241 if(KeyboardCtrl.CapsLock==true) KeyCode='V'; 00242 else if(KeyboardCtrl.LeftShift==true) KeyCode='V'; 00243 else if(KeyboardCtrl.RightShift==true) KeyCode='V'; 00244 else KeyCode='v'; 00245 break; 00246 case KEY_w: 00247 if(KeyboardCtrl.CapsLock==true) KeyCode='W'; 00248 else if(KeyboardCtrl.LeftShift==true) KeyCode='W'; 00249 else if(KeyboardCtrl.RightShift==true) KeyCode='W'; 00250 else KeyCode='w'; 00251 break; 00252 case KEY_x: 00253 if(KeyboardCtrl.CapsLock==true) KeyCode='X'; 00254 else if(KeyboardCtrl.LeftShift==true) KeyCode='X'; 00255 else if(KeyboardCtrl.RightShift==true) KeyCode='X'; 00256 else KeyCode='x'; 00257 break; 00258 case KEY_y: 00259 if(KeyboardCtrl.CapsLock==true) KeyCode='Y'; 00260 else if(KeyboardCtrl.LeftShift==true) KeyCode='Y'; 00261 else if(KeyboardCtrl.RightShift==true) KeyCode='Y'; 00262 else KeyCode='y'; 00263 break; 00264 case KEY_z: 00265 if(KeyboardCtrl.CapsLock==true) KeyCode='Z'; 00266 else if(KeyboardCtrl.LeftShift==true) KeyCode='Z'; 00267 else if(KeyboardCtrl.RightShift==true) KeyCode='Z'; 00268 else KeyCode='z'; 00269 break; 00270 case KEY_MINUS: 00271 if(KeyboardCtrl.LeftShift==true) KeyCode='_'; 00272 else if(KeyboardCtrl.RightShift==true) KeyCode='_'; 00273 else KeyCode='-'; 00274 break; 00275 case KEY_EQUAL: 00276 if(KeyboardCtrl.LeftShift==true) KeyCode='+'; 00277 else if(KeyboardCtrl.RightShift==true) KeyCode='+'; 00278 else KeyCode='='; 00279 break; 00280 case KEY_UL2DR_SLASH: 00281 if(KeyboardCtrl.LeftShift==true) KeyCode='|'; 00282 else if(KeyboardCtrl.RightShift==true) KeyCode='|'; 00283 else KeyCode='\\'; 00284 break; 00285 case KEY_DIVIDE: 00286 if(KeyboardCtrl.LeftShift==true) KeyCode='?'; 00287 else if(KeyboardCtrl.RightShift==true) KeyCode='?'; 00288 else KeyCode='/'; 00289 break; 00290 case KEY_DOT: 00291 if(KeyboardCtrl.LeftShift==true) KeyCode='>'; 00292 else if(KeyboardCtrl.RightShift==true) KeyCode='>'; 00293 else KeyCode='.'; 00294 break; 00295 case KEY_UPPER_DOT: 00296 if(KeyboardCtrl.LeftShift==true) KeyCode='"'; 00297 else if(KeyboardCtrl.RightShift==true) KeyCode='"'; 00298 else KeyCode='\''; 00299 break; 00300 case KEY_COMMA: 00301 if(KeyboardCtrl.LeftShift==true) KeyCode='<'; 00302 else if(KeyboardCtrl.RightShift==true) KeyCode='<'; 00303 else KeyCode=','; 00304 break; 00305 case KEY_UPPER_COMMA: 00306 if(KeyboardCtrl.LeftShift==true) KeyCode='~'; 00307 else if(KeyboardCtrl.RightShift==true) KeyCode='~'; 00308 else KeyCode='`'; 00309 break; 00310 case KEY_SEMICOLON: 00311 if(KeyboardCtrl.LeftShift==true) KeyCode=':'; 00312 else if(KeyboardCtrl.RightShift==true) KeyCode=':'; 00313 else KeyCode=';'; 00314 break; 00315 case KEY_LEFT_BRACKET: 00316 if(KeyboardCtrl.LeftShift==true) KeyCode='{'; 00317 else if(KeyboardCtrl.RightShift==true) KeyCode='{'; 00318 else KeyCode='['; 00319 break; 00320 case KEY_RIGHT_BRACKET: 00321 if(KeyboardCtrl.LeftShift==true) KeyCode='}'; 00322 else if(KeyboardCtrl.RightShift==true) KeyCode='}'; 00323 else KeyCode=']'; 00324 break; 00325 case KEY_F1: KeyCode=0x80; break; 00326 case KEY_F2: KeyCode=0x81; break; 00327 case KEY_F3: KeyCode=0x82; break; 00328 case KEY_F4: KeyCode=0x83; break; 00329 case KEY_F5: KeyCode=0x84; break; 00330 case KEY_F6: KeyCode=0x85; break; 00331 case KEY_F7: KeyCode=0x86; break; 00332 case KEY_F8: KeyCode=0x87; break; 00333 case KEY_F9: KeyCode=0x88; break; 00334 case KEY_F10: KeyCode=0x89; break; 00335 case KEY_F11: KeyCode=0x8a; break; 00336 case KEY_F12: KeyCode=0x8b; break; 00337 case KEY_ESC: KeyCode=0x1b; break; 00338 case KEY_NUMLOCK: 00339 if(KeyStatus==KEY_PRESS){ 00340 if(KeyboardCtrl.NumLock==true) KeyboardCtrl.NumLock=false; 00341 else KeyboardCtrl.NumLock=true; 00342 KeyboardCtrl.LedChange=true; 00343 } 00344 KeyCode=0xa3; 00345 break; 00346 case KEY_SCROLL_LOCK: 00347 if(KeyStatus==KEY_PRESS){ 00348 if(KeyboardCtrl.ScrollLock==true) KeyboardCtrl.ScrollLock=false; 00349 else KeyboardCtrl.ScrollLock=true; 00350 KeyboardCtrl.LedChange=true; 00351 } 00352 KeyCode=0x8d; 00353 break; 00354 case KEY_SHIFT_RIGHT: 00355 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.RightShift=false; 00356 else KeyboardCtrl.RightShift=true; 00357 KeyCode=0x91; 00358 break; 00359 case KEY_SHIFT_LEFT: 00360 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.LeftShift=false; 00361 else KeyboardCtrl.LeftShift=true; 00362 KeyCode=0x90; 00363 break; 00364 case KEY_ALT_LEFT: 00365 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.LeftAlt=false; 00366 else KeyboardCtrl.LeftAlt=true; 00367 KeyCode=0x96; 00368 break; 00369 case KEY_CAPSLOCK: 00370 if(KeyStatus==KEY_PRESS){ 00371 if(KeyboardCtrl.CapsLock==true) KeyboardCtrl.CapsLock=false; 00372 else KeyboardCtrl.CapsLock=true; 00373 KeyboardCtrl.LedChange=true; 00374 } 00375 KeyCode=0x9e; 00376 break; 00377 case KEY_TAB: 00378 KeyCode=0x8f; 00379 break; 00380 case KEY_CTRL_LEFT: 00381 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.LeftCtrl=false; 00382 else KeyboardCtrl.LeftCtrl=true; 00383 KeyCode=0x92; 00384 break; 00385 case KEY_ENTER: KeyCode=0x0d; break; 00386 case KEY_BACKSPACE: KeyCode=0x08; break; 00387 case KEY_SPACE: KeyCode=0x20; break; 00388 case KEY_NUMPAD_0: 00389 if(KeyboardCtrl.NumLock==true) KeyCode='0'; 00390 else KeyCode=KB_SPECIAL_INS; 00391 break; 00392 case KEY_NUMPAD_1: 00393 if(KeyboardCtrl.NumLock==true) KeyCode='1'; 00394 else KeyCode=KB_SPECIAL_END_KEY; 00395 break; 00396 case KEY_NUMPAD_2: 00397 if(KeyboardCtrl.NumLock==true) KeyCode='2'; 00398 else KeyCode=KB_SPECIAL_DOWN_ARROW_KEY; 00399 break; 00400 case KEY_NUMPAD_3: 00401 if(KeyboardCtrl.NumLock==true) KeyCode='3'; 00402 else KeyCode=KB_SPECIAL_PAGE_DOWN_KEY; 00403 break; 00404 case KEY_NUMPAD_4: 00405 if(KeyboardCtrl.NumLock==true) KeyCode='4'; 00406 else KeyCode=KB_SPECIAL_LEFT_ARROW_KEY; 00407 break; 00408 case KEY_NUMPAD_5: 00409 if(KeyboardCtrl.NumLock==true) KeyCode='5'; 00410 else KeyCode='5'; 00411 break; 00412 case KEY_NUMPAD_6: 00413 if(KeyboardCtrl.NumLock==true) KeyCode='6'; 00414 else KeyCode=KB_SPECIAL_RIGHT_ARROW_KEY; 00415 break; 00416 case KEY_NUMPAD_7: 00417 if(KeyboardCtrl.NumLock==true) KeyCode='7'; 00418 else KeyCode=KB_SPECIAL_HOME_KEY ; 00419 break; 00420 case KEY_NUMPAD_8: 00421 if(KeyboardCtrl.NumLock==true) KeyCode='8'; 00422 else KeyCode=KB_SPECIAL_UP_ARROW_KEY; 00423 break; 00424 case KEY_NUMPAD_9: 00425 if(KeyboardCtrl.NumLock==true) KeyCode='9'; 00426 else KeyCode=KB_SPECIAL_PAGE_UP_KEY; 00427 break; 00428 case KEY_NUMPAD_DOT: 00429 if(KeyboardCtrl.NumLock==true) KeyCode='.'; 00430 else KeyCode=ASCII_DEL; 00431 break; 00432 case KEY_NUMPAD_STAR: 00433 if(KeyboardCtrl.NumLock==true) KeyCode='*'; 00434 else KeyCode='*'; 00435 break; 00436 case KEY_NUMPAD_MINUS: 00437 if(KeyboardCtrl.NumLock==true) KeyCode='-'; 00438 else KeyCode='-'; 00439 break; 00440 case KEY_NUMPAD_PLUS: 00441 if(KeyboardCtrl.NumLock==true) KeyCode='+'; 00442 else KeyCode='+'; 00443 break; 00444 default: 00445 KeyCode=0x00; 00446 break; //null key 00447 } 00448 if(KeyStatus==KEY_RELEASE) KeyCode=0x00; 00449 if(KeyboardKeyBufferCheckIsr()!=BUFFER_FULL){ 00450 if(KeyCode!=0x00) KeyboardKeyBufferPutIsr(KeyCode); 00451 } 00452 break; 00453 case EXTENDCODE_STATE: 00454 KeyStatus=ScanCode&0x80; 00455 ScanCode=ScanCode&0x7f; 00456 switch(ScanCode){ 00457 case KEY_PRTSC: KeyCode=0x8c; break; 00458 case KEY_HOME: KeyCode=0x9a; break; 00459 case KEY_END: KeyCode=0x9c; break; 00460 case KEY_PAGEUP: KeyCode=0x9d; break; 00461 case KEY_PAGEDOWN: KeyCode=0x9b; break; 00462 case KEY_ARROWUP: KeyCode=0x9f; break; 00463 case KEY_ARROWDOWN: KeyCode=0xa1; break; 00464 case KEY_ARROWLEFT: KeyCode=0xa0; break; 00465 case KEY_ARRORRIGHT:KeyCode=0xa2; break; 00466 case KEY_DEL: KeyCode=0x7f; break; 00467 case KEY_INS: KeyCode=0xa5; break; 00468 case KEY_ALT_RIGHT: 00469 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.RightAlt=false; 00470 else KeyboardCtrl.RightAlt=true; 00471 KeyCode=0x97; 00472 break; 00473 case KEY_CTRL_RIGHT: 00474 if(KeyStatus==KEY_RELEASE) KeyboardCtrl.RightCtrl=false; 00475 else KeyboardCtrl.RightCtrl=true; 00476 KeyCode=0x93; 00477 break; 00478 case KEY_WINDOWS_MENU: KeyCode=0x98; break; 00479 case KEY_WINDOWS_START:KeyCode=0x94; break; 00480 case KEY_NUMPAD_DIVIDE:KeyCode='/'; break; 00481 case KEY_NUMPAD_ENTER: KeyCode=0x0d; break; 00482 default: KeyCode=0x00; break; //for skip key 00483 } 00484 if(KeyStatus==KEY_RELEASE) KeyCode=0x00; 00485 if(KeyboardKeyBufferCheckIsr()!=BUFFER_FULL){ 00486 if(KeyCode!=0x00) KeyboardKeyBufferPutIsr(KeyCode); 00487 } 00488 KeyboardCtrl.State=GENERALCODE_STATE; 00489 break; 00490 case EXTENDCODE2_1STCODE_STATE: 00491 TheKeyCode=(U16)ScanCode; 00492 TheKeyCode=TheKeyCode<<8; 00493 KeyboardCtrl.State=EXTENDCODE2_2NDCODE_STATE; 00494 break; 00495 case EXTENDCODE2_2NDCODE_STATE: 00496 TheKeyCode=TheKeyCode+ScanCode; 00497 if(TheKeyCode==0x1d45) KeyCode=0x8e; 00498 else if(TheKeyCode==0x9dc5) KeyCode=0x00; //release value of pause key 00499 else KeyCode=0x00; 00500 if(KeyboardKeyBufferCheckIsr()!=BUFFER_FULL){ 00501 if(KeyCode!=0x00) KeyboardKeyBufferPutIsr(KeyCode); 00502 } 00503 KeyboardCtrl.State=GENERALCODE_STATE; 00504 break; 00505 } 00506 } 00507 00508 U8 KeyboardKeyBufferCheckIsr(void){ 00509 if(KeyboardCtrl.KeyBuffer.Put!=KeyboardCtrl.KeyBuffer.Get){ 00510 if(KeyboardCtrl.KeyBuffer.Put==(KEYBOARD_KEYBUFFER_SZIE-1)){ 00511 if(KeyboardCtrl.KeyBuffer.Get==0) return BUFFER_FULL; 00512 else return BUFFER_NOT_EMPTY; 00513 } 00514 else{ 00515 if((KeyboardCtrl.KeyBuffer.Put+1)==KeyboardCtrl.KeyBuffer.Get) return BUFFER_FULL; 00516 else return BUFFER_NOT_EMPTY; 00517 } 00518 } 00519 else return BUFFER_EMPTY; 00520 } 00521 00522 U8 KeyboardKeyBufferCheck(void){ 00523 if(KeyboardCtrl.KeyBuffer.Put!=KeyboardCtrl.KeyBuffer.Get){ 00524 if(KeyboardCtrl.KeyBuffer.Put==(KEYBOARD_KEYBUFFER_SZIE-1)){ 00525 if(KeyboardCtrl.KeyBuffer.Get==0) return BUFFER_FULL; 00526 else return BUFFER_NOT_EMPTY; 00527 } 00528 else{ 00529 if((KeyboardCtrl.KeyBuffer.Put+1)==KeyboardCtrl.KeyBuffer.Get) return BUFFER_FULL; 00530 else return BUFFER_NOT_EMPTY; 00531 } 00532 } 00533 else return BUFFER_EMPTY; 00534 } 00535 00536 void KeyboardKeyBufferPutIsr(U8 Data){ 00537 if(KeyboardKeyBufferCheckIsr()==BUFFER_FULL) return; 00538 if(KeyboardCtrl.KeyBuffer.Put==(KEYBOARD_KEYBUFFER_SZIE-1)){ 00539 KeyboardCtrl.KeyBuffer.Data[KeyboardCtrl.KeyBuffer.Put]=Data; 00540 KeyboardCtrl.KeyBuffer.Put=0; 00541 } 00542 else{ 00543 KeyboardCtrl.KeyBuffer.Data[KeyboardCtrl.KeyBuffer.Put]=Data; 00544 KeyboardCtrl.KeyBuffer.Put++; 00545 } 00546 } 00547 00548 U8 KeyboardKeyBufferGet(void){ 00549 U8 Data; 00550 00551 if(KeyboardKeyBufferCheck()==BUFFER_EMPTY) return 0; 00552 if(KeyboardCtrl.KeyBuffer.Get==(KEYBOARD_KEYBUFFER_SZIE-1)){ 00553 Data=KeyboardCtrl.KeyBuffer.Data[KeyboardCtrl.KeyBuffer.Get]; 00554 KeyboardCtrl.KeyBuffer.Get=0; 00555 } 00556 else{ 00557 Data=KeyboardCtrl.KeyBuffer.Data[KeyboardCtrl.KeyBuffer.Get]; 00558 KeyboardCtrl.KeyBuffer.Get++; 00559 } 00560 return Data; 00561 } 00562 00563 /************************** 00564 *Function:KeyboardBusyWait 00565 *Description: wait keyboard(8042) ready 00566 * 00567 ***************************/ 00568 void KeyboardBusyWait(void){ 00569 U8 i; 00570 00571 KeyboardCtrl.Timer=1000; 00572 while(InByte(KB_STATUS_REG)&0x02){ 00573 if(KeyboardCtrl.Timer==0) break; 00574 } 00575 } 00576 00577 /************************** 00578 *Function:KeyboardAckWait 00579 *Description: wait keyboard(8042) ack signal 00580 * 00581 ***************************/ 00582 void KeyboardAckWait(void){ 00583 KeyboardCtrl.Timer=100; 00584 while(KeyboardCtrl.Ack==false){ 00585 if(KeyboardCtrl.Timer==0) return; 00586 } 00587 } 00588 00589 /************************** 00590 *Function:KeyboardSetLed 00591 *Description: wait keyboard(8042) ack signal 00592 * 00593 ***************************/ 00594 void KeyboardSetLed(void){ 00595 KeyboardCtrl.LedValue=0; 00596 if(KeyboardCtrl.NumLock==true) KeyboardCtrl.LedValue|=KB_NUMBERLOCK_LED; 00597 if(KeyboardCtrl.CapsLock==true)KeyboardCtrl.LedValue|=KB_CAPSLOCK_LED; 00598 if(KeyboardCtrl.ScrollLock==true)KeyboardCtrl.LedValue|=KB_SCROLLLOCK_LED; 00599 KeyboardCtrl.Ack=false; 00600 KeyboardBusyWait(); 00601 OutByte(KB_DATA_REG,LED_CODE); 00602 KeyboardAckWait(); 00603 KeyboardCtrl.Ack=false; 00604 KeyboardBusyWait(); 00605 OutByte(KB_DATA_REG,KeyboardCtrl.LedValue); 00606 KeyboardAckWait(); 00607 } 00608
1.5.9