【第7章】解析扫描码【三】

来源:互联网 发布:法布雷加斯助攻数据 编辑:程序博客网 时间:2024/06/07 05:23

     现在就来处理开头是0xE0和0xE1的扫描码,我们看到开头是0xE1的扫描码的键只有pause键,而且这个键没有Break Code,我们就单独来处理它,由于这个键的扫描码有6个之多,那么需要在一次Keyboard_Read的调用把扫描码全部读进来,那么需要从缓冲区中把扫描码读进来的操作抽象成一个函数,由于此函数只在本文件中调用,所以加上一个static:

Code:
  1. static u8 Get_Byte_From_KB_Buffer()   
  2. {   
  3.     u8 scan_code;   
  4.     while(kb_input_buffer.count <= 0){}   
  5.        
  6.     Disable_Int();   
  7.     scan_code = *(kb_input_buffer.p_head);   
  8.     kb_input_buffer.p_head++;   
  9.     kb_input_buffer.count--;   
  10.     if(kb_input_buffer.p_head >= kb_input_buffer.buffer + 256)   
  11.     {   
  12.         kb_input_buffer.p_head = kb_input_buffer.buffer;   
  13.     }   
  14.     Enable_Int();   
  15.     return scan_code;   
  16. }  

     有一点小的改变,就是原来的操作如果缓冲区没有扫描码就直接退出,这里加了一个while循环,如果缓冲区没有扫描码,就一直等待直到有为止。

     然后在函数的开头用刚写好的函数从缓冲区中得到一个扫描码,再在if分支里添加操作来判断是否按下pause键,pause键的Make Code码为0xE1,0x1D,0x45,0XE1,0x9D,0xC5,写一个for循环拿取到的扫描码依次判断,如果为pause键盘就把key赋值为PAUSEBREAK宏定义的值,修改好的Keyboard_Read函数如下:

Code:
  1. void Keyboard_Read()   
  2. {   
  3.     u8 scan_code;   
  4.     int make;   
  5.     char disp[2];   
  6.     u32 *key_row;   
  7.     u32 key = 0;   
  8.     int col = 0;   
  9.        
  10.     Memory_Set(&disp[0],2,0);   
  11.        
  12.     if(kb_input_buffer.count > 0)   
  13.     {   
  14.         scan_code = Get_Byte_From_KB_Buffer();   
  15.            
  16.         if(scan_code == 0xe1)   
  17.         {   
  18.             int i;   
  19.             u8 pause_make_code[] = {0xe1,0x1d,0x45,0xe1,0x9d,0xc5};   
  20.             int is_pause = 1;   
  21.             for(i = 1 ; i < 6 ; i++)   
  22.             {   
  23.                 if(Get_Byte_From_KB_Buffer() != pause_make_code[i])   
  24.                 {   
  25.                     is_pause = 0;   
  26.                     break;   
  27.                 }   
  28.             }   
  29.             if(is_pause)   
  30.             {   
  31.                 key = PAUSEBREAK;   
  32.             }   
  33.         }   
  34.         else if(scan_code == 0xe0)   
  35.         {   
  36.             /* 暂时不做任何操作 */  
  37.         }   
  38.         else  
  39.         {   
  40.             make = (scan_code & NR_SCAN_CODES)? 0 : 1;   
  41.             key_row = &Key_Map[(scan_code & 0x7f) * MAP_COLS];   
  42.                
  43.             if(Shift_L || Shift_R)   
  44.             {   
  45.                 col = 1;   
  46.             }   
  47.                
  48.             key = key_row[col];   
  49.                
  50.             switch(key)   
  51.             {   
  52.                 case SHIFT_L:   
  53.                     Shift_L = make;   
  54.                     key = 0;   
  55.                     break;   
  56.                 case SHIFT_R:   
  57.                     Shift_R = make;   
  58.                     key = 0;   
  59.                     break;   
  60.                 default:   
  61.                     if(!make)   
  62.                     {   
  63.                         key = 0;   
  64.                         break;   
  65.                     }   
  66.             }   
  67.         }   
  68.         if(key)   
  69.         {   
  70.             disp[0] = key;   
  71.             Disp_Color_Str(disp,0xa);   
  72.         }    
  73.     }   
  74. }  

     做了一个小改动,把显示的语句挪动了位置,以实验按下pause键后能显示些什么。为了能看到可输出的字符,在keyboard.h中把PAUSEBREAK宏改为0x61。

     make,运行,按下pause键看看出现什么:

     看到对应的输出了吧,呵呵。进度有点慢,哎,别着急,天气冷,取暖器和棉拖鞋买回来就舒服了。

原创粉丝点击