接著上篇的問題,既然是按下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 一些簡單排序演算法的下界 通過比較和交換來進行排序的演算法本質上是消除序列中的逆序數,因此求解該演算法的時間複雜度時...