http://blog.youkuaiyun.com/ltbylc/article/details/8309257
1. 键盘中断的处理:产生中断后中断处理程序应该向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 ;
- }
2. 主程序在没事干的时候即执行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值*/
- }
- }
3. FIFO缓冲区,能有效处理Ctrl键的问题
- #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;
- }