orange's学习--第七章:f一次按键只调用一次keyboard_read()函数

目前,一个完整的操作需要在keyboard_read()多次调用时完成。这不但让我们增加了一些全局变量,比如code_with_E0,而且让keyboard_read(  )理解起来也有些困难。符合逻辑的方法是,既然按下一个键会产生一到几字节的扫描码,就最好能够在一个过程中把它们全都读出来。这其实并不困难,只需要将从kb_in中读取字符的代码单独拿出来作为一个函数,在用到的时候调用它就可以了。(这样按一个键产生多个扫描码,在一次keyboard_read()函数就处理完了)。比如按下右侧的Alt键产生的0xE0、0x38,不必调用两次keyboard_read( )。组合键的情况还是要多次调用keyboard_read( )。

只是把从缓冲区读出一个扫描码单独出来。

/*======================================================================*
                get_byte_from_kbuf
 *======================================================================*/
PRIVATE u8 get_byte_from_kbuf()       /* 从键盘缓冲区中读取下一个字节 */
{
        u8 scan_code;

        while (kb_in.count <= 0) {}   /* 等待下一个字节到来 */

        disable_int();
        scan_code = *(kb_in.p_tail);
        kb_in.p_tail++;
        if (kb_in.p_tail == kb_in.buf + KB_IN_BYTES) {
                kb_in.p_tail = kb_in.buf;
        }
        kb_in.count--;
        enable_int();

        return scan_code;
}

你可能感兴趣的:(orang's,于渊著)