第二步:四个键的键盘 在这一点上我们的键盘不是非常有用的,如果我们在这上面作出实际类别,那样会很好。为此我们需要一些键,这些键需被置入一个键盘矩阵。一个全尺寸的104键键盘可以有18列6行,而我们必须把它简化为2x2的键盘矩阵,这是示意图:
它在开发板上是这样呈现的:
假设ROW1连接PINA0、ROW2连接PINA1、COL1连接PORTB0以及COL2连接PORTB1,那么扫描代码会是这样: -
- typedef struct {
- volatile uint8_t *Direction;
- volatile uint8_t *Name;
- uint8_t Number;
- } Pin_t;
-
-
- typedef struct {
- const uint8_t ColNum;
- const uint8_t RowNum;
- const Pin_t *ColPorts;
- const Pin_t *RowPins;
- } KeyMatrixInfo_t;
-
-
- typedef struct {
- const __flash KeyMatrixInfo_t *Info;
- uint8_t *Matrix;
- } KeyMatrix_t;
-
- const __flash KeyMatrixInfo_t KeyMatrix = {
- .ColNum = 2,
- .RowNum = 2,
- .RowPins = (Pin_t[]) {
- { .Direction=&DDRA, .Name=&PINA, .Number=PINA0 },
- { .Direction=&DDRA, .Name=&PINA, .Number=PINA1 }
- },
- .ColPorts = (Pin_t[]) {
- { .Direction=&DDRB, .Name=&PORTB, .Number=PORTB0 },
- { .Direction=&DDRB, .Name=&PORTB, .Number=PORTB1 },
- }
- };
-
- void KeyMatrix_Scan(KeyMatrix_t *KeyMatrix)
- {
- for (uint8_t Col=0; Col<KeyMatrix->Info->ColNum; Col++) {
- const Pin_t *ColPort = KeyMatrix->Info->ColPorts + Col;
- for (uint8_t Row=0; Row<KeyMatrix->Info->RowNum; Row++) {
- const Pin_t *RowPin = KeyMatrix->Info->RowPins + Row;
- uint8_t IsKeyPressed = *RowPin->Name & 1<<RowPin->Number;
- KeyMatrix_SetElement(KeyMatrix, Row, Col, IsKeyPressed);
- }
- }
- }
代码一次扫描一列,并读取个人键开关的状态,然后将这种状态保存到一个数组中,通过我们前文所说的CALLBACK_HID_Device_CreateHIDReport()函数,相关的扫描代码将发送这些基于数组的状态。
|