首先,按下key后引发中断,键盘的IRQ #1,会找到处理标号为1 的键盘中断处理函数。
键盘的中断处理函数,无非就是与内存上与PIC连接的port地址进行通信,告诉PIC,这个键盘的中断我CPU已经完成了,可以从你的PIC队列里面delete释放了。
但是,按下一个key却是触发了2个中断,一个是key press,一个是key release,这时候就会往键盘驱动规定的内存port地址中发送2个键盘state,这个state是个字节型数据(00~ff)。
注意:一个按键,对应两个state,对应两个不同的字节数据;比如,a的按键state是0001 0100和1001 0100,其中首尾是flag位,为0表示这个按键是按下状态,为1表示按键是松开状态;
问题来了,那么我一个键都不按,那不就一直触发key release中断了吗?
此时,键盘驱动派上用场了,当中断把键盘state送到驱动的port地址上后,驱动就只读取按下状态的键,也就是为什么要把首位作为flag的原因;代码逻辑如下:
因为按下的键首位为0,所以他们的state值不会超过1000XXXX H
if(key<1000XXXX)
{
switch (key)
{
case 1E :printf("a");
}
}