2167|4

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

模拟键盘的问题 [复制链接]

方法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

最新回复

^_^,,等待。。。  详情 回复 发表于 2008-6-15 20:43
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
8042的输入缓冲区和输出缓冲区是什么关系,有什么用?
不是很清楚啊
比如我按了键盘的"A",那它的扫描码是不是同时在输入缓冲区和输出缓冲区
都存在?
那样的话只要一个不就够了,又可读又可写。
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
http://www.biosren.com/viewthread.php?tid=40
这个很详细。似乎明白了。试验一下。
咋没人回复,不能给自己结帖呀
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
看代码实在有点烦,而且无语法加亮显示,所以估计都不愿意回了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
^_^,,等待。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表