找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32矩阵键盘源程序 固件库

[复制链接]
路漫漫 发表于 2020-5-29 01:04:33 | 显示全部楼层 |阅读模式
STM32 矩阵键盘
简介
1.硬件部分
2.软件部分

硬件部分
矩阵键盘的工作方式

对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中的CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常键盘的工作方式有三种,编程扫描、定时扫描和中断扫描。

(1)编程扫描方式

编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。

(2)定时扫描方式

定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有按键按下时识别出该键,再执行该键的功能程序。

(3)中断扫描方式

上述两种键盘扫描方式,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。

为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无按键按下时,CPU处理自己的工作,当有按键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。

4x4矩阵键盘模块原理图
080704pygbfbi1gz9byyyf.png
  1. /*********************************************************************
  2. * 文件名  :key4x4.c
  3. * 描述    :按键应用函数库        

  4. * 硬件连接:-------------------------
  5. *          | PB8  - H4          |
  6. *          | PB9  - H3                         |
  7. *          | PB10 - H2          |
  8. *          | PB11 - H1                     |
  9. *          | PB12 - L4          |
  10. *          | PB13 - L3                     |
  11. *          | PB14 - L2          |
  12. *          | PB15 - L1                         |
  13. *           -------------------------
  14. * 库版本  :ST3.5.0
  15. *********************************************************************/

  16. #include "key4x4.h"
  17. #include "delay.h"

  18. /*
  19. * 函数名:Key_GPIO_Config
  20. * 描述  :配置按键用到的I/O口 GPIO端口可以自行定义
  21. * 输入  :无
  22. * 输出  :无
  23. */
  24. void Key4x4_GPIO_Config(void)
  25. {
  26.           GPIO_InitTypeDef GPIO_InitStructure;
  27.          
  28.           /*开启按键端口的时钟*/
  29.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  30.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //GPIO端口引脚可以自行定义
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  32.    //配置引脚速度
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  34.     //配置引脚模式  GPIO_Mode_IPU 上拉输入
  35.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  36.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;        
  37.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
  38.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  39.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  40. }
  41. /*
  42. * 函数名:u8 Key_Scan
  43. * 描述  :按键扫描函数
  44. * 输入  :无
  45. * 输出  :无
  46. */
  47. u8 Key_Scan(void)
  48. {
  49.         u16 temp;
  50.         u8 ucBackValue=0;
  51.         //====扫描第一列==========
  52.         GPIO_Write(GPIOB,0xfe00);
  53.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  54.         temp=temp&0xf000;    //屏蔽低4位
  55.         if (temp!=0xf000)      //假如高4位不全是1
  56.         {
  57.                 delay_ms(20);      // 延时消抖再读
  58.                 temp=GPIO_ReadInputData(GPIOB);
  59.                 temp=temp&0xf000;
  60.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  61.                 {
  62.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  63.                         switch(temp)
  64.                         {
  65.                                 case 0xee00:
  66.                                 ucBackValue = 1;break;
  67.                                 case 0xde00:
  68.                                 ucBackValue = 5;break;
  69.                                 case 0xbe00:
  70.                                 ucBackValue = 9;break;
  71.                                 case 0x7e00:
  72.                                 ucBackValue = 13;break;
  73.                                 default:break;
  74.                         }
  75.                         while(temp!=0xf000)   //等待按键放开,初始必然被执行
  76.                         {
  77.                                 temp=GPIO_ReadInputData(GPIOB);
  78.                                 temp=temp&0xf000;
  79.                         }

  80.                 }
  81.         }

  82.         //====第二列送0==========
  83.         GPIO_Write(GPIOB,0xfd00);
  84.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  85.         temp=temp&0xf000;    //屏蔽低4位
  86.         if (temp!=0xf000)      //假如高4位不全是1
  87.         {
  88.                 delay_ms(20);      // 延时消抖再读
  89.                 temp=GPIO_ReadInputData(GPIOB);
  90.                 temp=temp&0xf000;
  91.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  92.                 {
  93.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  94.                         switch(temp)
  95.                         {
  96.                                 case 0xed00:
  97.                                         ucBackValue = 2; break;
  98.                                 case 0xdd00:
  99.                                         ucBackValue = 6; break;
  100.                                 case 0xbd00:
  101.                                         ucBackValue = 10; break;
  102.                                 case 0x7d00:
  103.                                         ucBackValue = 14; break;
  104.                                 default:break;
  105.                 }
  106.                         while(temp!=0xf000)   //等待按键放开
  107.                         {
  108.                                 temp=GPIO_ReadInputData(GPIOB);
  109.                                 temp=temp&0xf000;
  110.                         }
  111.                 }
  112.         }
  113.         //====第3列送0==========
  114.         GPIO_Write(GPIOB,0xfb00);
  115.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  116.         temp=temp&0xf000;    //屏蔽低4位
  117.         if (temp!=0xf000)      //假如高4位不全是1
  118.         {
  119.                 delay_ms(20);      // 延时消抖再读
  120.                 temp=GPIO_ReadInputData(GPIOB);
  121.                 temp=temp&0xf000;
  122.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  123.                 {
  124.                         temp=GPIO_ReadInputData(GPIOB)&0xff00; //读出此次按键的值
  125.                         switch(temp)
  126.                         {
  127.                                 case 0xeb00:
  128.                                 ucBackValue = 3; break;
  129.                                 case 0xdb00:
  130.                                 ucBackValue = 7; break;
  131.                                 case 0xbb00:
  132.                                 ucBackValue = 11; break;
  133.                                 case 0x7b00:
  134.                                 ucBackValue = 15; break;
  135.                                 default:break;
  136.                 }
  137.                 while(temp!=0xf000)   //等待按键放开
  138.                 {
  139.                         temp=GPIO_ReadInputData(GPIOB);
  140.                         temp=temp&0xf000;
  141.                 }
  142.                 }
  143.         }
  144.         //====第4列送0==========
  145.         GPIO_Write(GPIOB,0xf700);
  146.         temp=GPIO_ReadInputData(GPIOB); //读出整个口得到的值
  147.         temp=temp&0xf000;    //屏蔽低4位
  148.         if (temp!=0xf000)      //假如高4位不全是1
  149.         {
  150.                 delay_ms(20);       // 延时消抖再读
  151.                 temp=GPIO_ReadInputData(GPIOB);
  152.                 temp=temp&0xf000;
  153.                 if (temp!=0xf000)     //消抖后如果再次高4位确定不是全1
  154.                 {
  155.                         temp=GPIO_ReadInputData(GPIOB)&0xff00;
  156.                         switch(temp)
  157.                         {
  158.                                 case 0xe700:
  159.                                 ucBackValue = 4; break;
  160.                                 case 0xd700:
  161.                                 ucBackValue = 8; break;
  162.                                 case 0xb700:
  163.                                 ucBackValue = 12; break;
  164.                                 case 0x7700:
  165.                                 ucBackValue = 16; break;
  166.                                 default:break;
  167.                         }
  168.                         while(temp!=0xf000)   //等待按键放开
  169.                         {
  170.                                 temp=GPIO_ReadInputData(GPIOB);
  171.                                 temp=temp&0xf000;
  172.                         }
  173.                 }
  174.         }
  175.         return ucBackValue;
  176. }
复制代码
  1. #ifndef __KEY_H
  2. #define        __KEY_H

  3. #include "stm32f10x.h"


  4. void Key4x4_GPIO_Config(void);
  5. u8 Key_Scan(void);

  6. #endif /* __KEY_H */
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-16 23:24

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表