当前位置:   article > 正文

Hal库_stm32开发之矩阵键盘,可移植_stm32矩阵键盘

stm32矩阵键盘

矩阵键盘的原理:        

本文采用的扫描原理是:所有行设为输出模式高电平),所有列设为输入模式。(上拉

       1. 先判断第一行的按键;设置第一行为低电平,其余行为高电平,然后按顺序依次读取第一个到第四个按键,哪一个为低电平,哪一个就被按下。

        2.再判断第二行的按键;设置第二行为低电平,其余行为高电平,然后按顺序依次读取第五个到第八个按键,哪一个为低电平,哪一个就被按下。

        3.以此类推,就可以完成全部矩阵键盘的读取了。

矩阵键盘原理图(仅供参考)

R1即row1(第一排)

C1即column1(第一列)

剩下的以此类推

Cubemx的配置

代码如下

Matrixkey.c

  1. #include "main.h"
  2. #include "usart.h"
  3. //#include "gpio.h"
  4. int MatrixKey() //修改
  5. {
  6. int KeyNumber = 0; //储存按键值
  7. int cnt = 0; //长按计数
  8. HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET); // PB13 = 0
  9. // HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
  10. // HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
  11. // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
  12. if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
  13. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 1; }
  14. if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
  15. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 2; }
  16. if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
  17. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 3; }
  18. if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
  19. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 4; }
  20. HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
  21. HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET); // PB12 = 0
  22. // HAL_GPIO_WritePin(R3_GPIO_Port, R3_PinR3_PinR3_PinR3_Pin, GPIO_PIN_SET); // PB15 = 1
  23. // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
  24. if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
  25. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 5; }
  26. if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
  27. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 6; }
  28. if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
  29. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 7; }
  30. if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
  31. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 8; }
  32. HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
  33. HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
  34. HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_RESET); // PB15 = 0
  35. // HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
  36. if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
  37. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 9; }
  38. if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
  39. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 10; }
  40. if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
  41. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 11; }
  42. if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
  43. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 12; }
  44. HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
  45. HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
  46. HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
  47. HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_RESET); // PB14 = 0
  48. if (HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0)
  49. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C1_GPIO_Port, C1_Pin) == 0); HAL_Delay(15); KeyNumber = 13; }
  50. if (HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0)
  51. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C2_GPIO_Port, C2_Pin) == 0); HAL_Delay(15); KeyNumber = 14; }
  52. if (HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0)
  53. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C3_GPIO_Port, C3_Pin) == 0); HAL_Delay(15); KeyNumber = 15; }
  54. if (HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0)
  55. { HAL_Delay(20); while(HAL_GPIO_ReadPin(C4_GPIO_Port, C4_Pin) == 0); HAL_Delay(15); KeyNumber = 16; } //长按效果
  56. HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET); // PB13 = 1
  57. HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET); // PB12 = 1
  58. HAL_GPIO_WritePin(R3_GPIO_Port, R3_Pin, GPIO_PIN_SET); // PB15 = 1
  59. HAL_GPIO_WritePin(R4_GPIO_Port, R4_Pin, GPIO_PIN_SET); // PB14 = 1
  60. // if(KeyNumber != 0)
  61. // {
  62. // printf("%d",KeyNumber);
  63. // KeyNumber = 0;
  64. // }
  65. return KeyNumber;
  66. }

Matrixkey.h

  1. #ifndef __MATRIXKEY_H__
  2. #define __MATRIXKEY_H__
  3. int MatrixKey();
  4. #endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/302175
推荐阅读
相关标签
  

闽ICP备14008679号