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

STM32——4X4矩形键盘

[复制链接]
STMCU-管管 发布时间:2020-9-17 12:42
4X4矩形键盘


准备

我选用的芯片是STM32F407的芯片,一个4X4的矩形键盘。



我们用杜邦线将键盘和芯片连接起来,因为我选引脚为了插起来方便,我选了以下引脚。





1_meitu_4.jpg





选用了左边的引脚(4-18),这样我们刚好一排8个引脚,接上8根杜邦线。


然后根据硬件原理图,看看分别对应芯片的哪个引脚。



2_meitu_5.jpg





我们不难发现,其中的8个引脚分别是


  1. /*
  2. PD6 PD7 PC6 PC8
  3. PC11 PE5 PA6 PG9
  4. */
复制代码

当你做到这里,你离成功已经不远了。



配置引脚

这八个引脚我们要把他分成两组(上面,我已经分成上下两组,因为这有关获取键盘的数值的原理)。


下面是代码



上面我们就用了库函数把8个引脚都配置好了,下面就是进行扫描。


  1. u16 Key_scan(void)
  2. {
  3.         u16 key_val=100;        //初始化获取值可以自行设置 不设置为0是因为键盘有0
  4.         delay_us(15);
  5.         
  6.         //--------------------------------------scan 1st
  7.         PDout(6) = 0;        PDout(7) = 1;        PCout(6) = 1;        PCout(8) = 1;
  8.                
  9.                         if(PCin(11) == 0)
  10.                         {        
  11.                                 delay_us(15); //消抖
  12.                                 Key_beep();
  13.                                 while(PCin(11) == 0)
  14.                                 delay_us(15); //消抖
  15.                                 key_val = 1;               
  16.                         }
  17.                                 
  18.                         if(PEin(5) == 0)
  19.                         {        
  20.                                 delay_us(15); //消抖
  21.                                 Key_beep();
  22.                                 while(PEin(5) == 0)
  23.                                 delay_us(15); //消抖
  24.                                 key_val = 4;                                
  25.                         }
  26.                         if(PAin(6) == 0)
  27.                         {        
  28.                                 delay_us(15); //消抖
  29.                                 Key_beep();
  30.                                 while(PAin(6) == 0)
  31.                                 delay_us(15); //消抖
  32.                                 key_val = 7;
  33.                         }
  34.                         if(PGin(9) == 0)
  35.                         {
  36.                                 delay_us(15); //消抖
  37.                                 Key_beep();
  38.                                 while(PGin(9) == 0)
  39.                                 delay_us(15); //消抖
  40.                                 key_val = 15;        //*
  41.                         }
  42.                 //--------------------------------------scan 2st
  43.         PDout(6) = 1;        PDout(7) = 0;        PCout(6) = 1;        PCout(8) = 1;
  44.                
  45.                         if(PCin(11) == 0)
  46.                         {        
  47.                                 delay_us(15); //消抖
  48.                                 Key_beep();
  49.                                 while(PCin(11) == 0)
  50.                                 delay_us(15); //消抖
  51.                                 key_val = 2;               
  52.                         }
  53.                                 
  54.                         if(PEin(5) == 0)
  55.                         {        
  56.                                 delay_us(15); //消抖
  57.                                 Key_beep();
  58.                                 while(PEin(5) == 0)
  59.                                 delay_us(15); //消抖
  60.                                 key_val = 5;                                
  61.                         }
  62.                         if(PAin(6) == 0)
  63.                         {        
  64.                                 delay_us(15); //消抖
  65.                                 Key_beep();
  66.                                 while(PAin(6) == 0)
  67.                                 delay_us(15); //消抖
  68.                                 key_val = 8;
  69.                         }
  70.                         if(PGin(9) == 0)
  71.                         {
  72.                                 delay_us(15); //消抖
  73.                                 Key_beep();
  74.                                 while(PGin(9) == 0)
  75.                                 delay_us(15); //消抖
  76.                                 key_val = 0;        
  77.                         }
  78.                         
  79.                         //--------------------------------------scan 3st
  80.         PDout(6) = 1;        PDout(7) = 1;        PCout(6) = 0;        PCout(8) = 1;
  81.                
  82.                         if(PCin(11) == 0)
  83.                         {        
  84.                                 delay_us(15); //消抖
  85.                                 Key_beep();
  86.                                 while(PCin(11) == 0)
  87.                                 delay_us(15); //消抖
  88.                                 key_val = 3;               
  89.                         }
  90.                                 
  91.                         if(PEin(5) == 0)
  92.                         {        
  93.                                 delay_us(15); //消抖
  94.                                 Key_beep();
  95.                                 while(PEin(5) == 0)
  96.                                 delay_us(15); //消抖
  97.                                 key_val = 6;                                
  98.                         }
  99.                         if(PAin(6) == 0)
  100.                         {        
  101.                                 delay_us(15); //消抖
  102.                                 Key_beep();
  103.                                 while(PAin(6) == 0)
  104.                                 delay_us(15); //消抖
  105.                                 key_val = 9;
  106.                         }
  107.                         if(PGin(9) == 0)
  108.                         {
  109.                                 delay_us(15); //消抖
  110.                                 Key_beep();
  111.                                 while(PGin(9) == 0)
  112.                                 delay_us(15); //消抖
  113.                                 key_val = 14;        
  114.                         }
  115.                         
  116.                         //--------------------------------------scan 4st
  117.         PDout(6) = 1;        PDout(7) = 1;        PCout(6) = 1;        PCout(8) = 0;
  118.                
  119.                         if(PCin(11) == 0)
  120.                         {        
  121.                                 delay_us(15); //消抖
  122.                                 Key_beep();
  123.                                 while(PCin(11) == 0)
  124.                                 delay_us(15); //消抖
  125.                                 key_val = 10;               
  126.                         }
  127.                                 
  128.                         if(PEin(5) == 0)
  129.                         {        
  130.                                 delay_us(15); //消抖
  131.                                 Key_beep();
  132.                                 while(PEin(5) == 0)
  133.                                 delay_us(15); //消抖
  134.                                 key_val = 11;                                
  135.                         }
  136.                         if(PAin(6) == 0)
  137.                         {        
  138.                                 delay_us(15); //消抖
  139.                                 Key_beep();
  140.                                 while(PAin(6) == 0)
  141.                                 delay_us(15); //消抖
  142.                                 key_val = 12;
  143.                         }
  144.                         if(PGin(9) == 0)
  145.                         {
  146.                                 delay_us(15); //消抖
  147.                                 Key_beep();
  148.                                 while(PGin(9) == 0)
  149.                                 delay_us(15); //消抖
  150.                                 key_val = 13;        
  151.                         }                        
  152.         return key_val;
  153. }
