模拟键盘的问题

strawberry921   2008-6-6 10:56 楼主
方法1:
procedure SetKey(SCanCode: byte);
begin
  asm
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop1:
    in al, $64
    and al, 10b
    jnz @Loop1
    //向$64端口写命令
    mov al, $D2//写键盘输出缓存命令
    //mov al, $D3//写鼠标输出缓存命令
    out $64, al

    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop2:
    in al, $64
    and al, 10b
    jnz @Loop2
    //向$60端口写参数
    mov al, SCanCode
    out $60, al
  end;
end;

方法2:
BOOLEAN
WaitForKeyboardWrite(VOID)
{
    INT i;
    UCHAR c;

    for (i = 0; i < 1000; ++i)
    {
        KeStallExecutionProcessor(50);
        c = READ_PORT_UCHAR(defI8042_CTRL_PORT);
        if ((c & defOBUFFER_FULL) == defOBUFFER_FULL)
            break;
    }

    return i ? TRUE : FALSE;
}

VOID PressKeyByScanCode(
    IN CONST BYTE ScanCode
)
{
    WRITE_PORT_UCHAR(defI8042_CTRL_PORT, 0xd2);

    WaitForKeyboardWrite();

    WRITE_PORT_UCHAR(defI8042_DATA_PORT, ScanCode);
}

为什么比较状态位的时候,前面那个与10b比较,后面的与1比较?
到底哪个是正确的?第一种方法 的注释是不是写错了?我觉得它
比较的是IBF

回复评论 (4)

8042的输入缓冲区和输出缓冲区是什么关系,有什么用?
不是很清楚啊
比如我按了键盘的"A",那它的扫描码是不是同时在输入缓冲区和输出缓冲区
都存在?
那样的话只要一个不就够了,又可读又可写。
点赞  2008-6-6 12:00
http://www.biosren.com/viewthread.php?tid=40
这个很详细。似乎明白了。试验一下。
咋没人回复,不能给自己结帖呀
点赞  2008-6-6 14:34
看代码实在有点烦,而且无语法加亮显示,所以估计都不愿意回了
点赞  2008-6-14 12:42
^_^,,等待。。。
点赞  2008-6-15 20:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复