先看一下硬體的連線:
鍵盤裡有個 8048 晶元,當按下某個按鍵時, 8048 就把這個鍵對應的數值傳送給 8042 ,8042就知道是哪個鍵被按下了,就會給 8259a 傳送中斷。
乙個按鍵被按下,產生的編碼叫通碼(makecode),斷開時叫斷碼(breakcode)。
按鍵有 3 種狀態,「按下」、「按下保持」、「彈起」。
有好幾種鍵盤掃瞄碼,需要乙個「中介軟體」來隱藏各套掃瞄碼的差異,這個「中介軟體」就是 8042。
總結:處理器和鍵盤之間的資料傳輸、命令控制都是通過這一中介軟體——8042.
其實就是 2 個埠, 4 個暫存器。
鍵盤的中斷訊號接在 8259a 主片的 ir1 上,對應的中斷號就是 0x21。
所以增加中斷入口程式中的0x21通道。
vector 0x21
,zero ;鍵盤中斷對應的入口
vector 0x22
,zero ;級聯用的
vector 0x23
,zero ;串列埠2對應的入口
vector 0x24
,zero ;串列埠1對應的入口
vector 0x25
,zero ;並口2對應的入口
vector 0x26
,zero ;軟盤對應的入口
vector 0x27
,zero ;並口1對應的入口
vector 0x28
,zero ;實時時鐘對應的入口
vector 0x29
,zero ;重定向
vector 0x2a
,zero ;保留
vector 0x2b
,zero ;保留
vector 0x2c
,zero ;ps/
2滑鼠vector 0x2d
,zero ;fpu浮點單元異常
vector 0x2e
,zero ;硬碟
vector 0x2f
,zero ;保留
修改my_interrupt.c中的巨集定義
#define idt_desc_cnt 0x30
// 目前總共支援的中斷數
新建兩個檔案 keyboard.c 和 keyboard.h 用來 鍵盤的中斷處理程式和鍵盤的初始化程式。
keyboard.c
#include
"keyboard.h"
#include
"../lib/kernel/print.h"
#include
"../kernel/my_interrupt.h"
#include
"../lib/std_int.h"
#define kbd_buf_port 0x60
// 鍵盤buffer暫存器埠號為0x60
/* 將從埠port讀入的乙個位元組返回 */
static uint8_t inb
(uint16_t port)
/* 鍵盤中斷處理程式 */
static
void
intr_keyboard_handler
(void
)/* 鍵盤初始化 */
void
keyboard_init()
編寫了鍵盤初始化函式,其中還註冊了鍵盤中斷處理函式。
在 init_all() 函式中要呼叫 keyboard_init() 。
還有,把時鐘中斷遮蔽掉,只開啟鍵盤中斷。
最終在main.c中。
main.c
int
main
(void
)
只是開啟中斷。
這樣,咱們每按下乙個按鍵,就會執行兩次中斷,每次中斷會在螢幕輸出 『k』。
鍵盤發出的中斷
在linux的世界裡,計算機系統外圍的硬體裝置是核心來管理的。核心與硬體有乙個介面。linux作業系統都提供了中斷機制。當硬體裝置想與linux作業系統通訊的時候,它首先會發出乙個非同步的中斷訊號去打斷處理器的執行,繼而打斷核心的執行。中斷通常對應著乙個中斷號,核心通過這個中斷號查詢相應的中斷服務程...
中斷方式的擴充套件矩陣鍵盤
來電了!電工總算煩了,沒想到會這麼快,多虧阿福,外面真是只能湊合,還是自個兒宿舍舒服,明天開焊!總圖最小系統 數碼管 與門實現鍵盤中斷觸發 解碼器實現矩陣鍵盤的擴充套件 擴充套件的矩陣鍵盤 程式 include 標頭檔案 include define uchar unsigned char 巨集定義...
測試真的不簡單,梳理22種測試方法與詳解
黑盒測試 不基於內部設計和 的任何知識,而是基於需求和功能性。白盒測試 基於乙個應用 的內部邏輯知識,測試是基於覆蓋全部 分支 路徑 條件。單元測試 最微小規模的測試 以測試某個功能或 塊。典型地由程式設計師而非測試員來做,因為它需要知道內部程式設計和編碼的細節知識。這個工作不容易作好,除非應用系統...