1 | DATA | Key Data |
2 | n/c | Not connected |
3 | GND | Gnd |
4 | VCC | Power , +5 VDC |
5 | CLK | Clock |
6 | n/c | Not connected |
1个起始位 | 总是逻辑0 |
8个数据位 | (LSB)低位在前 |
1个奇偶校验位 | 奇校验 |
1个停止位 | 总是逻辑1 |
1个应答位 | 仅用在主机对设备的通讯中 |
如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
其中a为键盘到PC机的发送时序(如果你用单片机接收,就按照此时序),在时钟的下降沿,数据被PC读入。
b为PC机到键盘的时序。
需要说明的是:键盘的返回值并不是和ASCII码相对应!
一次按键过程至少会发送两组码,通码和断码,通码是按键被按下时发送,断码是当按键释放时发送,按住不动将发送通码。每个键的通码和断码都是唯一的,因此通过查唯一的扫描码,就可以知道哪个键被按下或释放。
扫描码集有三套标准,分别是第一套,第二套和第三套,所有现代的键盘默认使用第二套扫描码。
就以大定字母“A”,首先得按住Shift键,然后按下A键,再松开A键,再松开Shift键。查下面的码表,就得到这样一组键码:
12 1C F0 1C F0 12
101 102 和104 键的键盘:
KEY | 通码 | 断码 | KEY | 通码 | 断码 | KEY | 通码 | 断码 | ||
A | 1C | F0 1C | 9 | 46 | F0 46 | [ | 54 | F0 54 | ||
B | 32 | F0 32 | 0E | F0 0E | INSERT | E0 70 | E0 F0 70 | |||
C | 21 | F0 21 | - | 4E | F0 4E | HOME | E0 6C | E0 F0 6C | ||
D | 23 | F0 23 | = | 55 | F0 55 | PG UP | E0 7D | E0 F0 7D | ||
E | 24 | F0 24 | 5D | F0 5D | DELETE | E0 71 | E0 F0 71 | |||
F | 2B | F0 2B | BKSP | 66 | F0 66 | END | E0 69 | E0 F0 69 | ||
G | 34 | F0 34 | SPACE | 29 | F0 29 | PG DN | E0 7A | E0 F0 7A | ||
H | 33 | F0 33 | TAB | 0D | F0 0D | U ARROW | E0 75 | E0 F0 75 | ||
I | 43 | F0 43 | CAPS | 58 | F0 58 | L ARROW | E0 6B | E0 F0 6B | ||
J | 3B | F0 3B | L SHFT | 12 | F0 12 | D ARROW | E0 72 | E0 F0 72 | ||
K | 42 | F0 42 | L CTRL | 14 | F0 14 | R ARROW | E0 74 | E0 F0 74 | ||
L | 4B | F0 4B | L GUI | E0 1F | E0 F0 1F | NUM | 77 | F0 77 | ||
M | 3A | F0 3A | L ALT | 11 | F0 11 | KP / | E0 4A | E0 F0 4A | ||
N | 31 | F0 31 | R SHFT | 59 | F0 59 | KP * | 7C | F0 7C | ||
O | 44 | F0 44 | R CTRL | E0 14 | E0 F0 14 | KP - | 7B | F0 7B | ||
P | 4D | F0 4D | R GUI | E0 27 | E0 F0 27 | KP + | 79 | F0 79 | ||
Q | 15 | F0 15 | R ALT | E0 11 | E0 F0 11 | KP EN | E0 5A | E0 F0 5A | ||
R | 2D | F0 2D | APPS | E0 2F | E0 F0 2F | KP | 71 | F0 71 | ||
S | 1B | F0 1B | ENTER | 5A | F0 5A | KP 0 | 70 | F0 70 | ||
T | 2C | F0 2C | ESC | 76 | F0 76 | KP 1 | 69 | F0 69 | ||
U | 3C | F0 3C | F1 | 05 | F0 05 | KP 2 | 72 | F0 72 | ||
V | 2A | F0 2A | F2 | 06 | F0 06 | KP 3 | 7A | F0 7A | ||
W | 1D | F0 1D | F3 | 04 | F0 04 | KP 4 | 6B | F0 6B | ||
X | 22 | F0 22 | F4 | 0C | F0 0C | KP 5 | 73 | F0 73 | ||
Y | 35 | F0 35 | F5 | 03 | F0 03 | KP 6 | 74 | F0 74 | ||
Z | 1A | F0 1A | F6 | 0B | F0 0B | KP 7 | 6C | F0 6C | ||
0 | 45 | F0 45 | F7 | 83 | F0 83 | KP 8 | 75 | F0 75 | ||
1 | 16 | F0 16 | F8 | 0A | F0 0A | KP 9 | 7D | F0 7D | ||
2 | 1E | F0 1E | F9 | 01 | F0 01 | ] | 58 | F0 58 | ||
3 | 26 | F0 26 | F10 | 09 | F0 09 | ; | 4C | F0 4C | ||
4 | 25 | F0 25 | F11 | 78 | F0 78 | , | 52 | F0 52 | ||
5 | 2E | F0 2E | F12 | 07 | F0 07 | , | 41 | F0 41 | ||
6 | 36 | F0 36 | PRNT SCRN | E0 12 | E0 F0 | 49 | F0 49 | |||
7 | 3D | F0 3D | SCROLL | 7E | F0 7E | / | 4A | F0 4A | ||
8 | 3E | F0 3E | PAUSE | E1 14 77 | -NONE- |
以下是51单片机的读取键码程序,此程序仅仅是取得键盘的通码和断码,要得到ASCII还需要解码程序,要看到结果还得要显示程序。其它请看本站相关文章。
#define sck P3_3 //写义时钟线,选用中断口#define dat P3_4//定义数据线 unsigned char keyvalue;//键码 unsigned char intnum = 0; //中断次数 bit bf = 0; //已经取得一个键码时为1 /*------------------------------------------------------ 51单片机设为低电平触发中断 当时钟线为低时,触发中断,然后读数,等待高电平退出中断 */------------------------------------------------------ void int1(void) interrupt 2//中断处理 { if ((intnum > 0) && (intnum < 9)) { //只读取第1--8位,也就是键码位,抛弃起始位0,校验位9与停止位10 keyvalue >>= 1; //因为键盘先发送的是最低位,所以右移一位 if (dat) { keyvalue |= 0x80; //当数据线为1时,将最高位置1 } } intnum++;//中断次数加1 while (!sck); //当时钟线为低电平时循环至到时钟线为高电平 if (intnum > 10) { //当中断11次后,表示一个字已经发完,禁止中断,等待处理,处理完后,清零bf intnum = 0; bf = 1; EA = 0; } }