Cap sLock 、NumLock 、Scro llLock 键盘上这3个键有一点特殊,因为每一个都对应一个小灯 (LED)。实际上,不但通过敲击键盘可以控制这些灯的亮灭,通过写入8042的输入缓冲区也可以做到这一点。这样,我们可以维持3个全局变量,用以表示3个灯的状态,在键盘初始化的时候给它们任意赋我们想要的初值,并同时设置灯的相应状态。
/*======================================================================*
init_keyboard
*======================================================================*/
PUBLIC void init_keyboard()
{
kb_in.count = 0;
kb_in.p_head = kb_in.p_tail = kb_in.buf;
shift_l = shift_r = 0;
alt_l = alt_r = 0;
ctrl_l = ctrl_r = 0;
caps_lock = 0;
num_lock = 1;
scroll_lock = 0;
set_leds();
put_irq_handler(KEYBOARD_IRQ, keyboard_handler);/*设定键盘中断处理程序*/
enable_irq(KEYBOARD_IRQ); /*开键盘中断*/
}
/*======================================================================*
set_leds
*======================================================================*/
PRIVATE void set_leds()
{
u8 leds = (caps_lock << 2) | (num_lock << 1) | scroll_lock;
kb_wait();
out_byte(KB_DATA, LED_CODE);
kb_ack();
kb_wait();
out_byte(KB_DATA, leds);
kb_ack();
}