对扫描码的解析工作有一点烦琐,所以我们还是分步骤来完成它。
不要低估了解析扫描码的复杂性,因为它不但分为Make Code和Break Code,而且有长有短,功能也很多样,比如Home键对应的是一种功能而不是一个ASCII码,所以要区别对待。我们还是由简到繁,先挑能打印的打印一下。
/*======================================================================*
keyboard_read
*======================================================================*/
PUBLIC void keyboard_read()
{
u8 scan_code;
char output[2];
int make; /* TRUE: make; FALSE: break. */
memset(output, 0, 2);
if(kb_in.count > 0){
disable_int();
scan_code = *(kb_in.p_tail);
kb_in.p_tail++;
if (kb_in.p_tail == kb_in.buf + KB_IN_BYTES) {
kb_in.p_tail = kb_in.buf;
}
kb_in.count--;
enable_int();
/* 下面开始解析扫描码 */
if (scan_code == 0xE1) {
/* 暂时不做任何操作 */
}
else if (scan_code == 0xE0) {
/* 暂时不做任何操作 */
}
else { /* 下面处理可打印字符 */
/* 首先判断Make Code 还是 Break Code */
make = (scan_code & FLAG_BREAK ? FALSE : TRUE);
/* 如果是Make Code 就打印,是 Break Code 则不做处理 */
if(make) {
output[0] = keymap[(scan_code&0x7F)*MAP_COLS]; //因为字符已经存储到二维数组里面了,获取到直接打印即可
disp_str(output);
}
}
/* disp_int(scan_code); */
}
}
e代码没有贴出来。
处理Shift、Alt、Ctrl组合键,使用全局变量记录按下状态,按下后就是true,立刻松开就变成flase,在true的时候,按了其他字符就会选择到二维数组的第二列就是大写字符了。而且一个组合键需要调用多次keyborad_read()函数。