1. 在中斷處理程序中負責顯示不恰當,應該產生中斷後把中斷數據取出來放到FIFO中去。
2. 當鍵盤產生中斷後後中斷處理程序應該向PIC的OCW2發出0x60+IRQ號碼的out指令,說明在中斷處理程序中已經知道這個事件了,接着發出in指令從0x0060寄存器讀取鍵盤按鍵產生的信息,該鍵盤信息保存到FIFO緩衝區中。
#define PORT_KEYDATA 0x0060
struct FIFO8 keyfifo;
void inthandler21(int* esp)
{
unsigned char data;
io_out8(PIC0_OCW2,0x61);
data=io_in8(PORT_KEYDATA);
fifo8_put(&keyfifo,data);
return ;
}
3. 主程序在沒事幹的時候,看緩衝區有無數據,有則取出顯示,沒有則執行HLT指令,循環
/* in MariMain*/
char s[40],mcursor[256],keybuf[32];
fifo8_init(&keyfifo,32,keybuf);
for(;;)
{
io_cli();
if(fifo8_status(&keyfifo)==0)
{
io_stihlt();
}
else
{
i=fifo8_get(&keyfifo);
io_sti();
/*顯示i值*/
}
}
4. FIFO緩衝區,能有效處理Ctrl鍵的問題
struct FIFO8
{
unsigned char* buf;
int p,q,size,free,flags;
};
#define FLAGS_OVERRUN 0x0001
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
{
fifo->size = size;
fifo->buf = buf;
fifo->free = size;
fifo->flags = 0;
fifo->p = 0;
fifo->q = 0;
return;
}
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
if (fifo->free == 0) {
fifo->flags |= FLAGS_OVERRUN;
return -1;
}
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size) {
fifo->p = 0;
}
fifo->free--;
return 0;
}
int fifo8_get(struct FIFO8 *fifo)
{
int data;
if (fifo->free == fifo->size) {
return -1;
}
data = fifo->buf[fifo->q];
fifo->q++;
if (fifo->q == fifo->size) {
fifo->q = 0;
}
fifo->free++;
return data;
}
int fifo8_status(struct FIFO8 *fifo)
{
return fifo->size - fifo->free;
}