orange's学习--第七章:b键盘中断处理程序响应多次,并且打印键盘扫描码

敲击键盘有两个方面的含义:动作和内容。动作可以分解成三类:按下、保持按住的状态以及放开;

内容则是键盘上不同的键,字母键还是数字键,回车键还是箭头键。

所以,根据敲击动作产生的编码,8048既要反映 “哪个”按键产生了动作,还要反映产生了 “什么”动作。 

敲击键盘所产生的编码被称作扫描码 (Scan  Code),它分为Make  Code和Break  Code两类。当一个键被按下或者保持住按下时,将会产生Make Code,当键弹起时,产生Break  Code。除了Pause键之外,每一个按键都对应一个Make  Code和一个Break Code。 
当8048检测到一个键的动作后,会把相应的扫描码发送给8042,8042会把它转换成相应的Scan  code  set  1扫描码,并将其放置在输入缓冲区中,然后8042告诉8259A产生中断 (IRQ1)。如果此时键盘又有新的键被按下,8042将不再接收,一直到缓冲区被清空,8042才会收到更多的扫描码。 
每次按键都产生一个Make Code和一个Break Code,即按下键盘产生一次中断,键盘弹起产生一次中断。

/*======================================================================*
                            keyboard_handler
 *======================================================================*/
PUBLIC void keyboard_handler(int irq)
{
    /* disp_str("*"); */
    u8 scan_code = in_byte(0x60);
    disp_int(scan_code);
}


/*======================================================================*
                           init_keyboard
*======================================================================*/
PUBLIC void init_keyboard()
{
        put_irq_handler(KEYBOARD_IRQ, keyboard_handler);/*设定键盘中断处理程序*/
        enable_irq(KEYBOARD_IRQ);                       /*开键盘中断*/
}
按两个键:字符 “a”和 “9”,看出现什么?  总共出现4组代码:0x1E、0x9E、0xA、0x8A。

它们恰恰就是字符 “a”和 “9”的Make Code和Break Code。 
 

注意 :由于a和A是同一个键,所以它们的扫描码是一样的 (事实上根本就不是 “它们”而是 “它”,因为是同一个键),如果按下 “左Shift+a”,将得到这样的输出:0x2A0x1E0x9E0xAA,分别是左Shift键的Make Code、a的Make Code、a的Break Code以及左Shift键的Break ode。所以,按下 “Shifta”得到A是软件的功劳,键盘和8042是不管这些的,在你自己的操作系统中,甚至可以让 “Shift+a”去对应S或者T,只要你习惯就行。同理,按下任何的键,不管是单键还是组合键,想让屏幕输出什么,或者产生什么反应,都是由软件来控制的。虽然增加了操作系统的复杂性,但这种机制无疑是相当灵活的。 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值