纸娃娃系统中文键盘全键值实现(包括方向键)
30天自制操作系统吧
全部回复
仅看楼主
level 1
hankerstudio 楼主
bootpack.h 第一行插入添加键值定义
//键值
#define F1 -1
#define F2 -2
#define F3 -3
#define F4 -4
#define F5 -5
#define F6 -6
#define F7 -7
#define F8 -8
#define F9 -9
#define F10 -10
#define F11 -11
#define F12 -12
#define ESC -350 //Esc退出
#define BCK 0x08 //Backspace回格
#define TAB 0x09 //Tab制表
#define LSH -158 //Shift左上档
#define LCT -187 //Ctrl左控制
#define LAL -141 //Alt左换档
#define FXU -111 //方向上↑
#define FXD -112 //方向下↓
#define FXL -113 //方向左←
#define FXR -114 //方向右→
#define XEN -120 //Enter小键盘回车
#define RCT -121 //Ctrl右控制
#define XXG -122 // / 小键盘斜杠
#define RSH -123 //Shift右上档
#define RAL -124 //Alt右换档
#define HME -125 //Home起始
#define PGU -126 //PgUp上页
#define END -127 //END
#define PGD -128 //PgDn下页
#define INS -129 //Insert插入
#define DEL -130 //Delete删除
#define WIN -131 //Window左窗口
#define RMN -132 //Menu右菜单
以上的具体数值可以自定义,我都定义为负数, 免得与现有键值冲突
bootpack.c 修改与添加
//3A+BA=capslock, 45+C5=NUM, E0+5B=左窗口, E0
+3
8=右ALT, E0+5D=右菜单, E0+1D=右Ctrl, E0+36=右Shift
//E0+1C=小回车, E0+53=DEL, E0+4F=END, E0+51=PgDn, E0+52=Insert, E0+47=HOME, E0+49=PgUp, E0+35=小/
//E0+48=方向上, E0+50=方向下, E0+4B=方向左, E0+4D=方向右
static char keytable0[0x80] = {
0, ESC, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', BCK, TAB,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']',0x0a, LCT, 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';','\'', '`', LSH,'\\', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', ',', '.', '/', 0, '*', LAL, ' ', 0, F1, F2, F3, F4, F5,
F6, F7, F8, F9, F10, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
'2', '3', '0', '.', 0, 0, 0, F11, F12, 0, 0, 0, FXU, FXD, FXL, FXR,
XEN, RCT, XXG, RSH, RAL, HME, PGU, END, PGD, INS, DEL, WIN, RMN, 0, 0, 0,
0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0
};
static char keytable1[0x80] = {
0, ESC, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', BCK, TAB,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',0x0a, 0, 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', 0, '|', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, F1, F2, F3, F4, F5,
F6, F7, F8, F9, F10, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
'2', '3', '0', '.', 0, 0, F11, F12, 0, 0, 0, 0, FXU, FXD, FXL, FXR,
XEN, RCT, XXG, RSH, RAL, HME, PGU, END, PGD, INS, DEL, WIN, RMN, 0, 0, 0,
0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0
};
在 for (;;) { 里面的
} else {
i = fifo32_get(&fifo); //当前键值
j = fifo.buf[(fifo.q-2 + fifo.size) % fifo.size]; //上一个键值 /*********添加这个***********/
......
if (256 <= i && i <= 511) { /*键盘数据*/
if (i < 0x80 + 256) { /*将按键编码转换为字符编码*/
/********添加开始*********/
if (j == 0xE0 + 256) { //特殊键
if(i == 0x1C + 256) { i = 0x60 + 256; } //小键盘回车
if(i == 0x1D + 256) { i = 0x61 + 256; } //右Ctrl
if(i == 0x35 + 256) { i = 0x62 + 256; } //小键盘/
if(i == 0x36 + 256) { i = 0x63 + 256; } //右Shift
if(i == 0x38 + 256) { i = 0x64 + 256; } //右ALT
if(i == 0x47 + 256) { i = 0x65 + 256; } //HOME
if(i == 0x49 + 256) { i = 0x66 + 256; } //PgUp
if(i == 0x4F + 256) { i = 0x67 + 256; } //END
if(i == 0x51 + 256) { i = 0x68 + 256; } //PgDn
if(i == 0x52 + 256) { i = 0x69 + 256; } //Insert
if(i == 0x53 + 256) { i = 0x6A + 256; } //DEL
if(i == 0x5B + 256) { i = 0x6B + 256; } //左窗口
if(i == 0x5D + 256) { i = 0x6C + 256; } //右菜单 //冲突值, 这里
if(i == 0x48 + 256) { i = 0x5C + 256; } //方向键上
if(i == 0x50 + 256) { i = 0x5D + 256; } //方向键下 //这个修改后的值与原右菜单值冲突,需要放到它的后面
if(i == 0x4B + 256) { i = 0x5E + 256; } //方向键左
if(i == 0x4D + 256) { i = 0x5F + 256; } //方向键右
}
/*******添加结束*******/
if (key_shift == 0) {
s[0] = keytable0[i - 256];
} else {
s[0] = keytable1[i - 256];
}
} else {
s[0] = 0;
}
......
if (i == 256 + 0x63) {/*右Shift ON */ /********修改*********/
key_shift |= 2;
}
console.c 控制台使用方向
2023年01月30日 07点01分 1
level 1
hankerstudio 楼主
以上键值是根据dell的这款键盘匹配的, 其中这几个键没匹配出具体的键值
2023年01月30日 07点01分 2
1