7 FIFO與滑鼠控制

2021-07-09 06:54:49 字數 4189 閱讀 5795

獲取按鍵編碼

修改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 或者按 右擊為先按 ...