ps2键盘编码

ps2键盘编码
ps2键盘编码

2 PS/2键盘的编码与命令集 2.1 PS/2键盘的编码

目前,PC机使用的PS/2键盘都默认采用第2套扫描码集.扫描码有两种不同的类型:“通码(make code)”和“断码(break code)”.当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机.根据键盘按键扫描码的不同,可将按键分为3类:

第1类按键通码为一个字节,断码为0xF0+通码形式.如A键,其通码为0x1C;断码为0xF0 0x1C.

第2类按键通码为两字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式.如Right Ctrl键,其通码为0xE0 0x14;断码为0xE0 0xF0 0x14.

第3类特殊按键有两个,Print Screen键,其通码为0xE0 0x12 0xE0 0x7C;断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12.Pause键,其通码为0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;断码为空.

组合按键扫描码的发送是按照按键发生的次序,如按下面顺序按左Shift十A键:①按下左Shift键;②按下A键;③释放A键;④释放左Shift键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12. 在文中的驱动程序设计中,就是根据按键的分类对其分别进行处理.

2.2 PS/2键盘的命令集

主机可通过向PS/2键盘发送命令对键盘进行设置或者获得键盘的状态等操作.每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发resend”和“回应echo”命令例外).驱动程序在键盘初始化过程中所用的指令:0xED,主机在该命令后跟随发送一个参数字节,用于指示键盘上Num Lock,Caps Lock,Scroll Lock Led的状态;0xF3,主机在这条命令后跟随发送一个字节参数定义键盘机打的速率和延时;0xF4,用于当主机发送0xF5禁止键盘后,重新使能键盘.

4.1 单片机与键盘间PS/2通信的程序设计

在PS/2通信过程中,主设备(文中是单片机)是在时钟信号为低时发送和接收数据信号.因为单片机向键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序. 单片机向PS/2键盘发送数据程序代码为:

