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;
}