赞
踩
本文采用的扫描原理是:所有行设为输出模式(高电平),所有列设为输入模式。(上拉)
1. 先判断第一行的按键;设置第一行为低电平,其余行为高电平,然后按顺序依次读取第一个到第四个按键,哪一个为低电平,哪一个就被按下。
2.再判断第二行的按键;设置第二行为低电平,其余行为高电平,然后按顺序依次读取第五个到第八个按键,哪一个为低电平,哪一个就被按下。
3.以此类推,就可以完成全部矩阵键盘的读取了。
矩阵键盘原理图(仅供参考)
R1即row1(第一排)
C1即column1(第一列)
剩下的以此类推
Matrixkey.c
- #include "main.h"
- #include "usart.h"
- //#include "gpio.h"
-
- int MatrixKey() //修改
- {
- int KeyNumber = 0; //储存按键值
- int cnt = 0; //长按计数
-
- HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET); // PB13 = 0
- // HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
- // HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
- // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
- if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 1; }
- if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 2; }
- if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 3; }
- if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 4; }
-
- HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
- HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET); // PB12 = 0
- // HAL_GPIO_WritePin(R3_GPIO_Port, R3_PinR3_PinR3_PinR3_Pin, GPIO_PIN_SET); // PB15 = 1
- // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
- if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 5; }
- if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 6; }
- if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 7; }
- if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 8; }
-
- HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
- HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
- HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_RESET); // PB15 = 0
- // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
- if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 9; }
- if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 10; }
- if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 11; }
- if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 12; }
-
- HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
- HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
- HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
- HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_RESET); // PB14 = 0
- if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 13; }
- if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 14; }
- if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 15; }
- if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
- { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 16; } //长按效果
- HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
- HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
- HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
- HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
-
- // if(KeyNumber != 0)
- // {
- // printf("%d",KeyNumber);
- // KeyNumber = 0;
- // }
- return KeyNumber;
- }
Matrixkey.h
- #ifndef __MATRIXKEY_H__
- #define __MATRIXKEY_H__
-
- int MatrixKey();
-
- #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。