敲击键盘有两个方面的含义:动作和内容。动作可以分解成三类:按下、保持按住的状态以及放开;
内容则是键盘上不同的键,字母键还是数字键,回车键还是箭头键。
所以,根据敲击动作产生的编码,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,只要你习惯就行。同理,按下任何的键,不管是单键还是组合键,想让屏幕输出什么,或者产生什么反应,都是由软件来控制的。虽然增加了操作系统的复杂性,但这种机制无疑是相当灵活的。