作者:banli | 来源:互联网 | 2023-05-16 09:05
还有一个问题仍然遗留着,就是如果按下一些不可打印的键,如F1键,Home键等等,按下这些键并不需要打印任何东西,它们对应的只是一些功能而已,我们前面的代码直接打印出来,出现的是一些莫名
还有一个问题仍然遗留着,就是如果按下一些不可打印的键,如F1键,Home键等等,按下这些键并不需要打印任何东西,它们对应的只是一些功能而已,我们前面的代码直接打印出来,出现的是一些莫名其妙的东东。
我们还注意到,映射表的每一项的数据类型是一个u32,实际上一个u8就足够了,因为一个ASCII码也只有8位,那么其余的位可以用来额外表示一些信息,比如说这个键按下的时候有没有按下shift键,有没有按下ctrl键,或者这个键是否是可以打印的。
我们来看看keyboard.h的一些代码片段,里面定义了一些在keymap.h中用到的宏:
- #define FLAG_EXT 0x0100 /* Normal function keys */
- #define FLAG_SHIFT_L 0x0200 /* Shift key */
- #define FLAG_SHIFT_R 0x0400 /* Shift key */
- #define FLAG_CTRL_L 0x0800 /* Control key */
- #define FLAG_CTRL_R 0x1000 /* Control key */
- #define FLAG_ALT_L 0x2000 /* Alternate key */
- #define FLAG_ALT_R 0x4000 /* Alternate key */
- #define FLAG_PAD 0x8000 /* keys in num pad */
-
- #define MASK_RAW 0x01FF /* raw key value = code passed to tty & MASK_RAW
- the value can be found either in the keymap column 0
- or in the list below */
-
-
- #define ESC (0x01 + FLAG_EXT) /* Esc */
- #define TAB (0x02 + FLAG_EXT) /* Tab */
- #define ENTER (0x03 + FLAG_EXT) /* Enter */
- #define BACKSPACE (0x04 + FLAG_EXT) /* BackSpace */
-
- #define GUI_L (0x05 + FLAG_EXT) /* L GUI */
- #define GUI_R (0x06 + FLAG_EXT) /* R GUI */
- #define APPS (0x07 + FLAG_EXT) /* APPS */
-
-
- #define SHIFT_L (0x08 + FLAG_EXT) /* L Shift */
- #define SHIFT_R (0x09 + FLAG_EXT) /* R Shift */
- #define CTRL_L (0x0A + FLAG_EXT) /* L Ctrl */
- #define CTRL_R (0x0B + FLAG_EXT) /* R Ctrl */
- #define ALT_L (0x0C + FLAG_EXT) /* L Alt */
- #define ALT_R (0x0D + FLAG_EXT) /* R Alt */
其中定义的每个不可打印的键的key都并上了一个FLAG_EXT的宏,这个宏表示0x100,刚好是key的第9位,前8位表示ASCII码,在打印的时候判断一下就OK了,如果key的第9位置1,就代表不可打印,还注意到左shift键用了第10位,右shift键用了第11位,还有一些ctrl键,alt键先不管那么多先。
我们先前的代码如果碰到的键是不可打印的,就把key置0,表示不可打印,在后面判断一下,如果key为0,则不可打印。但现在在key本身就包含了这个信息,就不用置0,下面来修改代码:
- switch(key)
- {
- case SHIFT_L:
- Shift_L = make;
- break;
- case SHIFT_R:
- Shift_R = make;
- break;
- default:
- break;
- }
- }
-
- if(make)
- {
- key |= (Shift_L ? FLAG_SHIFT_L : 0);
key |= (Shift_R ? FLAG_SHIFT_R : 0);
-
- In_Process(key);
- }
我们看到,最后还判断了一下,如果此时按下了shift键,无论是左还是右,都在key的相应位有所表示。
还有一点就是,Keyboard_Read这个函数只是负责读取对应键的key值,至于如何处理那是上层的事,所以我们新添了一个In_Process函数来处理,这个函数在tty.c中定义:
- #include "keyboard.h"
-
- void In_Process(u32 key_value)
- {
- char disp[2];
- Memory_Set(disp,2,0);
- if(!(key_value & FLAG_EXT))
- {
- disp[0] = key_value & 0xff;
- Disp_Color_Str(disp,0xa);
- }
- }
别忘了在proto.h中添加函数声明:
- void In_Process(u32 key_value);
修改MAKEFILE,运行,按下不可打印的键,什么都没打印出来。