usb2-键盘里的hid

键盘设备和主机的hid规范
  1.       /*键盘发送给PC的数据每次8个字节 
  2.       data0 data1 data2 data3 data4 data5 data6 data7  
  3.       定义分别是: 
  4.       data0 -- 
  5.       |--bit0: Left Control是否按下,按下为1 
  6.       |--bit1: Left Shift 是否按下,按下为1 
  7.       |--bit2: Left Alt 是否按下,按下为1 
  8.       |--bit3: Left GUI 是否按下,按下为1 
  9.       |--bit4: Right Control是否按下,按下为1 
  10.       |--bit5: Right Shift 是否按下,按下为1 
  11.       |--bit6: Right Alt 是否按下,按下为1 
  12.       |--bit7: Right GUI 是否按下,按下为1 
  13.       data1 -- 保留 
  14.       data2--data7 -- 普通按键 
  15. refer to hid spec 8.3*/  
看一下hid规范的键盘码-refer to hid usage table section 10
  1. Table 12: Keyboard/Keypad Page        
  2. Usage ID (Dec) Usage ID (Hex)     Usage Name Ref: Typical AT-101 Position PC-AT Mac UNI X Boot        
  3. 0     00     Reserved (no event indicated)9     N/A     √     √     √ 4/101/104        
  4. 1     01     Keyboard ErrorRollOver9     N/A     √     √     √ 4/101/104        
  5. 2     02     Keyboard POSTFail9     N/A     √     √     √ 4/101/104        
  6. 3     03     Keyboard ErrorUndefined9     N/A     √     √     √ 4/101/104        
  7. 4     04     Keyboard a and A4     31     √     √     √ 4/101/104        
  8. 5     05     Keyboard b and B     50     √     √     √ 4/101/104        
  9. 6     06     Keyboard c and C4     48     √     √     √ 4/101/104        
  10. 7     07     Keyboard d and D     33     √     √     √ 4/101/104        
  11. 8     08     Keyboard e and E     19     √     √     √ 4/101/104        
  12. 9     09     Keyboard f and F     34     √     √     √ 4/101/104        
  13. 10     0A     Keyboard g and G     35     √     √     √ 4/101/104        
  14. 11     0B     Keyboard h and H     36     √     √     √ 4/101/104        
  15. 12     0C     Keyboard i and I     24     √     √     √ 4/101/104        
  16. 13     0D     Keyboard j and J     37     √     √     √ 4/101/104        
  17. 14     0E     Keyboard k and K     38     √     √     √ 4/101/104        
  18. 15     0F     Keyboard l and L     39     √     √     √ 4/101/104        
  19. 16     10     Keyboard m and M4     52     √     √     √ 4/101/104        
  20. 17     11     Keyboard n and N     51     √     √     √ 4/101/104        
  21. 18     12     Keyboard o and O4     25     √     √     √ 4/101/104        
  22. 19     13     Keyboard p and P4     26     √     √     √ 4/101/104        
  23. 20     14     Keyboard q and Q4     17     √     √     √ 4/101/104        
  24.   
  25. 21     15     Keyboard r and R     20     √     √     √ 4/101/104        
  26. 22     16     Keyboard s and S4     32     √     √     √ 4/101/104        
  27. 23     17     Keyboard t and T     21     √     √     √ 4/101/104        
  28. 24     18     Keyboard u and U     23     √     √     √ 4/101/104        
  29. 25     19     Keyboard v and V     49     √     √     √ 4/101/104        
  30. 26     1A     Keyboard w and W4     18     √     √     √ 4/101/104        
  31. 27     1B     Keyboard x and X4     47     √     √     √ 4/101/104        
  32. 28     1C     Keyboard y and Y4     22     √     √     √ 4/101/104        
  33. 29     1D     Keyboard z and Z4     46     √     √     √ 4/101/104        
  34. 30     1E     Keyboard 1 and !4     2     √     √     √ 4/101/104        
  35. 31     1F     Keyboard 2 and @4     3     √     √     √ 4/101/104        
  36. 32     20     Keyboard 3 and #4     4     √     √     √ 4/101/104        
  37. 33     21     Keyboard 4 and $4     5     √     √     √ 4/101/104        
  38. 34     22     Keyboard 5 and %4     6     √     √     √ 4/101/104        
  39. 35     23     Keyboard 6 and ^4     7     √     √     √ 4/101/104        
  40. 36     24     Keyboard 7 and &4     8     √     √     √ 4/101/104        
  41. 37     25     Keyboard 8 and *4     9     √     √     √ 4/101/104        
  42. 38     26     Keyboard 9 and (4     10     √     √     √ 4/101/104        
  43. 39     27     Keyboard 0 and )4     11     √     √     √ 4/101/104        
  44. 40     28     Keyboard Return (ENTER)5     43     √     √     √ 4/101/104        
  45. 41     29     Keyboard ESCAPE     110     √     √     √ 4/101/104        
  46. 42     2A     Keyboard DELETE (Backspace)13     15     √     √     √ 4/101/104        
  47. 43     2B     Keyboard Tab     16     √     √     √ 4/101/104        
  48. 44     2C     Keyboard Spacebar     61     √     √     √ 4/101/104        
  49. 45     2D     Keyboard - and (underscore)4     12     √     √     √ 4/101/104        
  50. 46     2E     Keyboard = and +4     13     √     √     √ 4/101/104        
  51. 47     2F     Keyboard [ and {4     27     √     √     √ 4/101/104        
  52. 48     30     Keyboard ] and }4     28     √     √     √ 4/101/104        
  53. 49     31     Keyboard \ and |     29     √     √     √ 4/101/104        
  54. 50     32     Keyboard Non-US # and ~2     42     √     √     √ 4/101/104        
  55. 51     33     Keyboard ; and :4     40     √     √     √ 4/101/104        
  56. 52     34     Keyboard ‘ and “4     41     √     √     √ 4/101/104        
  57. 53     35     Keyboard Grave Accent and Tilde4     1     √     √     √ 4/101/104        
  58. 54     36     Keyboard, and <4     53     √     √     √ 4/101/104        
  59. 55     37     Keyboard . and >4     54     √     √     √ 4/101/104        
  60. 56     38     Keyboard / and ?4     55     √     √     √ 4/101/104        
  61. 57     39     Keyboard Caps Lock11     30     √     √     √ 4/101/104        
  62. 58     3A     Keyboard F1     112     √     √     √ 4/101/104        
  63.   
  64. 59     3B     Keyboard F2     113     √     √     √ 4/101/104        
  65. 60     3C     Keyboard F3     114     √     √     √ 4/101/104        
  66. 61     3D     Keyboard F4     115     √     √     √ 4/101/104        
  67. 62     3E     Keyboard F5     116     √     √     √ 4/101/104        
  68. 63     3F     Keyboard F6     117     √     √     √ 4/101/104        
  69. 64     40     Keyboard F7     118     √     √     √ 4/101/104        
  70. 65     41     Keyboard F8     119     √     √     √ 4/101/104        
  71. 66     42     Keyboard F9     120     √     √     √ 4/101/104        
  72. 67     43     Keyboard F10     121     √     √     √ 4/101/104        
  73. 68     44     Keyboard F11     122     √     √     √ 101/104        
  74. 69     45     Keyboard F12     123     √     √     √ 101/104        
  75. 70     46     Keyboard PrintScreen1     124     √     √     √ 101/104        
  76. 71     47     Keyboard Scroll Lock11     125     √     √     √ 4/101/104        
  77. 72     48     Keyboard Pause1     126     √     √     √ 101/104        
  78. 73     49     Keyboard Insert1     75     √     √     √ 101/104        
  79. 74     4A     Keyboard Home1     80     √     √     √ 101/104        
  80. 75     4B     Keyboard PageUp1     85     √     √     √ 101/104        
  81. 76     4C     Keyboard Delete Forward1;14     76     √     √     √ 101/104        
  82. 77     4D     Keyboard End1     81     √     √     √ 101/104        
  83. 78     4E     Keyboard PageDown1     86     √     √     √ 101/104        
  84. 79     4F     Keyboard RightArrow1     89     √     √     √ 101/104        
  85. 80     50     Keyboard LeftArrow1     79     √     √     √ 101/104        
  86. 81     51     Keyboard DownArrow1     84     √     √     √ 101/104        
  87. 82     52     Keyboard UpArrow1     83     √     √     √ 101/104        
  88. 83     53     Keypad Num Lock and Clear11     90     √     √     √ 101/104        
  89. 84     54     Keypad /1     95     √     √     √ 101/104        
  90. 85     55     Keypad *     100     √     √     √ 4/101/104        
  91. 86     56     Keypad -     105     √     √     √ 4/101/104        
  92. 87     57     Keypad +     106     √     √     √ 4/101/104        
  93. 88     58     Keypad ENTER5     108     √     √     √ 101/104        
  94. 89     59     Keypad 1 and End     93     √     √     √ 4/101/104        
  95. 90     5A     Keypad 2 and Down Arrow     98     √     √     √ 4/101/104        
  96. 91     5B     Keypad 3 and PageDn     103     √     √     √ 4/101/104        
  97. 92     5C     Keypad 4 and Left Arrow     92     √     √     √ 4/101/104        
  98. 93     5D     Keypad 5     97     √     √     √ 4/101/104        
  99. 94     5E     Keypad 6 and Right Arrow     102     √     √     √ 4/101/104        
  100. 95     5F     Keypad 7 and Home     91     √     √     √ 4/101/104        
  101. 96     60     Keypad 8 and Up Arrow     96     √     √     √ 4/101/104        
  102.   
  103. 97     61     Keypad 9 and PageUp     101     √     √     √ 4/101/104        
  104. 98     62     Keypad 0 and Insert     99     √     √     √ 4/101/104        
  105. 99     63     Keypad . and Delete     104     √     √     √ 4/101/104        
  106. 100     64     Keyboard Non-US \ and |3;6     45     √     √     √ 4/101/104        
  107. 101     65     Keyboard Application10     129     √         √ 104        
  108. 102     66     Keyboard Power9             √     √        
  109. 103     67     Keypad =             √            
  110. 104     68     Keyboard F13             √            
  111. 105     69     Keyboard F14             √            
  112. 106     6A     Keyboard F15             √            
  113. 107     6B     Keyboard F16                        
  114. 108     6C     Keyboard F17                        
  115. 109     6D     Keyboard F18                        
  116. 110     6E     Keyboard F19                        
  117. 111     6F     Keyboard F20                        
  118. 112     70     Keyboard F21                        
  119. 113     71     Keyboard F22                        
  120. 114     72     Keyboard F23                        
  121. 115     73     Keyboard F24                        
  122. 116     74     Keyboard Execute                 √        
  123. 117     75     Keyboard Help                 √        
  124. 118     76     Keyboard Menu                 √        
  125. 119     77     Keyboard Select                 √        
  126. 120     78     Keyboard Stop                 √        
  127. 121     79     Keyboard Again                 √        
  128. 122     7A     Keyboard Undo                 √        
  129. 123     7B     Keyboard Cut                 √        
  130. 124     7C     Keyboard Copy                 √        
  131. 125     7D     Keyboard Paste                 √        
  132. 126     7E     Keyboard Find                 √        
  133. 127     7F     Keyboard Mute                 √        
  134. 128     80     Keyboard Volume Up                 √        
  135. 129     81     Keyboard Volume Down                 √        
  136. 130     82     Keyboard Locking Caps Lock12                 √        
  137. 131     83     Keyboard Locking Num Lock12                 √        
  138. 132     84     Keyboard Locking Scroll Lock12                 √        
  139. 133     85     Keypad Comma27     107                    
  140. 134     86     Keypad Equal Sign29                        
  141.   
  142. 135     87     Keyboard International115,28     56        
  143. 136     88     Keyboard International216            
  144. 137     89     Keyboard International317            
  145. 138     8A     Keyboard International418            
  146. 139     8B     Keyboard International519            
  147. 140     8C     Keyboard International620            
  148. 141     8D     Keyboard International721            
  149. 142     8E     Keyboard International822            
  150. 143     8F     Keyboard International922            
  151. 144     90     Keyboard LANG125            
  152. 145     91     Keyboard LANG226            
  153. 146     92     Keyboard LANG330            
  154. 147     93     Keyboard LANG431            
  155. 148     94     Keyboard LANG532            
  156. 149     95     Keyboard LANG68            
  157. 150     96     Keyboard LANG78            
  158. 151     97     Keyboard LANG88            
  159. 152     98     Keyboard LANG98            
  160. 153     99     Keyboard Alternate Erase7            
  161. 154     9A     Keyboard SysReq/Attention1            
  162. 155     9B     Keyboard Cancel            
  163. 156     9C     Keyboard Clear            
  164. 157     9D     Keyboard Prior            
  165. 158     9E     Keyboard Return            
  166. 159     9F     Keyboard Separator            
  167. 160     A0     Keyboard Out            
  168. 161     A1     Keyboard Oper            
  169. 162     A2     Keyboard Clear/Again            
  170. 163     A3     Keyboard CrSel/Props            
  171. 164     A4     Keyboard ExSel            
  172. 165-175     A5-CF     Reserved            
  173. 176     B0     Keypad 00            
  174. 177     B1     Keypad 000            
  175. 178     B2     Thousands Separator 33            
  176. 179     B3     Decimal Separator 33            
  177. 180     B4     Currency Unit 34            
  178. 181     B5     Currency Sub-unit 34            
  179. 182     B6     Keypad (            
  180.   
  181. 183     B7     Keypad )        
  182. 184     B8     Keypad {        
  183. 185     B9     Keypad }        
  184. 186     BA     Keypad Tab        
  185. 187     BB     Keypad Backspace        
  186. 188     BC     Keypad A        
  187. 189     BD     Keypad B        
  188. 190     BE     Keypad C        
  189. 191     BF     Keypad D        
  190. 192     C0     Keypad E        
  191. 193     C1     Keypad F        
  192. 194     C2     Keypad XOR        
  193. 195     C3     Keypad ^        
  194. 196     C4     Keypad %        
  195. 197     C5     Keypad <        
  196. 198     C6     Keypad >        
  197. 199     C7     Keypad &        
  198. 200     C8     Keypad &&        
  199. 201     C9     Keypad |        
  200. 202     CA     Keypad ||        
  201. 203     CB     Keypad :        
  202. 204     CC     Keypad #        
  203. 205     CD     Keypad Space        
  204. 206     CE     Keypad @        
  205. 207     CF     Keypad !        
  206. 208     D0     Keypad Memory Store        
  207. 209     D1     Keypad Memory Recall        
  208. 210     D2     Keypad Memory Clear        
  209. 211     D3     Keypad Memory Add        
  210. 212     D4     Keypad Memory Subtract        
  211. 213     D5     Keypad Memory Multiply        
  212. 214     D6     Keypad Memory Divide        
  213. 215     D7     Keypad +/-        
  214. 216     D8     Keypad Clear        
  215. 217     D9     Keypad Clear Entry        
  216. 218     DA     Keypad Binary        
  217. 219     DB     Keypad Octal        
  218. 220     DC     Keypad Decimal        
  219.   
  220. 221     DD     Keypad Hexadecimal                        
  221. 222-223     DE-DF     Reserved                        
  222. 224     E0     Keyboard LeftControl     58     √     √     √ 4/101/104        
  223. 225     E1     Keyboard LeftShift     44     √     √     √ 4/101/104        
  224. 226     E2     Keyboard LeftAlt     60     √     √     √ 4/101/104        
  225. 227     E3     Keyboard Left GUI10;23     127     √     √     √     104        
  226. 228     E4     Keyboard RightControl     64     √     √     √ 101/104        
  227. 229     E5     Keyboard RightShift     57     √     √     √ 4/101/104        
  228. 230     E6     Keyboard RightAlt     62     √     √     √ 101/104        
  229. 231     E7     Keyboard Right GUI10;24     128     √     √     √     104        
  230. 232-65535 E8-FFFF     Reserved        
