模拟键盘的问题

wildcat1984 2008-06-06 10:56:47
方法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
...全文
72 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eshowjow 2008-06-15
  • 打赏
  • 举报
回复
^_^,,等待。。。
fycom200 2008-06-14
  • 打赏
  • 举报
回复
看代码实在有点烦,而且无语法加亮显示,所以估计都不愿意回了
wildcat1984 2008-06-06
  • 打赏
  • 举报
回复
8042的输入缓冲区和输出缓冲区是什么关系,有什么用?
不是很清楚啊
比如我按了键盘的"A",那它的扫描码是不是同时在输入缓冲区和输出缓冲区
都存在?
那样的话只要一个不就够了,又可读又可写。
wildcat1984 2008-06-06
  • 打赏
  • 举报
回复
http://www.biosren.com/viewthread.php?tid=40
这个很详细。似乎明白了。试验一下。
咋没人回复,不能给自己结帖呀

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