当前位置:   article > 正文

矩阵键盘焊接及程序_3*3矩阵键盘硬件示意图

3*3矩阵键盘硬件示意图

      组内的小伙伴们从暑假开始的时候开始学习32也学了快20天了,昨天作为一个小检测吧,让他们焊了一个3*3的矩阵键盘然后写了键盘的驱动,虽然中间的过程有些曲折,但最后结果还是可以的,每个人都写出来了。

      我也画了键盘的原理图以及接线图,并且也写了键盘的驱动,在博客上记录一下吧。

      矩阵键盘的原理就是分行和列扫描,来获知按下按键的行数和列数,然后得到按下按键的键值

      矩阵键盘的原理图及接线图如下:

               

 

                                  
     因为四脚的微动按键的同一排引脚是相连的,相当于是一个同一个引脚,所以利用这个有点会大大简化我们的电路,不用做太多的飞线。

     接线效果图如下:     

                        

                         

      矩阵键盘的扫描原理为,先让三个横行或者三个竖列输出高电平,另外三个为输入模式,若扫描到高电平,则表示该行或该列有按键按下,接着切换输入输出,扫描另外三个,得到另外的坐标,由此确定按键按下的位置。

      F4的代码如下:

      key.h

  1. #ifndef __KEY_H
  2. #define __KEY_H
  3. #include "sys.h"
  4. //行操作宏定义
  5. #define Row1_Write PAout(0)
  6. #define Row2_Write PAout(2)
  7. #define Row3_Write PAout(3)
  8. #define Row1_Read PAin(0)
  9. #define Row2_Read PAin(2)
  10. #define Row3_Read PAin(3)
  11. //列操作宏定义
  12. #define Col1_Write PAout(7)
  13. #define Col2_Write PAout(6)
  14. #define Col3_Write PAout(4)
  15. #define Col1_Read PAin(7)
  16. #define Col2_Read PAin(6)
  17. #define Col3_Read PAin(4)
  18. #define PIN_OUT(x) {GPIOA->MODER&=~(3<<((x)*2));GPIOA->MODER|=1<<((x)*2);} //将IO口配置为输出
  19. #define PIN_IN(x) {GPIOA->MODER&=~(3<<((x)*2));GPIOA->MODER|=0<<((x)*2);} //将IO口配置为输入
  20. void KEY_Init(void); //IO初始化
  21. u8 KEY_Scan(u8); //按键扫描函数
  22. #endif

      key.c

  1. #include "key.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. void KEY_Init(void)
  5. {
  6. RCC->AHB1ENR|=1<<0; //使能PORTA时钟
  7. GPIO_Set(GPIOA,PIN0|PIN2|PIN3,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PA0\PA2\PA3设置为输入
  8. GPIO_Set(GPIOA,PIN4|PIN6|PIN7,GPIO_MODE_OUT,0,0,GPIO_PUPD_PU); //推挽输出
  9. }
  10. //按键处理函数
  11. u8 KEY_Scan(u8 mode)
  12. {
  13. u8 res[4][4]={{0,0,0,0},{0,1,2,3},{0,4,5,6},{0,7,8,9}};
  14. u8 row=0,col=0;
  15. Col1_Write=1;
  16. Col2_Write=1;
  17. Col3_Write=1;
  18. //检测行
  19. if(Row1_Read==1||Row2_Read==1||Row3_Read==1)
  20. {
  21. delay_ms(10);//去抖动
  22. if(Row1_Read==1)
  23. row=1;
  24. else if(Row2_Read==1)
  25. row=2;
  26. else if(Row3_Read==1)
  27. row=3;
  28. }
  29. else
  30. return 0; //无按键按下
  31. //改变输入输出模式
  32. Col1_Write=0;
  33. Col2_Write=0;
  34. Col3_Write=0;
  35. PIN_OUT(0);
  36. PIN_OUT(2);
  37. PIN_OUT(3);
  38. PIN_IN(4);
  39. PIN_IN(6);
  40. PIN_IN(7);
  41. Row1_Write=1;
  42. Row2_Write=1;
  43. Row3_Write=1;
  44. //检测列
  45. if(Col1_Read==1)
  46. col=1;
  47. else if(Col2_Read==1)
  48. col=2;
  49. else if(Col3_Read==1)
  50. col=3;
  51. //还原IO口
  52. PIN_OUT(4);
  53. PIN_OUT(6);
  54. PIN_OUT(7);
  55. PIN_IN(0);
  56. PIN_IN(2);
  57. PIN_IN(3);
  58. if(row!=0&&col!=0)
  59. {
  60. return res[row][col];
  61. }
  62. else
  63. return 0;
  64. }

  主函数,扫描后在串口打印键值

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "usart.h"
  5. #include "led.h"
  6. int main(void)
  7. {
  8. u8 key;
  9. Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
  10. uart_init(84,115200);
  11. delay_init(168); //延时初始化
  12. KEY_Init(); //初始化与按键连接的硬件接口
  13. LED_Init();
  14. LED0=0;
  15. while(1)
  16. {
  17. LED0=1;
  18. key=KEY_Scan(0); //得到键值
  19. if(key)
  20. {
  21. switch(key)
  22. {
  23. case 1:
  24. printf("1\r\n");
  25. break;
  26. case 2:
  27. printf("2\r\n");
  28. break;
  29. case 3:
  30. printf("3\r\n");
  31. break;
  32. case 4:
  33. printf("4\r\n");
  34. break;
  35. case 5:
  36. printf("5\r\n");
  37. break;
  38. case 6:
  39. printf("6\r\n");
  40. break;
  41. case 7:
  42. printf("7\r\n");
  43. break;
  44. case 8:
  45. printf("8\r\n");
  46. break;
  47. case 9:
  48. printf("9\r\n");
  49. break;
  50. }
  51. }
  52. LED0=0;
  53. }
  54. }

 

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

闽ICP备14008679号