獲取按鍵編碼
修改int.c中的inthandle21
#define port_keydat 0x0060 //從編號為0x0060裝置輸入的8位資訊是按鍵編碼
/* 來自 ps/2 鍵盤的中斷 */
void inthandler21(int *esp) //將接收到的按鍵編碼顯示在畫面上
按下鍵後可以顯示按鍵編碼
加快中斷
先將按鍵編碼接收下來,儲存在變數裡,然後由harimain偶爾去檢視變數
int.c節選
struct keybuf
;#define port_keydat 0x0060 //從編號為0x0060裝置輸入的8位資訊是按鍵編碼
struct keybuf keybuf;
void inthandler21(int *esp)
return;
}
bootpack.c中的harimain節選
for (;;)
else
}
缺陷:
當按下右鍵ctrl時,一次產生兩個位元組鍵碼值,因為鍵盤內部電路一次只能傳送乙個位元組,所以一次按鍵會產生2次中斷,本程式第二次產生的鍵碼值被丟棄了。
製作fifo緩衝區
問題出現在之前所建立的緩衝區只能儲存乙個位元組,現在做乙個能儲存多個位元組的緩衝區。
int.c節選
struct
keybuf
;void inthandler21(int *esp)
return;
}
bootpack.c節選
for (;;)
else
}
改善fifo緩衝區去掉資料移送操作
int.c節選
struct keybuf
;void inthandler21(int *esp)
return;
}
bootpack.c節選
for (;;)
else
io_sti(); //開中斷,因為鍵碼已經儲存完畢,所以再開放中斷也沒關係
sprintf(s, "%02x", i);
boxfill8(binfo->vram, binfo->scrnx, col8_008484,0,16,15,31);
putfonts8_asc(binfo->vram, binfo->scrnx,0,16, col8_ffffff, s); //顯示鍵碼}}
整理fifo緩衝區將結構體改為:
struct fifo8
;
fifo.c
#define flags_overrun 0x0001
/* 初始化fifo緩衝區 */
void fifo8_init(struct fifo8 *fifo, int size, unsigned char *buf)
/* 向fifo緩衝區傳送資料並儲存 */
int fifo8_put(struct fifo8 *fifo, unsigned char data)
fifo->buf[fifo->next_w] = data;
fifo->next_w++;
if (fifo->next_w == fifo->size)
fifo->free--;
return 0;
}/* 從fifo取得乙個資料 */
int fifo8_get(struct fifo8 *fifo)
data = fifo->buf[fifo->next_r];
fifo->next_r++;
if (fifo->next_r == fifo->size)
fifo->free++;
return data;
}/* 報告一下到底積攢了多少資料 */
int fifo8_status(struct fifo8 *fifo)
init.c節選
#define port_keydat 0x0060 //從編號為0x0060裝置輸入的8位資訊是按鍵編碼
struct fifo8 keyfifo;
void inthandler21(int *esp)
bootpack.c節選
char s[40], mcursor[256], keybuf[32];
fifo8_init(&keyfifo, 32, keybuf);
for (;;)
else
}
啟用滑鼠控制器bootpack.c節選
#define port_keydat 0x0060
#define port_keysta 0x0064
#define port_keycmd 0x0064
#define keysta_send_notready 0x02
#define keycmd_write_mode 0x60
#define kbc_mode 0x47
//讓鍵盤控制電路kbc(keyboard controller)做好準備,等待控制指令的到來
void wait_kbc_sendready(void)
/* 初始化鍵盤控制電路。一邊確認可否往鍵盤控制電路傳送資訊,一邊傳送模式設定指令 */
void init_keyboard(void)
#define keycmd_sendto_mouse 0xd4
#define mousecmd_enable 0xf4
/* 啟用滑鼠 */
void enable_mouse(void)
然後在主函式中呼叫init_keyboard();和enable_mouse();
make run後產生了滑鼠中斷
從滑鼠接收資料
int.c節選
struct fifo8 mousefifo;
/* 來自ps/2滑鼠的中斷 */
void inthandler2c(int *esp)
bootpack.c節選
總結一下從滑鼠或者鍵盤獲取資料並顯示:
1、初始化滑鼠控制電路。滑鼠控制電路包含在鍵盤控制電路中,如果鍵盤控制電路初始完成,滑鼠控制器的啟用也就完成了。迴圈檢查鍵盤電路是否準備好,準備好後傳送模式設定指令。
2、傳送啟用滑鼠指令。歸根到底還是要想鍵盤控制器傳送指令。這一步的函式與上一步很像,不同點在於寫入資料不同,如果往鍵盤控制電路寫入0xd4,下乙個資料就會自動傳送給滑鼠。
3、在中斷處理函式中編寫中斷處理,如要將顯示的內容存入緩衝區。
4、在主函式顯示中斷處理,如將緩衝區中的內容顯示處來。
第7天 FIFO與滑鼠控制
2020.4.1 1.獲取按鍵編碼 harib04a 注意,從編號0x0060的裝置輸入的8位資訊是按鍵編碼。編號0x0060的裝置是鍵盤。make run後按下鍵盤按鍵a 2.加快中斷處理 harib04b 修改bootpack.c的harimain函式 節選 extern struct keyb...
30天自製作業系統 第7天 FIFO與滑鼠控制
今天前半部分講的都是鍵盤輸出與緩衝區的問題,後半部分才是滑鼠移動問題。緩衝區fifo實現 在按鍵盤上乙個鍵時,鍵盤會以中斷形式傳送給cpu資料。在現階段的設計中,一次只傳送一位元組,但是在按一些鍵時,會傳送兩位位元組,此時另一位元組如果不暫存,就丟失了 在有些情況,會碰到鍵盤中斷傳送的資料不能馬上被...
win7怎麼用鍵盤控制滑鼠
1 首先 2 小鍵盤對應的滑鼠鍵 移動 8 2 4 6 7 9 1 3鍵,八個方位 長距離移動 ctrl 以上八個鍵 即加速移動 選滑鼠左鍵 選滑鼠右鍵 單擊 5 雙擊 或者雙擊 5 拖曳 0 ins 釋放 del 單擊滑鼠左鍵即為先按 再按 5 或者直接按 5 雙擊為雙擊 5 或者按 右擊為先按 ...