第7章 解析掃瞄碼 五

2021-05-25 18:59:36 字數 3343 閱讀 1599

接著上篇的問題,既然是按下insert等鍵的問題,那我們就來列印一下這些鍵產生的掃瞄碼看看。

一看嚇一跳,發現了乙個現象與書中的不同,就是insert鍵,home鍵,page up鍵 page down鍵,end鍵,delete鍵以及四個箭頭的方向鍵的make code和break code和書上說的有點區別,它們的make code,break code分別為:

insert:

home:

page up:

page_down:

end:

delete:

up:down:

left:

right:

先來分析一下出錯的原因,看下列**:

code:

else

if(scan_code == 0xe0)       

}       

}      

假設我們按下的是insert鍵,那麼到了第8行的if為假,此時的scan_code的值為0x2a,正好是左邊的shift鍵的make code的值!繼續向下執行,看**:

code:

make = (scan_code & nr_scan_codes)? 0 : 1;       

key_row = &key_map[(scan_code & 0x7f) * map_cols];       

if(shift_l || shift_r)       

if(code_with_e0)       

key = key_row[col];       

switch(key)       

}      

第一行make置1, 第二行定位到了左shift鍵的行,此時當做是按下左shift鍵來處理!!慢著,此鍵的break code為0xe0,0xd2,0xe0,0xaa,其中有個0xaa是左shift鍵的break code啊,看起來可以模擬左shift鍵彈起而把shift_l置0的效果,但是經過一番分析,卻不能達到目的,分析就略了,很簡單的。這時我們只能人工按一下左shift鍵,來將shift_l置0,此時便又恢復正常,如圖所示:

可以看到,上述這些鍵的make code和break code分別有四個掃瞄碼,而書中卻只有兩個,make code多了前兩個碼:0xe0,0x2a,break code多了後兩個碼:0xe0,0xaa。這意味著我們的原來的邏輯是不準確的,我們就來新增處理這些鍵的**,下面是修改過的keyboard_read函式:

code:

void keyboard_read()   

;   

int is_pause = 1;   

for(i = 1 ; i 

}   

if(is_pause)   

}   

else

if(scan_code == 0xe0)   

else

if(scan_code == 0x52) /* insert */

else

if(scan_code == 0x47) /* home */

else

if(scan_code == 0x49) /* page up */

else

if(scan_code == 0x51) /* page down */

else

if(scan_code == 0x4f) /* end */

else

if(scan_code == 0x53) /* delete */

else

if(scan_code == 0x48) /* up */

else

if(scan_code == 0x50) /* down */

else

if(scan_code == 0x4b) /* left */

else

if(scan_code == 0x4d) /* right */

}   

}   

else

if(scan_code == 0xb7) /* print screen break */

}   

}   

else

if(scan_code == 0xd2) /* insert break */

}   

}   

else

if(scan_code == 0xc7) /* home break */

}   

}   

else

if(scan_code == 0xc9) /* page up break */

}   

}   

else

if(scan_code == 0xd1) /* page down break */

}   

}   

else

if(scan_code == 0xcf) /* end break */

}   

}   

else

if(scan_code == 0xd3) /* delete break */

}   

}   

else

if(scan_code == 0xc8) /* up break */

}   

}   

else

if(scan_code == 0xd0) /* down break */

}   

}   

else

if(scan_code == 0xcb) /* left break */

}   

}   

else

if(scan_code == 0xcd) /* right break */

}   

}   

else

}   

if((key != printscreen) && (key != pausebreak) && (key != insert) && (key != home) && (key != pad_pageup) &&   

(key != pad_pagedown) && (key != end) && (key != delete) && (key != up) && (key != down) && (key != left) &&   

(key != right))   

if(code_with_e0)   

key = key_row[col];   

switch(key)   

}   

}   

if(key)   

}   

}  

make,執行,結果正常。

C 第7章 五 遞迴演算法

用遞迴的方法求n n 1 n 0,1 n n n 1 n 1 例 求4!include using namespace std double fac int n 函式宣告 intmain double fac int n 遞迴問題 漢諾塔 include using namespace std vo...

第7章 函式 7

7.7 類的成員函式 函式原型必須在類中定義。但是,函式體則既可以在類中也可以在類外定義。7.7.1 定義成員函式的函式體 類的所有成員都必須在類定義的花括號裡面宣告,此後,就不能再為類增加任何成員。類的成員函式必須加宣告的一般定義。類的成員函式既可以在類的定義內也可以在類的定義外定義。編譯器隱式地...

第7章 排序

第7章 排序 任何通用的排序演算法均需要nlogn次比較 7.1 預備知識 略7.2 插入排序 插入排序思想 在已排序狀態插入新元素 插入排序的最壞情形和平均情形均為n的平方 7.3 一些簡單排序演算法的下界 通過比較和交換來進行排序的演算法本質上是消除序列中的逆序數,因此求解該演算法的時間複雜度時...