天天看點

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

圖一

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

圖二

在鍵盤上按下一個鍵以後,螢幕上會很快把這個字元顯示出來,我們覺得這是一個再自然不過的事情,但是要實作這一步,裡面的機制卻很複雜,這篇文章簡單讨論一下這個問題。

圖二中,我們看到,按下一個鍵以後,這個被按下的鍵的資訊就被立刻送到一個寄存器中,然後CPU就知道了被按下的是什麼鍵,并把這個鍵上的字元顯示在螢幕上面。

那問題來了,CPU怎麼就知道按下的是哪個鍵呢?

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

圖三

我們先看圖三,圖中的每一個按鍵下面,都有若幹導線連接配接,按鍵的下面,是連接配接這些導線的開關,一個按鍵按下去,這些開關有的閉合,有的斷開,閉合的為1,斷開的為0,這就形成了一個二進制數字,也就是ASCII編碼。我們再看圖四就更清楚了。

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

圖四

上圖中,假設每個按鍵下面都有k1-k8這八個開關,現在假設a按鍵按下時,k2,k3,k8閉合,其它的斷開,那麼a就對應二進制01100001,即十進制97,這正是字元a的ascii碼值。到此為止,我們應該大緻清楚了CPU能識别哪個按鍵的原因。

但接下來還有幾個問題:

1:是不是任何時候鍵盤有按鍵的動作發生,我們的計算機都會響應呢?

相信大部分的朋友們都會說不是,就像我們剛打開百度

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

這個時候你無論怎麼按鍵盤,那個框框裡面都沒反應,隻有當我們把滑鼠在框框裡面按了一下,裡面出現了閃動的光标的時候,這個時候我們按鍵才有用。

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

那麼怎麼來了解這個事情呢?首先,我們要有一個概念,前面講的按下a鍵等于産生了一個二進制數字,但是這個數字由誰來識别呢?那麼計算機裡面所有這樣的事情都是由程式來做的,這個程式叫做鍵盤掃描程式,是一個中斷程式,也就是說,這個中斷程式什麼時候能夠運作,必須得到允許才可以,計算機裡面有一個中斷控制電路

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

圖五

就是用來判斷哪個中斷程式什麼時候允許執行。那麼上述百度輸入框的例子,我們就可以了解為,當我們把光标點進那個輸入框的時候,鍵盤輸入的中斷程式才被允許執行。進階語言中的scanf,getfocus函數都可以這樣了解。那麼,那個被允許執行的中斷程式又是用來幹什麼的呢?其實很簡單,就是把那個輸入的字元a的ascii碼轉換為輸出字形碼,并顯示在螢幕上。

第二個問題,就是當我們按住一個鍵不放,或者同時按下兩個鍵的時候,這個時候怎麼處理呢?

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

按住a鍵不放

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

同時按下f和d兩個鍵

從上面兩個圖可以看出,當我們按下一個鍵不放的時候,會出現多個a,那麼系統肯定是以按鍵持續多長時間作為按了一次a來處理的;當同時按住兩個鍵不放的時候,系統最終會判斷出哪個鍵先按下後按下,因為同一秒按下,不等于區分到0.1秒的時候還相同,不等于0.01秒的時候還相同。。。。。。而程式指令的執行時間是納秒級的。

那麼,做這個事情的又是什麼程式呢?就是一個鍵盤掃描程式。

enter鍵的ascii碼_鍵盤兩個鍵同時按下時計算機如何識别被按下的是哪個鍵

這個程式我們不必深究,我們隻需要知道,所謂的鍵盤掃描,就是在圖四的基礎上反複執行temp=P2這條指令,P2可以認為是一個寄存器,也就是不斷地讀出某個鍵被按下的鍵值。我們再看到裡面有一個語句需要連續判斷10次,就是用來判斷某個按鍵被按下的持續時間是否足夠,足夠的話才能被認為是有效按鍵。

這個鍵盤掃描程式隻要作業系統正常運作就在反複執行。