复制代码


这样我们就完成了4x4键盘的使用,接下来如何使用就看你们了。




收藏 评论1 发布时间:2020-9-17 12:42

举报

1个回答
snriycq 回答时间:2020-9-17 13:18:05

这个是我找到的一个4x4矩形键盘的代码,我觉得写得不错,可以借鉴一下。

  1. #include "keypad.h"
  2. #include "stdint.h"
  3. #include "stm32f4xx_hal.h"
  4. uint16_t Key_scan(void)
  5. {
  6.         uint16_t Key_val = 0;           // 按键扫描返回键值,初始化为0
  7.                                         // 强调一下: 这里必须付一个初值0 否则串口打印出错
  8.         uint16_t temp;
  9.    
  10.         /*=========================以下代码是按键扫描程序=========================*/
  11.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态
  12.        
  13.         /*----------------------------Scan the 1st ROW----------------------------*/
  14.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);   // 设置PD0~2为1
  15.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);                       // 设置PD3为0    二进制编码为 0111
  16.        
  17.     if((GPIOD->IDR & 0xF0) != 0xF0)
  18.     {
  19.                 HAL_Delay(10);   // 10ms延时消抖
  20.                 if((GPIOD->IDR & 0xF0) != 0xF0)
  21.                 {                                                                       
  22.                         temp = (GPIOD->IDR & 0xF7);                                         // GPIOD->IDR寄存器为端口输入数据寄存器
  23.                         switch(temp)                                                        // 用来读取GPIO口的电平状态
  24.                         {
  25.                                 case 0xE7 : Key_val = 1;
  26.                                 break;
  27.                                 case 0xD7 : Key_val = 2;
  28.                                 break;
  29.                                 case 0xB7 : Key_val = 3;
  30.                                 break;
  31.                                 case 0x77 : Key_val = 4;
  32.                                 break;
  33.                                 default  : Key_val = 0; break;
  34.                         }
  35.                 }
  36.     }
  37.        
  38.        
  39.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
  40.         /*----------------------------Scan the 2nd ROW----------------------------*/
  41.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);   
  42.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                       
  43.        
  44.     if((GPIOD->IDR & 0xF0) != 0xF0)
  45.     {
  46.                 HAL_Delay(10);   // 10ms延时消抖
  47.                 if((GPIOD->IDR & 0xF0) != 0xF0)
  48.                 {
  49.                         temp = (GPIOD->IDR & 0xFB);
  50.                         switch(temp)
  51.                         {
  52.                                 case 0xEB : Key_val = 5;
  53.                                 break;
  54.                                 case 0xDB : Key_val = 6;
  55.                                 break;
  56.                                 case 0xBB : Key_val = 7;
  57.                                 break;
  58.                                 case 0x7B : Key_val = 8;
  59.                                 break;
  60.                                 default  : Key_val = 0; break;
  61.                         }
  62.                 }
  63.     }
  64.        
  65.        
  66.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
  67.         /*----------------------------Scan the 3rd ROW----------------------------*/
  68.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
  69.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);                       
  70.        
  71.     if((GPIOD->IDR & 0xF0) != 0xF0)
  72.     {
  73.                 HAL_Delay(10);   // 10ms延时消抖
  74.                 if((GPIOD->IDR & 0xF0) != 0xF0)
  75.                 {
  76.                         temp = (GPIOD->IDR & 0xFD);
  77.                         switch(temp)
  78.                         {
  79.                                 case 0xED : Key_val = 9;
  80.                                 break;
  81.                                 case 0xDD : Key_val = 10;
  82.                                 break;
  83.                                 case 0xBD : Key_val = 11;
  84.                                 break;
  85.                                 case 0x7D : Key_val = 12;
  86.                                 break;
  87.                                 default   : Key_val = 0; break;
  88.                         }
  89.                 }
  90.     }
  91.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
  92.         /*----------------------------Scan the 4th ROW----------------------------*/
  93.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
  94.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);                       
  95.        
  96.     if((GPIOD->IDR & 0xF0) != 0xF0)
  97.     {
  98.                 HAL_Delay(10);   // 10ms延时消抖
  99.                 if((GPIOD->IDR & 0xF0) != 0xF0)
  100.                 {
  101.                         temp = (GPIOD->IDR & 0xFE);
  102.                         switch(temp)
  103.                         {
  104.                                 case 0xEE : Key_val = 13;
  105.                                 break;
  106.                                 case 0xDE : Key_val = 14;
  107.                                 break;
  108.                                 case 0xBE : Key_val = 15;
  109.                                 break;
  110.                                 case 0X7E : Key_val = 16;
  111.                                 break;
  112.                                 default  : Key_val = 0; break;
  113.                         }
  114.                 }
  115.     }
  116.        
  117.         return Key_val;
  118. }
复制代码


所属标签

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