①host side
drivers/hid/usbhid/usbkbd.c中定义了一张表
  1. static const unsigned char usb_kbd_keycode[256] = {  
  2.       0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,//0  
  3.      50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,//16  
  4.       4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,//32  
  5.      27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,//48  
  6.      65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,//64  
  7.     105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,//80  
  8.      72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,//96  
  9.     191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,//112  
  10.     115,114,  0,  0,  0,121,  0, 89, 93,124, 92, 94, 95,  0,  0,  0,//128  
  11.     122,123, 90, 91, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//144  
  12.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//160  
  13.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//176  
  14.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//192  
  15.       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//208  
  16.      29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,//224  
  17.     150,158,159,128,136,177,178,176,142,152,173,140//240-251  
  18. };  
看看是怎么检测和上报按下释放事件的,在函数static void usb_kbd_irq(struct urb *urb)
  1. /****************************************检测修饰键*********************************************************/  
  2. /*每次中断传输都会执行以下检查*/  
  3.     for (i = 0; i < 8; i++)  
  4.         input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);  
  5. /* 
  6. new是kbd的成员,在usb_kbd_alloc_mem函数中分配8字节内存:kbd->new = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &kbd->new_dma), 
  7. 并且在中断urb初始化函数中usb_fill_int_urb(kbd->irq, dev, pipe, kbd->new, (maxp > 8 ? 8 : maxp), usb_kbd_irq, kbd, endpoint->bInterval); 
  8. 指定new为urb的缓冲区,即从单片机端点里取得的数据会放在new指向的内存里面,最大为8字节 
  9. 根据hid规范,从单片机获取的数据的首字节即new[0],其8位分别表示 
  10.       new[0] -- 
  11.       |--bit0: Left Control是否按下,按下为1 
  12.       |--bit1: Left Shift 是否按下,按下为1 
  13.       |--bit2: Left Alt 是否按下,按下为1 
  14.       |--bit3: Left GUI 是否按下,按下为1 
  15.       |--bit4: Right Control是否按下,按下为1 
  16.       |--bit5: Right Shift 是否按下,按下为1 
  17.       |--bit6: Right Alt 是否按下,按下为1 
  18.       |--bit7: Right GUI 是否按下,按下为1 
  19. (kbd->new[0] >> i) & 1 检测第i位是否为1,如果为1,则上报按键usb_kbd_keycode[i + 224] 
  20. 例如,若Left Control键按下,则在首次循环中,(kbd->new[0] >> 0) & 1=1,所以上报usb_kbd_keycode[0 + 224],查上面usb_kbd_keycode数组可知, 
  21. usb_kbd_keycode[224]=29,即上报键值29 
  22. 至于29到底是不是代表此键,可以查看输入子系统的键值定义,http://blog.csdn.net/songqqnew/article/details/6875502,发现有行  
  23.  #define KEY_LEFTCTRL        29     
  24. 其他类似... 
  25.  
  26. 可见通过input_report_key函数关联了3个按键表,总结一下 
  27. 1.hid规范的键盘码:本页可查到。是设备和主机间的约定,比如上面的例子,板子上有Left Control键按下,单片机就要按hid规范令new[0].0=1, 
  28. 主机获取到new[0].0=1则就会知道Left control键按下。又如对于鼠标按键,板子中键按下,单片机要按hid规范<span&gt;</span>令data[0]=0x04,主机获取到data[0]=0x04,便知道鼠标的左键按下。当然,鼠标hid和键盘hid的数据格式和含义不一样。 
  29. 2.input.h里的键盘码:http://blog.csdn.net/songqqnew/article/details/6875502。是input子系统里规定的某个按键按下要上报哪个数值。应该是input子系统和应用程序间的一个约定。 
  30. 3.usb_kbd_keycode[256]:本页可查到。此数组为了操作方便,用数组下标和对应成员值将hid规范码和input规范码统一起来,对于某个按键 
  31. 有usb_kbd_keycode[hid规范码]=input规范码 
  32. 比如按键a:usb_kbd_keycode[4]=30,按键1:usb_kbd_keycode[0x1e]=2 
  33. */  
  34.   
  35. /****************************************检测普通键*********************************************************/  
  36. /*每次中断传输都会执行以下检查*/  
  37.     for (i = 2; i < 8; i++) {  
  38. /*根据hid规范普通按键值处于data[2]-data[7],所以检查new[2]-new[7]获取按键值。在单片机侧是直接在相应字节填入hid规范码,如填入new[5]=0x1e.*/  
  39.   
  40.   
  41.         if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {  
  42. /*这种情况发生在原来按下的键释放时。 
  43. 至于>3,可以看hid规范码:有意义的hid规范码从4(字符a)开始。 
  44. 数组old[]是new[]的一个拷贝,size 8,见最后一行。 
  45. */  
  46. /*memscan源码如下 
  47. memscan --    Find a character in an area of memory.  
  48. void *memscan(void *addr, int c, size_t size) 
  49. { 
  50.     unsigned char *p = addr 
  51.     while (size) { 
  52.         if (*p == c) 
  53.             return (void *)p; 
  54.         p++; 
  55.         size--; 
  56.     } 
  57.       return (void *)p; 
  58. } */     
  59. /*比如单片机发过来数据new[5]=0x1e(按键1),则在i=5时, 
  60. 在new[2]至new[7]中寻找和old[5]相等的字符,如果相等返回new中相等字符的地址;否则返回new的最后一个元素的下一个地址,实际就是new+8。所以若没找到, 
  61. 则memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8成立 
  62. */  
  63. /*总之,此if做了:检查old[i]值的hid规范合法性,并和新出现的按键值即new[2]--new[7]一一比较,如果新出现的按键值没有old[i],说明old[i]已经被释放了,所以执行以下操作 
  64. 如果不是新的释放事件,而是原来的键一直处于释放状态,则不会执行下面的操作,说明只会在按键释放瞬间发生按键释放上报事件,而在未按期间不会上报释放事件。*/  
  65.             if (usb_kbd_keycode[kbd->old[i]])//old[i]对应的input码有意义,执行以下  
  66.                 input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);//上报按键释放事件  
  67.             else  
  68.                 dev_info(&urb->dev->dev,  
  69.                         "Unknown key (scancode %#x) released.\n", kbd->old[i]);  
  70.         }  
  71.   
  72.   
  73.         if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {  
  74. /*这种情况发生在原来释放的键按下时。 
  75. 此if非彼if,它做了:检查new[i]值的hid规范合法性,并和old[2]--old[7]比较,如果没有一个值和new[i]相等,说明new[i]是新按下的按键,所以执行下面的操作 
  76. 如果不是新键按下,而是原来的按键一直没有释放,则不会执行下面的操作,说明只会在按键按下时上报按键事件,而按着过程中,不会上报按键事件。 
  77. */          if (usb_kbd_keycode[kbd->new[i]])  
  78.                 input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);//上报新键按下事件  
  79.             else  
  80.                 dev_info(&urb->dev->dev,  
  81.                         "Unknown key (scancode %#x) released.\n", kbd->new[i]);  
  82.         }  
  83.     }  
  84.   
  85.   
  86.     input_sync(kbd->dev);  
  87.     memcpy(kbd->old, kbd->new, 8);//拷贝new到old  
  88. /*总之实现了,在按键释放时报告一次释放事件,释放之后不会再报告;在按键按下时会报告一次按下事件,按下之后不会再报告。还算巧妙*/  

