设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

构建一个属于软件开发者的键盘

2015-2-5 21:49| 发布者: joejoe0332| 查看: 6768| 评论: 0|原作者: 陈明|来自: DZone

摘要: 作为软件开发者,键盘可以说是我们最亲密的“朋友”之一。频繁的敲击键盘让定制键盘成为急需品,而软件工程师LÁSZLÓ MONDA为我们详细介绍了其制作“终极黑客键盘”的具体过程。 ...


第二步:四个键的键盘

  在这一点上我们的键盘不是非常有用的,如果我们在这上面作出实际类别,那样会很好。为此我们需要一些键,这些键需被置入一个键盘矩阵。一个全尺寸的104键键盘可以有18列6行,而我们必须把它简化为2x2的键盘矩阵,这是示意图:


  它在开发板上是这样呈现的:


  假设ROW1连接PINA0、ROW2连接PINA1、COL1连接PORTB0以及COL2连接PORTB1,那么扫描代码会是这样:

  1. /* A single pin of the microcontroller to which a row or column is connected. */  
  2. typedef struct {  
  3.     volatile uint8_t *Direction;  
  4.     volatile uint8_t *Name;  
  5.     uint8_t Number;  
  6. } Pin_t;  
  7.    
  8. /* This part of the key matrix is stored in the Flash to save SRAM space. */  
  9. typedef struct {  
  10.     const uint8_t ColNum;  
  11.     const uint8_t RowNum;  
  12.     const Pin_t *ColPorts;  
  13.     const Pin_t *RowPins;  
  14. } KeyMatrixInfo_t;  
  15.    
  16. /* This Part of the key matrix is stored in the SRAM. */  
  17. typedef struct {  
  18.     const __flash KeyMatrixInfo_t *Info;  
  19.     uint8_t *Matrix;  
  20. } KeyMatrix_t;  
  21.    
  22. const __flash KeyMatrixInfo_t KeyMatrix = {  
  23.     .ColNum = 2,  
  24.     .RowNum = 2,  
  25.     .RowPins = (Pin_t[]) {  
  26.         { .Direction=&DDRA, .Name=&PINA, .Number=PINA0 },  
  27.         { .Direction=&DDRA, .Name=&PINA, .Number=PINA1 }  
  28.     },  
  29.     .ColPorts = (Pin_t[]) {  
  30.         { .Direction=&DDRB, .Name=&PORTB, .Number=PORTB0 },  
  31.         { .Direction=&DDRB, .Name=&PORTB, .Number=PORTB1 },  
  32.     }  
  33. };  
  34.    
  35. void KeyMatrix_Scan(KeyMatrix_t *KeyMatrix)  
  36. {  
  37.     for (uint8_t Col=0; Col<KeyMatrix->Info->ColNum; Col++) {  
  38.         const Pin_t *ColPort = KeyMatrix->Info->ColPorts + Col;  
  39.         for (uint8_t Row=0; Row<KeyMatrix->Info->RowNum; Row++) {  
  40.             const Pin_t *RowPin = KeyMatrix->Info->RowPins + Row;  
  41.             uint8_t IsKeyPressed = *RowPin->Name & 1<<RowPin->Number;  
  42.             KeyMatrix_SetElement(KeyMatrix, Row, Col, IsKeyPressed);  
  43.         }  
  44.     }  
  45. }  

  代码一次扫描一列,并读取个人键开关的状态,然后将这种状态保存到一个数组中,通过我们前文所说的CALLBACK_HID_Device_CreateHIDReport()函数,相关的扫描代码将发送这些基于数组的状态。



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部