void ps2_sentchar(unsigned char sentchar){//ps2主设备向从设备发送数据 unsigned char sentbit_cnt= 0x00; unsigned char sentchar_chk = 0x00; EX0=0; //关外部中断0 //发起一个传送,发起始位

PS2_SGN_CLOCK = 0; //将时钟线拉低并保持100 us delay100us();

PS2_SGN_DATA= 0; //起始位 PS2_SGN_CLOCK = 1; //发送DATA0-7

for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++){ while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变为低 PS2_SGN_DATA = sentchar& 0x01;//发送数据 if(PS2_SGN_DATA) sentchar_chk++; //计算校验 while(!PS2_SGN_CL0CK) _nop_(); //等待时钟线变高 sentchar>>=1; //待发送数据右移一位 }

//发送校验位

while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低

switch(sentchar_chk){ case 0: case 2: case 4:

case 6:PS2_SGN_DATA =1;break;//奇校验 case 1: case 3: case 5:

case 7:PS2_SGN_DATA = 0;break;//奇校验 default;break; )

while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高 while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低 PS2_SGN_DATA =1;//发送停止位,停止位总为1

while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高 while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低 //接收ACK

//if(PS2_SGN_DATA) error(); //ACK信号由键盘发出,总为低电平

while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高 EX0= 1; //开外部中断0 }

单片机由PS/2键盘接收数据程序:外部中断0设置为下降沿触发 void int0() interrupt 0 using 0 {// EX0=0; //关外部中断0 switch(ps2_revchar_cnt){ case 1: ……

case 8:mcu_revchar<<=1;

if(PS2_SGN_DATA) mcu_revchar |= 0x01; ps2_revchar_cnt++; break;

case 0:ps2_revchar_cnt++;break; //开始位,

case 9:ps2_revchar_cnt++;break; //校验位,可添加校验程序 case 10: _nop_();//停止位 ps2_revchar_cnt= 0;

revchar_flag=1;//置接收到数据标识位 break;

default:break; }

EX0=1;//开外部中断0 }

4.2 键盘扫描码转换程序设计

由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,控制键如F1,Ctrl等为自定义值),只能通过查表的方式获得.由于按键的3种类型及部分按键对应着两个键值(如A键的键值根据Caps和Shift键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:键盘扫描码转换基本集和切换集(kb_plain_map[NR_KEYS]与kb_shift_map[NR_KEYS]);包含E0前缀的键盘扫描码转换基本集和切换集(kbeO_plain_map[NR_KEYS]与kbe0_shiftmap[NR_KEYS]).PS/2 104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132.所有4个键盘表的定义均为如下形式:KB_MAP[MAKE CODE]=KEYVAL,如果扫描码对应的按键为空(如KB_MAP[0x00]),则定义相应键值为NULL_KEY(0x00).以下是键盘扫描码基本集的部分代码实例: kb_plain_map[NR_KEYS]={……

NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39; NULL_KEY; //扫描码0x40~0x47 //对应按键空,逗号,K,I,O,0,9,空

//对应键值0x00,',','k','i','o','O','9',0x00…… };

如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可,如ACPI

Power按键通码为0xE0 0x37,修改kbe0_plain_map[0x37]=KB_ACPI_PWR即可. 特殊按键Pause使用单独程序处理,如果接收到0xE1就转入这段程序.而Print Screen 键则将其看作是两个通码分别为0xE0 0x12和0xE0 0x7C

的“虚键”的组合键处理.在驱动程序中设定如下全局变量:led_status记录Scroll Lock Led,Num Lock Led和Caps Lock Led的状态(关为0,开为1);agcs_status记录左右Shift Ctrl Gui Alt状态,相应键按下则对应位为1,释放为0.E0_FLAG接到0xE0置1;E1_FLAG接收到0xE1置1;F0_FLAG接收到0xF0置1.按键键值通过KeyVal提供上层程序使用.PS/2键盘扫描码键值转换程序ps2_codetrans()流程框架如图5所示.

第1类按键的扫描码键值转换程序代码。 if(F0_FLAG){//接收扫描码为断码 switch(mcu_revchar){//处理控制键

case 0x11:ages_status&=0xF7;break;//左alt释放 case 0x12:ages_status&=0xFE;break;//左shift释放 case 0x14:agcs_status&=0xFD;break;//左ctrl释放

case 0x58;if(led_status&0x04) led_status &= 0x03; //caps lock else led_status |=0x04 ; ps2_ledchange(); break;

case 0x59: agcs_status &= 0xEF;break;//右shift释放

case 0x77: if(led_status&0x02)led_status&=0x05;//num lock else led_status |=0x02; ps2_ledchange(); break;

case 0x7E:if(led_status&0x01) led_status&=0x06;//scroll lock else led_status |=0x01; ps2_ledchange(); break;

default;break; }

F0_FLAG=0; }

else{//接收扫描码为通码

if(led_status&0x04) caps_flag=1;else caps_flag = 0; if(led_status&0x02) num_flag =1; else num_flag =0; if(agcs_status&0x11) shift_flag = 1;else shift_flag=0; //扫描码键值转

换 if((caps_flag == shift_flag) || (!num_flag)) KeyVal=kb_plain_map[mcu_revchar]; else KeyVal = kb_shift_map[mcu_revchar]; switch(mcu_revchar)(//处理控制键或状态键 case 0x11:agcs_status|= 0x08;//左alt按下 Case 0x12:agcs_status|= 0x01;//左shift按下 case 0x14:agcs_status|= 0x02;//左ctrl按

下 case 0x59:agcs_status|= 0x10;//右shift按下 default:break;

} }

第2类按键的扫描码键值转换程序与上面相似.注意:在退出该程序段时,对E0_FLAG和F0_FLAG标识清0.Pause键的处理程序,如果接收到0xE1,置E1_FLAG=1,然后顺次将后续接收到的7个字节数据和Pause的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE;在比较完所有7个字节后清除E1_FLAG标识.键盘初始化程序kb_init()流程为:

①上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC.单片机接

收为0xAA则进入下一步,否则进行出错处理.

②关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送0x00接收0xFA.

③设置机打延时和速率:单片机发送0xF3,接收0xFA,发送0x00(250 ms,2.0 cps),接收0xFA.

④检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA.发送0xED,接收0xFA,发送0x00(关LED),接收0xFA.

⑤允许键盘,发送0xF4,接收0xFA.键盘LED改变ps2_ledchange()函数流程:发送0xED;接收0xFA;发送led_status;接收0xFA.

1,PS2的基本常识主要包括:

1.1 PS2通信由CLK和DATA两个线构成

1.2 PS2的CLK不论PC->KeyBoard,还是PC<-KeyBoard,都是由KeyBoard提供1.3 数据帧构成:起始位(1bit) + 数据位(8bit) + 奇校验位(1bit) + 停止位(1bit) + 应答位(1bit, 只在PC->KeyBoard中,KeyBoard产生) 1.4 CLK平时状态为高电平,低电平表示抑制通讯,说明PC现在处理不过来,需要KeyBoard将发送的数据暂时缓存1.5 数据在CLK下降沿被采样

1.6 数据发送的时序如下:(a) 键盘发送时序;(b) 键盘接收时序

2, PC->KeyBoard中,KeyBoard怎么知道PC有数据要发给自己?

正常情况下,CLK和DATA两根线都是高电平。PC下拉CLK超过100us,再下拉DATA,然后释放CLK;即让KeyBoasd在CLK上升沿采样到DATA为低。KeyBoard 识别这个特征后,意识到PC有东西要传,然后主动提供时钟。

3, PC<-KeyBoard中,PC怎么知道KeyBoard有数据要发给自己?

PC等待CLK拉低,在下降沿时采样DATA为低时,认为KeyBoard有数据传送。 4,PC没有作好接收的准备,怎么办?

PC如果暂时不能接收新的数据,就主动把CLK拉低了。KeyBoard看到CLK为低,会将数据暂存在buffer里的。

4,KeyBoard没有作好接收的准备,怎么办?

KeyBoard在CLK上升沿采样到DATA为高时,意识到PC有数据要发送,如果不能接收,就不提供时钟;即上升沿后的CLK为高电平,这时KeyBoard不要将CLK 下拉,让PC的起始bit发不出来,使PC处理等待发送状态至直KeyBoard准备好可以接收,才提供时钟。

键盘键与虚拟键码对照表

键盘键与虚拟键码对照表 字母和数字键数字小键盘的键功能键其它键 键键码键键码键键码键键码 A 65 0 96 F1 112 Backspace 8 B 66 1 97 F2 113 Tab 9 C 67 2 98 F3 114 Clear 12 D 68 3 99 F4 115 Enter 13 E 69 4 100 F5 116 Shift 16 F 70 5 101 F6 117 Control 17 G 71 6 102 F7 118 Alt 18 H 72 7 103 F8 119 Caps Lock 20 I 73 8 104 F9 120 Esc 27 J 74 9 105 F10 121 Spacebar 32 K 75 * 106 F11 122 Page Up 33 L 76 + 107 F12 123 Page Down 34 M 77 Enter 108 -- -- End 35

N 78 - 109 -- -- Home 36 O 79 . 110 -- -- Left Arrow 37 P 80 / 111 -- -- Up Arrow 38 Q 81 -- -- -- -- Right Arrow 39 R 82 -- -- -- -- Down Arrow 40 S 83 -- -- -- -- Insert 45 T 84 -- -- -- -- Delete 46 U 85 -- -- -- -- Help 47 V 86 -- -- -- -- Num Lock 144 W 87 X 88 Y 89 Z 90 0 48 1 49 2 50

按键精灵键盘对应代码

按键精灵后台键盘对应代码104键键盘按键码对照 ★主键盘区 A → 65 B → 66 C → 67 D → 68 E → 69 F → 70 G → 71 H → 72 I → 73 J → 74 K → 75 L → 76 M → 77 N → 78 O → 79 P → 80 Q → 81 R → 82 S → 83

T → 84 U → 85 V → 86 W → 87 X → 88 Y → 89 Z → 90 0 ) → 48 1 ! → 49 2 @ → 50 3 # → 51 4 $ → 52 5 % → 53 6 ^ → 54 7 & → 55 8 * → 56 9 ( → 57 Esc → 27 ` ~ → 192 _-→ 189 = + → 187 \ | → 220

← Back Space → 8 Tab → 9 Caps Lock → 20 Shift → 16 Left Shift → 160 Right Shift → 161 Ctrl → 17 Left Crtl → 162 Right Ctrl → 163 Win → 91 Alt → 18 Letf Alt → 164 Right Alt → 165 空格键Space → 32 Right Mouse → 93 Enter → 13 Macro → 226 [ { → 219 ] } → 221 ; : → 186 ‘ “ → 222 , < → 188

. > → 190 / ? → 191 ★数字键盘区数字键盘0 → 96 数字键盘1 → 97 数字键盘2 → 98 数字键盘3 → 99 数字键盘4 → 100 数字键盘5 → 101 数字键盘6 → 102 数字键盘7 → 103 数字键盘8 → 104 数字键盘9 → 105 Num Lock → 144 / → 111 * → 106 - → 109 + → 107 Enter → 13 . → 110 ★功能键区F1 → 112 F2 → 113 F3 → 114 F4 → 115 F5 → 116 F6 → 117 F7 → 118 F8 → 119 F9 → 120 F10 → 121 F11 → 122 F12 → 123 ★编辑键区Print Screen→ 44 Scroll Lock → 145 Pause Break → 19 Insert → 45 Delete → 46 Home → 36 End → 35 Page Up → 33 Page Down → 34 左箭头→ 37 上箭头→ 38 右箭头→ 39 下箭头→ 40

ps2键盘转USB接线图

ps/2键盘接线图- - 废话就不多说了,这是普通的PS/2的键盘接线图,图中是接口(PS/2插头)截面图。上面标的字母一般在键盘里的电路板上有印的,对照着焊就行了。如果没有标注字母,这个我就没办法了哈哈~ 多数键盘应该是按照DCGV的顺序排线的,没有写明的可优先考虑这个。

键盘接线黄、红、白、绿对应的针脚如下黄3 红4 白6 绿2 USB的针脚定义如下图:

(注:图示仅供参考,可能有错) USB对应的线与针脚间的连接如下: 红4 白3 绿2 黑1 这样弄清楚了各个针脚的意义,我们就可以进行改造了。根据针脚定义我们对应的做出以下表格:

首先取下旧鼠标上面的USB连线,直接从与鼠标电路板相连的地方剪断就行了;然后拨开线头,接下来取下键盘上的PS/2连线,并记住不同颜色的线的焊接点,同样可以从焊点处剪断;找来电烙铁,根据上表将USB线头依次焊接到键盘的焊点上,使用电烙铁需要注意,不要损伤电路板和芯片,注意避免和键盘后边的透明塑料线板接触。如果没有电烙铁,可以拨开线头直接连接,然后用绝缘胶布封好。这样做也相对简单,但是不美观。好了,现在试试看,你有USB键盘了吧?好用吧?别忘了在BIOS里边将USB keyboard support设置为Enable【Enable 允 许(或可用)Disable 禁用(或不可用)一般在主板的BIOS设置里面经常看到此选项, 比如主板BIOS里面的usb config 里面对应的选项,如果选择Disable,则USB接口被禁 用;如果改成Enable选项,则电脑的USB接口可用。】啊。否则用不了别怪我! 有了键盘改造的经验,顺便说一下鼠标的改造。让我们可以彻底抛弃PS/2接口。找来一个双飞雁2D鼠标,打开鼠标。同样有4根线颜色分别为蓝、白、绿、橙,用万能表测试了一下,发现针脚定义与键盘完全相同,可以参照键盘。 对应的电线和针脚连接为: 蓝3 白6 绿2 橙4 当然USB接线和针脚也和刚才的一样了。修改的时候也和修改键盘一样就行了。不过需要注意的是鼠标的连线和电路板不是焊点,而是插槽,这样修改起来或许更方便。具体的接线对应下表:

ASCII码表和键盘键码表及Java键码表

表一:ASCII 码表(完整版) ASCII值字符ASCII值字符ASCII值字符ASCII值字符0NUT32(space)64@96、1SOH33!65A97a 2STX34”66B98b 3ETX35#67C99c 4EOT36$68D100d 5ENQ37%69E101e 6ACK38&70F102f 7BEL39,71G103g 8BS40(72H104h 9HT41)73I105i 10LF42*74J106j 11VT43+75K107k 12FF44,76L108l 13CR45-77M109m 14SO46.78N110n 15SI47/79O111o 16DLE48080P112p 17DCI49181Q113q 18DC250282R114r 19DC351383X115s 20DC452484T116t 21NAK53585U117u 22SYN54686V118v 23TB55787W119w 24CAN56888X120x 25EM57989Y121y 26SUB58:90Z122z 27ESC59;91[123{ 28FS60<92/124| 29GS61=93]125} 30RS62>94^126~ 31US63? 95—127DEL 注:特殊控制字符所代表含义 NUL 空VT 垂直制表SYN 空转同步HT 横向列表SOH 标题开始FF 走纸控制ETB 信息组传送结束LF 换行 STX 正文开始CR 回车CAN 作废GS 组分隔符ETX 正文结束SO 移位输出EM 纸尽NAK 否定EOY 传输结束SI 移位输入SUB 换置US 单元分隔符ENQ 询问字符DLE 空格ESC 换码DEL 删除 ACK 承认BS 退一格FS 文字分隔符RS 记录分隔符DC1设备控制1DC2 设备控制2DC3 设备控制3DC4 设备控制4 BEL 报警

非编码键盘的扫描程序设计

摘要 ------------------------------------------------------------------------------------------------------- 1 1设计方案 ------------------------------------------------------------------------------------------------ 2 1.1设计任务 ---------------------------------------------------------------------------------------- 2 1.2设计方案 ---------------------------------------------------------------------------------------- 2 2系统硬件设计------------------------------------------------------------------------------------------ 3 2.1最小应用系统 ------------------------------------------------------------------------------------ 3 2.28155扩展电路---------------------------------------------------------------------------------- 4 2.3矩阵键盘接口电路 ---------------------------------------------------------------------------- 6 2.4LCD1602接口电路----------------------------------------------------------------------------- 6 2.5主电路设计 --------------------------------------------------------------------------------------- 8 3系统软件设计------------------------------------------------------------------------------------------ 8 3.1主程序设计 --------------------------------------------------------------------------------------- 9 3.2延时程序设计----------------------------------------------------------------------------------- 9 3.3键盘扫描子程序设计 ------------------------------------------------------------------------ 10 3.4显示子程序设计------------------------------------------------------------------------------- 11 4 系统调试与结果 ---------------------------------------------------------------------------------- 13 4.1调试内容与问题解决----------------------------------------------------------------------- 13 4.2运行结果与分析 ----------------------------------------------------------------------------- 13 小结 ------------------------------------------------------------------------------------------------------- 15 参考文献 ------------------------------------------------------------------------------------------------ 16 附录 ------------------------------------------------------------------------------------------------------- 17

基于51单片机的PS2键盘的单片机编程

PS2键盘的单片机编程 在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择. 文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该设计实现了在单 片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在 Keil uVision2上编译通过,在单片机AT89C51上测试通过. 1 PS/2协议 目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示. PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟 与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生. 1.1 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2 所示. 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设 备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟 下降沿读人数据线状态.

键盘各键对应的ASCII码值

键盘各键对应的ASCII码值(包括鼠标和键盘所有的键) ESC键VK_ESCAPE (27) 回车键:VK_RETURN (13) TAB键:VK_TAB (9) Caps Lock键:VK_CAPITAL (20) Shift键:VK_SHIFT ($10) Ctrl键:VK_CONTROL (17) Alt键:VK_MENU (18) 空格键:VK_SPACE ($20/32) 退格键:VK_BACK (8) 左徽标键:VK_LWIN (91) 右徽标键:VK_LWIN (92) 鼠标右键快捷键:VK_APPS (93) ------------------------------------------ Insert键:VK_INSERT (45) Home键:VK_HOME (36) Page Up:VK_PRIOR (33) PageDown:VK_NEXT (34) End键:VK_END (35) Delete键:VK_DELETE (46) 方向键(←):VK_LEFT (37) 方向键(↑):VK_UP (38) 方向键(→):VK_RIGHT (39) 方向键(↓):VK_DOWN (40) ------------------------------------------ F1键:VK_F1 (112) F2键:VK_F2 (113) F3键:VK_F3 (114) F4键:VK_F4 (115) F5键:VK_F5 (116) F6键:VK_F6 (117) F7键:VK_F7 (118) F8键:VK_F8 (119) F9键:VK_F9 (120) F10键:VK_F10 (121) F11键:VK_F11 (122) F12键:VK_F12 (123) ------------------------------------------ Num Lock键:VK_NUMLOCK (144) 小键盘0:VK_NUMPAD0 (96) 小键盘1:VK_NUMPAD0 (97) 小键盘2:VK_NUMPAD0 (98) 小键盘3:VK_NUMPAD0 (99)

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

键盘按键编码

键盘按键编码 字母和数字键的键码值(keyCode) 按键键码按键键码按键键码按键键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 51 D 68 M 77 V 86 4 52 E 69 N 78 W 87 5 53 F 70 O 79 X 88 6 54 G 71 P 80 Y 89 7 55 H 72 Q 81 Z 90 8 56 I 73 R 82 0 48 9 57 数字键盘上的键的键码值(keyCode) 功能键键码值(keyCode) 按键键码按键键码按键键码按键键码 0 96 8 104 F1 112 F7 118 1 97 9 105 F 2 11 3 F8 119 2 98 * 106 F 3 11 4 F9 120 3 99 + 107 F 4 11 5 F10 121 4 100 - 109 F 5 11 6 F11 122 5 101 . 110 F 6 11 7 F12 123

6 102 / 111 Enter 108 7 103 控制键键码值(keyCode) 按键键码按键键码按键键码按键键码BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Down Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16

End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \| 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 '" 222

键盘扫描码

键盘上的每一个键都有两个唯一的数值进行标志。为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道是它是被按下还是被释放了。这些数值在系统中被称为键盘扫描码 2扫描码大全 扫描码键 0x011b ESC 0x3b00 F1 0x3c00 F2 0x3d00 F3 0x3e00 F4 0x3f00 F5 0x4000 F6 0x4100 F7 0x4200 F8 0x4300 F9 0x4400 F10 主键盘区: 0x2960 ~ 0x0231 1 0x0332 2 0x0433 3 0x0534 4 0x0635 5 0x0736 6 0x0837 7 0x0938 8 0x0a39 9 0x0b30 0 0x0c2d - 0x0d3d = 0x2b5c \ 0x0e08 退格键 0x0f09 Tab 0x1071 q 0x1177 w 0x1265 e 0x1372 r 0x1474 t 0x1579 y

0x1769 i 0x186f o 0x1970 p 0x1a5b [ 0x1b5d ] 0x1e61 a 0x1f73 s 0x2064 d 0x2166 f 0x2267 g 0x2368 h 0x246a j 0x256b k 0x266c l 0x273b ; 0x2827 ' 0x1c0d 回车 0x2c7a z 0x2d78 x 0x2e63 c 0x2f76 v 0x3062 b 0x316e n 0x326d m 0x332c , 0x342e . 0x352f / 0x3920 空格键 0xe05b 左Win 0xe05c 右Win 0xe05d Menu 右边数字键盘: 0x5200 Insert 0x4700 Home 0x4900 Page UP 0x5300 Delete 0x4f00 End 0x5100 PageDown 0x4800 上箭头 0x4b00 左箭头 0x5000 下箭头 0x4d00 右箭头 0x352f /

键盘按键的各种编码对照表(全)

键盘按键的各种编码对照表 本附录中的各表列举了键盘按键扫描码和其ASCII码之间的对照关系,表中数据都是十六进制形式。 在用中断16H的0号功能时,当按下任意一个键或组合键时,寄存器AH和AL分别保存着该按键的扫描码和ASCII码。 表1、ASCII码的编码方案 高位 000001010011100101110111低位 0000NUL DEL SP0@P`p 0001SOH DC1!1A Q a q 0010STX DC2“2B R b r 0011ETX DC3#3C S c s 0100EOT DC4$4D T d t 0101ENQ NAK%5E U e u 0110ACK SYN&6F V f v 0111BEL ETB‘7G W g w 1000BS CAN(8H X h x 1001HT EM)9I Y i y 1010LF SUB*:J Z j z 1011VT ESC+;K[k{ 1100FF FSN^n~ 1111SI US/?O_o Del 表2、字母和空格按键的编码表 单 键SHIFT CTRL ALT 按 键 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 a and A1E611E411E011E00 b and B3062304230023000 c an d C2E632E432E032E00 d and D2064204420042000 e and E1265124512051200 f and F2166214621062100 g and G2267224722072200 h and H2368234823082300 i and I1769174917091700

键盘扫描原理及应用键盘

本资源为网上搜集而来,如果该程序涉及或侵害到您的版权请立即写信通知我

键盘扫描 键盘是由按键构成,是单片机系统里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人-机通信。 1.按键及键抖动 按键是一种常开型按钮开关。平时,按键的两个触点处于断开状态,按下按键时两个触点才闭合(短路)。如图1-1所示,平常状态下,当按键K未被按下时,按键断开,PA0输入口的电平为高电平;当按键K被按下时,按键闭合,PA0输入口的电平为低电平。 图1-1 按键电路 图1-2 按键抖动 一般的按键所用开关都是机械弹性开关,由于机械触点的弹性作用,按键开

关在闭合时不会马上稳定地连接,在断开进也不会马上完全的断开,在闭合和断开的瞬间均有一连串的抖动。按键按下的电压信号波形图如图1-2所示,从图中可以看出按键按下和松开的时候都存在着抖动。抖动时间的长短因按键的机械特性不同而有所不同,一般为5ms~10ms。 如果不处理键抖动,则有可能引起一次按键被误读成多次,所以为了确保能够正确地读到按键,必须去除键抖动,确保在按键的稳定闭合和稳定断开的时候来判断按键状态,判断后再做处理。按键在去抖动,可用硬件或软件两种方法消除。由于使用硬件方法消除键抖动,一般会给系统的成本带来提高,所以通常情况下都是使用软件方法去除键抖动。 常用的去除键抖动的软件方法有很多种,但是都离不开基本的原则:就是要么避开抖动的时候检测按键或是在抖动的时候检测到的按键不做处理。这里说明一下常用的两种方法: 第一种方法是检测到按键闭合电平后先执行一个延时程序,做一个12ms~24ms的延时,让前抖动消失后再一次检测按键的状态,如果仍是闭合状态的电平,则认为真的有按键按下;若不是闭合状态电平,则认为没有键按下。若是要判断按键松开的话,也是要在检测到按键释放电平之后再给出12ms~24ms的延时,等后抖动消失后再一次检测按键的状态,如果仍为断开状态电平,则确认按键松开。这种方法的优点是程序比较简单,缺点是由于延时一般采用跑空指令延时,造成程序执行效率低。 第二种方法是每隔一个时间周期检测一次按键,比如每5ms扫描一次按键,要连续几次都扫描到同一按键才确认这个按键被按下。一般确认按键的扫描次数由实际情况决定,扫描次数的累积时间一般为50ms~60ms。比如,以5ms为基本时间单位去扫描按键的话,前后要连续扫描到同一个按键11次而达到50ms 来确认这个按键。按键松开的检测方法也是一样要连续多次检测到按键状态为断开电平才能确认按键松开。这种方法的优点是程序执行效率高,不用刻意加延时指令,而且这种方法的判断按键抗干扰能力要更好;缺点是程序结构较复杂。 在以下的介绍中,我们将使用第二种方法来去除键抖动。 2.键盘结构及工作原理 键盘一般有独立式和行列式(矩阵式)两种。当然还有其它的结构,比如交互式结构等等,不过其它的结构比较少用,在这里就不介绍了。在中颖的单片机中,有些单片机的LCD驱动引脚的SEGMENT口可以共享按键扫描口,当选择为按键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD和按键矩阵,采用分时扫描进行处理,下面也将介绍这个特殊应用的方法和注意的地方。 独立式键盘结构

矩阵键盘扫描汇编程序

4*4矩阵键盘扫描汇编程序(基于51单片机) // 程序名称:4-4keyscan.asm ;// 程序用途:4*4矩阵键盘扫描检测 ;// 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下, ;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键;// 程序入口:void ;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;//================================================================== ==== PROC KEYCHK KEYNAME DATA 40H ;按键名称存储单元 ;(b7-b5纪录按键状态,b4位为有效位, ;b3-b0纪录按键) KEYRTIME DATA 43H ;重复按键时间间隔 SIGNAL DATA 50H ;提示信号时间存储单元 KEY EQU P3 ;键盘接口(必须完整I/O口) KEYPL EQU P0.6 ;指示灯接口 RTIME EQU 30 ;重复按键输入等待时间 KEYCHK: ;//=============按键检测程序========================================= ==== MOV KEY,#0FH ;送扫描信号 MOV A,KEY ;读按键状态 CJNE A,#0FH,NEXT1 ;ACC<=0FH ; CLR C ;Acc等于0FH,则CY为0,无须置0 NEXT1: ; SETB C ;Acc不等于0FH,则ACC必小于0 FH, ;CY为1,无须置1 MOV A,KEYNAME ANL KEYNAME,#1FH ;按键名称屏蔽高三位 RRC A ;ACC带CY右移一位,纪录当前按键状态 ANL A,#0E0H ;屏蔽低五位

ASCII码表和键盘码详解

ASCII码表和键盘码 星期四,2015年8月13日 下午 03:43 ASCII非打印控制字符表 ASCII 表上的数字 0–31 分配给了控制字符,用于控制像打印机等一些外围设备。例如,数字12 代表换页/新页功能。此命令指示打印机跳到下一页的开头。 缩写/字符解释(二进)Bin(十进)Dec(十六 进)Hex 0000 0000 0 0 NUL (null) 空字符0000 0001 1 1 SOH (start of handing) 标题开始0000 0010 2 2 STX (start of text) 正文开始0000 0011 3 3 ETX (end of text) 正文结束0000 0100 4 4 EOT (end of transmission) 传输结束0000 0101 5 5 ENQ (enquiry) 请求0000 0110 6 6 ACK (acknowledge) 收到通知0000 0111 7 7 BEL (bell) 响铃0000 1000 8 8 BS (backspace) 退格0000 1001 9 9 HT (horizontal tab) 水平制表符0000 1010 10 0A LF (NL line feed, new line) 换行键0000 1011 11 0B VT (vertical tab) 垂直制表符 换页键0000 1100 12 0C FF (NP form feed, new page) 0000 1101 13 0D CR (carriage return) 回车键0000 1110 14 0E SO (shift out) 不用切换0000 1111 15 0F SI (shift in) 启用切换0001 0000 16 10 DLE (data link escape) 数据链路转 义

数码管显示和键盘扫描实验资料

实验三LED数码管动态显示及4 X4 键盘控制实验 一、实验目的 1.巩固多位数码管动态显示方法。 2.掌握行扫描法矩阵式按键的处理方法。 3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。二、实验内容 使用AT89S52学习板上的4位LED数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。 三、实验系统组成及工作原理 1.4位LED数码管和4 X 4矩阵键盘阵列电路原理图

2.多位数码管动态显示方式 a b c d e f g dp com a b c d e f g dp com a b c d e f g dp com a b c d e f g dp com D0 IO(2) IO(1) 说明4位共阴极LED动态显示3456数字的工作过程 首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上, 接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,

也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后, 再由I/O口(1)送出数字4的段选码66H即01100110到段选线上,接着由I/O 口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮; 如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。 3.4 X 4 矩阵式按键扫描处理程序 行扫描法又称逐行零扫描查询法,即逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读入列数据,检查此(低电平)行中是否有键按下。如果读得某列线为低电平,则表示此(低电平)行线与此列线的交叉处有键按下,再对该键进行译码计算出键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则说明此(低电平)行没有键按下。接着进行下一行的“0”行扫描与列读入,直到8行全部查完为止,若无键按下则返回。 有时为了快速判断键盘中是否有键按下,也可先将全部行线同时置为低电平,然后检测列线的电平状态,若所有列线均为高电平,则说明键盘中无键按下,立即返回;若要有一列的电平为低,则表示键盘中有键被控下,然后再如上那样进行逐行扫描。 四、实验设备和仪器 PC机一台 AT89S52单片机学习板、下载线一套 五、实验步骤 1.按时实验要求编写源程序(实验前写)进行软件模拟调试。 2.软件调试好,连接硬件电路。

键盘码表:单键扫描码,ascii,组合键码

字母和空格按键的编码表 按键单键SHIFT CTRL ALT 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 a 1E 61 1E 41 1E 01 1E 00 b 30 62 30 42 30 02 30 00 c 2E 63 2E 43 2E 03 2E 00 d 20 64 20 44 20 04 20 00 e 12 65 12 45 12 05 12 00 f 21 66 21 46 21 06 21 00 g 22 67 22 47 22 07 22 00 h 23 68 23 48 23 08 23 00 i 17 69 17 49 17 09 17 00 j 24 6A 24 4A 24 0A 24 00 k 25 6B 25 4B 25 0B 25 00 l 26 6C 26 4C 26 0C 26 00 m 32 6D 32 4D 32 0D 32 00 n 31 6E 31 4E 31 0E 31 00 o 18 6F 18 4F 18 0F 18 00 p 19 70 19 50 19 10 19 00 q 10 71 10 51 10 11 10 00 r 13 72 13 52 13 12 13 00 s 1F 73 1F 53 1F 13 1F 00 t 14 74 14 54 14 14 14 00 u 16 75 16 55 16 15 16 00 v 2F 76 2F 56 2F 16 2F 00 w 11 77 11 57 11 17 11 00 x 2D 78 2D 58 2D 18 2D 00 y 15 79 15 59 15 19 15 00 z 2C 7A 2C 5A 2C 1A 2C 00 SpaceBar 39 20 39 20 39 20 39 20 功能键和数字键盘的编码表·内容正文 按键单键SHIFT CTRL ALT 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 F1 3B 00 54 00 5E 00 68 00 F2 3C 00 55 00 5F 00 69 00 F3 3D 00 56 00 60 00 6A 00 F4 3E 00 57 00 61 00 6B 00 F5 3F 00 58 00 62 00 6C 00 F6 40 00 59 00 63 00 6D 00 F7 41 00 5A 00 64 00 6E 00 F8 42 00 5B 00 65 00 6F 00 F9 43 00 5C 00 66 00 70 00 F10 44 00 5D 00 67 00 71 00 F11 85 00 87 00 89 00 8B 00 F12 86 00 88 00 8A 00 8C 00 键盘码表:单键扫描码,ascii,组合键码

PS2键盘和USB键盘编码表

PS2键盘编码

USB键盘编码 这是从USB HID应用手册里面截选出来的一段。 实际上常用的也就前面的几项,比如 83 53 Keypad Num Lock and Clear11 90 √√√ 101/104 83是键值的10进制编码,53是键值的16进制编码,然后 Keypad Num Lock and Clear的意思是小键盘(数字键盘)锁按键 再比如20 14 Keyboard q and Q4 17 √√√ 4/101/104 20也是键q的十进值编码,14是十六进制编码,后面注释是字母q或Q的编码。 0 00 Reserved (no event indicated)9 N/A √√√4/101/104 1 01 Keyboard ErrorRollOver9 N/A √√√4/101/104 2 02 Keyboard POSTFail9 N/A √√√4/101/104 3 03 Keyboard ErrorUndefined9 N/A √√√4/101/104 4 04 Keyboard a and A4 31 √√√4/101/104 5 05 Keyboard b and B 50 √√√4/101/104 6 06 Keyboard c and C4 48 √√√4/101/104 7 07 Keyboard d and D 33 √√√4/101/104 8 08 Keyboard e and E 19 √√√4/101/104 9 09 Keyboard f and F 34 √√√4/101/104 10 0A Keyboard g and G 35 √√√4/101/104 11 0B Keyboard h and H 36 √√√4/101/104 12 0C Keyboard i and I 24 √√√4/101/104

键盘鼠标扫描码

[VB]键盘鼠标扫描码 1.??常数值描述 2.vbKeyLButton &H1 鼠标左键 3.vbKeyRButton &H2 鼠标右键 4.vbKeyCancel &H3 CANCEL 键 5.vbKeyMButton &H4 鼠标中键 6.vbKeyBack &H8 BACKSPACE键 7.vbKeyTab &H9 TAB 键 8.vbKeyClear &HC CLEAR 键 9.vbKeyReturn &HD ENTER 键 10.vbKeyShift &H10 SHIFT 键 11.vbKeyControl &H11 CTRL 键 12.vbKeyMenu &H12 MENU 键 13.vbKeyPause &H13 PAUSE 键 14.vbKeyCapital &H14 CAPS LOCK键 15.vbKeyEscape &H1B ESC 键 16.vbKeySpace &H20 SPACEBAR键 17.vbKeyPageUp &H21 PAGE UP 键 18.vbKeyPageDown &H22 PAGE DOWN键 19.vbKeyEnd &H23 END 键 20.vbKeyHome &H24 HOME 键 21.vbKeyLeft &H25 LEFT 键 22.vbKeyUp &H26 UP 键 23.vbKeyRight &H27 RIGHT 键 24.vbKeyDown &H28 DOWN 键 25.vbKeySelect &H29 SELECT 键 26.vbKeyPrint &H2A PRINT SCREEN键 27.vbKeyExecute &H2B EXECUTE 键 28.vbKeySnapshot &H2C SNAPSHOT键 29.vbKeyInsert &H2D INSERT 键 30.vbKeyDelete &H2E DELETE 键 31.vbKeyHelp &H2F HELP 键 32.vbKeyNumlock &H90 NUM LOCK键 33. 34.A至Z键与A杴Z字母的ASCII码相同: 35.常数值描述 36.vbKeyA 65 A 键 37.vbKeyB 66 B 键 38.vbKeyC 67 C 键 39.vbKeyD 68 D 键 40.vbKeyE 69 E 键 41.vbKeyF 70 F 键 42.vbKeyG 71 G 键 43.vbKeyH 72 H 键

键盘的ASCII码对应VC的虚拟键码

ESC键VK_ESCAPE (27) 回车键:VK_RETURN (13) TAB键:VK_TAB (9) Caps Lock键:VK_CAPITAL (20) Shift键:VK_SHIFT ($10) Ctrl键:VK_CONTROL (17) Alt键:VK_MENU (18) 空格键:VK_SPACE ($20/32) 退格键:VK_BACK (8) 左徽标键:VK_LWIN (91) 右徽标键:VK_LWIN (92) 鼠标右键快捷键:VK_APPS (93) Insert键:VK_INSERT (45) Home键:VK_HOME (36) Page Up:VK_PRIOR (33) PageDown:VK_NEXT (34) End键:VK_END (35) Delete键:VK_DELETE (46) 方向键(←):VK_LEFT (37) 方向键(↑):VK_UP (38) 方向键(→):VK_RIGHT (39) 方向键(↓):VK_DOWN (40) VK_A 41 65 A键 VK_B 42 66 B键 VK_C 43 67 C键 VK_D 44 68 D键 VK_E 45 69 E键 VK_F 46 70 F键 VK_G 47 71 G键 VK_H 48 72 H键 VK_I 49 73 I键 VK_J 4A 74 J键

VK_K 4B 75 K键 VK_L 4C 76 L键 VK_M 4D 77 M键 VK_N 4E 78 N键 VK_O 4F 79 O键 VK_P 50 80 P键 VK_Q 51 81 Q键 VK_R 52 82 R键 VK_S 53 83 S键 VK_T 54 84 T键 VK_U 55 85 U键 VK_V 56 86 V键 VK_W 57 87 W键 VK_X 58 88 X键 VK_Y 59 89 Y键 VK_Z 5A 90 Z键 F1键:VK_F1 (112) F2键:VK_F2 (113) F3键:VK_F3 (114) F4键:VK_F4 (115) F5键:VK_F5 (116) F6键:VK_F6 (117) F7键:VK_F7 (118) F8键:VK_F8 (119) F9键:VK_F9 (120) F10键:VK_F10 (121) F11键:VK_F11 (122) F12键:VK_F12 (123) Num Lock键:VK_NUMLOCK (144) 小键盘0:VK_NUMPAD0 (96) 小键盘1:VK_NUMPAD0 (97) 小键盘2:VK_NUMPAD0 (98) 小键盘3:VK_NUMPAD0 (99) 小键盘4:VK_NUMPAD0 (100)

相关文档
最新文档