②device side
单片机装备5个按键k1,k2,k3,k4,k5用来模拟键盘的1, 2, 3, 4, 5键
比如单片机检测到k1按下,会令keyboardvalue[5]=0x1e,代码如下
  1. static INT8U keyboardvalue[8] = {0,0,0,0,0,0,0,0};//和hid规范相应的8个字节,用于发送给主机  
  2. int main( void )  
  3. {  
  4.     INT8U btmp;  
  5.     Clock_Init( );  
  6.     USB_Init( USB_ENABLE );  
  7.     EA = 1;  
  8.     while( 1 )  
  9.     {  
  10. //      keyboardvalue[5] = 0x3D;  
  11. //      HID_SendData( keyboardvalue, 8 );   
  12.         for( btmp = 0; btmp < 8; btmp ++ )  
  13.         {     
  14.             keyboardvalue[btmp] = 0;              
  15.         }  
  16.         btmp = 1;  
  17.         switch( KeyScan( )  
  18.         {  
  19.             case    K1_PRESS:  
  20.                 keyboardvalue[5] = 0x1e;//即数字1,参照hid规范码,当然也可使用其他字节,比如 keyboardvalue[2]=0x1e, keyboardvalue[7]=0x1e等  
  21.                 break;  
  22.             case    K2_PRESS:  
  23.                 keyboardvalue[5] = 0x1f;//数字2  
  24.                 break;  
  25.             case    K3_PRESS:  
  26.                 keyboardvalue[5] = 0x20;//数字3  
  27.                 break;  
  28.             case    K4_PRESS:  
  29.                 keyboardvalue[5] = 0x21;//数字4  
  30.                 break;     
  31.             case    K5_PRESS:  
  32.                 keyboardvalue[5] = 0x22;//数字5  
  33.                 break;  
  34.             case    K1_RELEASE:  
  35.             case    K2_RELEASE:  
  36.             case    K3_RELEASE:  
  37.             case    K4_RELEASE:  
  38.             case    K5_RELEASE:               
  39.                 break;  
  40.             default:  
  41.                 btmp = 0;  
  42.                 break;     
  43.         }                          
  44.         if( btmp )  
  45.         {  
  46.             HID_SendData( keyboardvalue, 8 );  //发送使能  
  47.         }  
  48.         IdleMode( );  
  49.     }  
  50.     return 0;  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值