你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM324X4矩形键盘

[复制链接]
STMCU小助手 发布时间:2022-11-28 15:18
介绍什么是矩阵键盘

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和8X8,其中用的最多的是4X4。

640 (1).jpg

矩阵键盘的原理

矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。
原理如同矩阵数列的行列式。


640.jpg


驱动电路图

按4*4矩阵搭建的按键矩阵还是比较简单的,也有的人为了保证电路的稳定性,加上二极管保护和上拉电阻,但是一般要求不太高的电路就不需要加了,向下面设置的电路那样就可以了。


640.png


软件程序实现

在这里宏定义一些GPIO的信息。

KEY.h

  1. #ifndef _KEY_H
  2. #define _KEY_H
  3. #include "stm32f10x.h"
  4. //引脚
  5. #define S0 GPIO_Pin_0
  6. #define S1 GPIO_Pin_1
  7. #define S2 GPIO_Pin_2
  8. #define S3 GPIO_Pin_3
  9. #define S4 GPIO_Pin_4
  10. #define S5 GPIO_Pin_5
  11. #define S6 GPIO_Pin_6
  12. #define S7 GPIO_Pin_7
  13. //GPIO寄存器
  14. #define KEY_PORT GPIOB
  15. //时钟
  16. #define RCC_APB2_KEY  RCC_APB2Periph_GPIOB
  17. //函数定义
  18. void InitKey(void);
  19. int NumKey(void);
  20. //延时
  21. void Delay( uint32_t count )
  22. {
  23. for(; count!=0; count--);
  24. }
  25. #endif /* _KEY_H  */
复制代码

在这里存放两个函数,一个是初始化矩形键盘GPIO口的函数,在函数里把前四个定义为推挽输出,后四个GPIO口定义为下拉输入。
另一个函数是键盘扫描函数,通过函数返回值确定是举行键盘的哪一个按键被按下。

KEY.c
  1. #include "KEY.h"
  2. void InitKey(void)//初始化KEY的GPIO
  3. {
  4. //打开GPIO时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2_KEY,ENABLE);
  6. //把S0,S1,S2,S3配置为推挽输出
  7. GPIO_InitTypeDef   GPIOInit;
  8. GPIOInit.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
  9. GPIOInit.GPIO_Speed=GPIO_Speed_50MHz;
  10. GPIOInit.GPIO_Pin=S0|S1|S2|S3;
  11. GPIO_Init(KEY_PORT,&GPIOInit);

  12. //把S4,S5,S6,S7配置为下拉输入
  13. GPIOInit.GPIO_Mode=GPIO_Mode_IPU;
  14. GPIOInit.GPIO_Pin=S4|S5|S6|S7;
  15. GPIO_Init(KEY_PORT,&GPIOInit);

  16.   //0--3输出高,4--7输出低
  17.   GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  18.   GPIO_ResetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
  19.   
  20. }
  21. int NumKey(void)  //扫描键值
  22. {
  23. int KeyVal=0;     //键值,后面自己设定的,用来设置按键的序号
  24. u16 KeyWrite=0;   //写给GPIO的值
  25. GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0 | 0xf));//0--3全部输出高
  26. if((KEY_PORT->IDR&0x00f0)==0x0000)   //如果4--7全为0,表示没有按键按下,返回值设置为-1
  27.   return -1;
  28.   
  29. else
  30. {
  31.   Delay(0xF);//消抖
  32.    if((KEY_PORT->IDR&0x00f0)==0x0000)   //如果4-7全为0,表示刚才是抖动造成的
  33.   return -1;
  34. }
  35. GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x1));//让0-3输出0001

  36. switch(KEY_PORT->IDR&0x00f0)//对4--7进行判断
  37. {
  38.   case 0x0010: KeyVal=16;break;
  39.   case 0x0020: KeyVal=12;break;
  40.   case 0x0040: KeyVal=8; break;
  41.   case 0x0080: KeyVal=4; break;
  42. }

  43. GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x2));//让0-3输出0010
  44. switch(KEY_PORT->IDR&0x00f0)//对4--7进行判断
  45. {
  46.   case 0x0010: KeyVal=15;break;
  47.   case 0x0020: KeyVal=11;break;
  48.   case 0x0040: KeyVal=7; break;
  49.   case 0x0080: KeyVal=3; break;
  50. }
  51. GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x4));//让0-3输出0100
  52. switch(KEY_PORT->IDR&0x00f0)//对4--7进行判断
  53. {
  54.   case 0x0010: KeyVal=14;break;
  55.   case 0x0020: KeyVal=10;break;
  56.   case 0x0040: KeyVal=6; break;
  57.   case 0x0080: KeyVal=2; break;
  58. }
  59. GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x8));//让0-3输出1000
  60. switch(KEY_PORT->IDR&0x00f0)//对4--7进行判断
  61. {
  62.   case 0x0010: KeyVal=13;break;
  63.   case 0x0020: KeyVal=9;break;
  64.   case 0x0040: KeyVal=5; break;
  65.   case 0x0080: KeyVal=1; break;
  66. }
  67. return KeyVal;
  68. }
复制代码


转载自: 跋扈洋
收藏 评论0 发布时间:2022-11-28 15:18

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版