谷动谷力

 找回密码
 立即注册
查看: 3418|回复: 1
打印 上一主题 下一主题
收起左侧

STM32F103RCT6开发板M3单片机教程04--按键检测

[复制链接]
跳转到指定楼层
楼主
发表于 2021-11-8 23:57:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunsili 于 2023-12-11 21:33 编辑

STM32F103RCT6开发板M3单片机教程04--按键检测


原理图讲解
本教程使用是(光明谷SUN_STM32mini开发板

首先了硬件连接原理,STM32F103RCT6开发板是mini最小系统板,板子在没并有按键。需要自行用面包板搭建。

硬件连接:  

PC10 -> KEY1 (MCU内部上拉) --> GND   (低电平有效)

PC11 -> KEY2(MCU内部上拉) --> GMD    (低电平有效)

程序设计
有两种方法:

方法1、不断检测引脚(PC10, PC11)电平, 当检测到引脚(PC10, PC11)为低电平时,则有按键按下;
方法2、中断检测,设置引脚(PC10, PC11)下降沿触中断,在中断函数里,判断是哪个引脚发生的中断。

编写程序

现在我们用方法1,编写代码。下集我们用中断方法。

  • 复制上节工程文件夹打开(这个方法比较方便)
  • 新建源文件key.c,添加key.c到BSP(Grounp),并编辑
    1. /**********************************************************************************
    2. * 文件名  :key.c
    3. * 描述    :按键扫描(系统滴答时钟SysTick实现扫描延时)
    4. * 实验平台:Sun_STM32Min系统板
    5. * 硬件连接:  PC10 -> KEY1  --> GND   
    6. *             PC11 -> KEY2 --> GMD      
    7. * 库版本  :ST_v3.5

    8. * Version    Date       Auther      Reversed History
    9.   ----------------------------------------------------------------------------
    10.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    11.   
    12. * (C) Sunshine Silicon Corporation
    13. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    14. *  E-Mail : fan@sunsili.com
    15. **********************************************************************************/

    16. #include "key.h"
    17. #include "SysTick.h"

    18. /*******************************************************************************
    19. * 函数名  : Key_GPIO_Config
    20. * 描述    : KEY IO配置
    21. * 输入    : 无
    22. * 输出    : 无
    23. * 返回    : 无
    24. * 说明    : KEY(1~2)的IO口分别是:PC10,PC11
    25. *******************************************************************************/
    26. void Key_GPIO_Config(void)
    27. {
    28.         GPIO_InitTypeDef  GPIO_InitStructure;                                //定义一个GPIO_InitTypeDef类型的GPIO初始化结构体
    29.         
    30.         RCC_APB2PeriphClockCmd(KEY_RCC, ENABLE);                        //使能GPIOA的外设时钟        
    31.         
    32.         GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2;                        //选择要初始化的GPIOA引脚(PA15,PA14)
    33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //设置引脚工作模式为上拉输入                 
    34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHz
    35.         GPIO_Init(KEY_PORT, &GPIO_InitStructure);                        //调用库函数中的GPIO初始化函数,初始化GPIOA中的PA15,PA14引脚
    36. }

    37. /*******************************************************************************
    38. * 函数名  : Key_Detection
    39. * 描述    : 按键按下检测
    40. * 输入    : GPIOx:按键对应的GPIO,GPIO_Pin:对应按键端口
    41. * 输出    : 无
    42. * 返回    : KEY_DOWN(0):对应按键按下,KEY_UP(1):对应按键没按下
    43. * 说明    : KEY(1~2)的IO口分别是:PC10,PC11
    44. *******************************************************************************/
    45. u8 Key_Down_Detection(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
    46. {                        
    47.         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN)        //检测是否有按键按下
    48.         {           
    49.                 Delay_nMs(10);        //延时消抖               
    50.                 if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN)        //检测是否有按键按下   
    51.                 {         
    52.                         while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN);        //等待按键释放  
    53.                         return KEY_DOWN;         
    54.                 }
    55.                 else
    56.                 {
    57.                         return KEY_UP;
    58.                 }
    59.         }
    60.         else
    61.         {
    62.                 return KEY_UP;
    63.         }
    64. }

    65. /*******************************************************************************
    66. * 函数名  : Key_Down_Scan
    67. * 描述    : 按键按下扫描
    68. * 输入    : 无
    69. * 输出    : 0:没有按键按下,1:按键按下
    70. * 返回    : 无
    71. * 说明    : KEY(1~2)的IO口分别是:PC10,PC11
    72. *******************************************************************************/
    73. u8 Key_Down_Scan(void)
    74. {
    75.         u16 downflag=0;
    76.         u8 value=0;

    77.           downflag=GPIO_ReadInputData(KEY_PORT);
    78.         if((downflag & 0x0c00) != 0x0c00)        //检测是否有按键按下
    79.         {           
    80.                 Delay_nMs(10);        //延时消抖        
    81.                 downflag = GPIO_ReadInputData(KEY_PORT) & 0x0c00;        
    82.                 if(downflag != 0x0c00 )        //检测是否有按键按下   
    83.                 {         
    84.                         if((downflag & 0x0400) == 0) value |= 0x01;
    85.                         if((downflag & 0x0800) == 0) value |= 0x02;         
    86.                 }               
    87.         }        

    88.         return value;
    89. }


    90. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    91. ********************        END OF FILE key.c        *******************/
    复制代码

  • 新建源文件key.h,并编辑
    1. /**********************************************************************************
    2. * 文件名  :led.c
    3. * 描述    :led 应用函数库         
    4. * 实验平台:Sun_STM32Min系统板
    5. * 硬件连接:  PA5 -> LED1    板子上没有 要用杜绑线外接
    6. *             PA6 -> LED2   板子上没有 要用杜绑线外接  
    7. *             PA7 -> LED3   板子上没有 要用杜绑线外接
    8. *             PA8 -> LED4   板子有直接观察
    9. * GPIO置低电平亮LED

    10. * 库版本  :ST_v3.5

    11. * Version    Date       Auther      Reversed History
    12.   ----------------------------------------------------------------------------
    13.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    14.   
    15. * (C) Sunshine Silicon Corporation
    16. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    17. *  E-Mail : fan@sunsili.com
    18. **********************************************************************************/

    19. #include "Led.h"
    20.            
    21. /*******************************************************************************
    22. * 函数名  : LED_GPIO_Config
    23. * 描述    : LED IO配置
    24. * 输入    : 无
    25. * 输出    : 无
    26. * 返回    : 无
    27. * 说明    : LED(1~4)的IO口分别是:PB5,PB6,PB7,PB8
    28. *******************************************************************************/
    29. void LED_GPIO_Config(void)
    30. {
    31.         GPIO_InitTypeDef  GPIO_InitStructure;                                //定义一个GPIO_InitTypeDef类型的GPIO初始化结构体
    32.         
    33.         RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);                        //使能GPIOB的外设时钟        
    34.         
    35.         GPIO_InitStructure.GPIO_Pin = LED_ALL;                                //选择要初始化的GPIOB引脚(PB5,PB6,PB7,PB8)
    36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //设置引脚工作模式为通用推挽输出                 
    37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHz
    38.         GPIO_Init(LED_PORT, &GPIO_InitStructure);                        //调用库函数中的GPIO初始化函数,初始化GPIOB中的PB5,PB6,PB7,PB8引脚

    39.         LED_ALL_OFF();                                                                                //关闭ALL_LED                                          
    40. }

    41. /*点亮LED1.PA5*/
    42. void LED1_ON(void)
    43. {
    44.         GPIO_ResetBits(LED_PORT,LED1);
    45. }

    46. /*关闭LED1.PA5*/
    47. void LED1_OFF(void)
    48. {
    49.         GPIO_SetBits(LED_PORT,LED1);
    50. }

    51. /*点亮LED2.PA6*/
    52. void LED2_ON(void)  
    53. {
    54.         GPIO_ResetBits(LED_PORT,LED2);
    55. }

    56. /*关闭LED2.PA6*/
    57. void LED2_OFF(void)
    58. {
    59.         GPIO_SetBits(LED_PORT,LED2);
    60. }

    61. /*点亮LED3.PA7*/
    62. void LED3_ON(void)   
    63. {
    64.         GPIO_ResetBits(LED_PORT,LED3);
    65. }

    66. /*关闭LED3.PA7*/
    67. void LED3_OFF(void)  
    68. {
    69.         GPIO_SetBits(LED_PORT,LED3);
    70. }

    71. /*点亮LED4.PA8*/
    72. void LED4_ON(void)
    73. {
    74.         GPIO_ResetBits(LED_PORT,LED4);
    75. }

    76. /*关闭LED4.PA8*/
    77. void LED4_OFF(void)
    78. {
    79.         GPIO_SetBits(LED_PORT,LED4);
    80. }

    81. /*点亮ALL_LED*/
    82. void LED_ALL_ON(void)
    83. {
    84.         GPIO_ResetBits(LED_PORT,LED_ALL);
    85. }
    86. /*关闭ALL_LED*/
    87. void LED_ALL_OFF(void)  
    88. {
    89.         GPIO_SetBits(LED_PORT,LED_ALL);
    90. }



    91. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    92. ********************        END OF FILE led.c        *******************/
    复制代码

  • 编辑main.c
    1. /**********************************************************************************
    2. * Sun STM32 mini Demo

    3. *   Description
    4.    
    5.     Uart Demo

    6.    
    7. * Version    Date       Auther      Reversed History
    8.   ----------------------------------------------------------------------------
    9.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    10.   
    11. * (C) Sunshine Silicon Corporation
    12. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    13. *  E-Mail : fan@sunsili.com

    14. **********************************************************************************/

    15. #include "stm32f10x.h"
    16. #include "usart.h"
    17. #include "SysTick.h"
    18. #include "led.h"
    19. #include "key.h"
    20. #include <stdio.h>


    21. extern vu8 Usart1_R_Buff[USART1_REC_MAXLEN];        //串口1数据接收缓冲区
    22. extern vu8 Usart1_R_State;                                                //串口1接收状态
    23. extern vu16 Usart1_R_Count;                                                //当前接收数据的字节数         


    24. /*******************************************************************************
    25. * 函数名  : main
    26. * 描述    : 主函数,用户程序从main函数开始运行
    27. * 输入    : 无
    28. * 输出    : 无
    29. * 返回值  : int:返回值为一个16位整形数
    30. * 说明    : 无
    31. *******************************************************************************/
    32. int main(void)
    33. {
    34.     u8 keyVal;
    35.     SysTick_Init_Config();
    36.         USART1_Init_Config(115200);//USART1初始化配置
    37.     LED_GPIO_Config();
    38.     Key_GPIO_Config();
    39.     printf ("*===================================================*\n");
    40.     printf ("*  *  Name: Sun STM32 mini Demo Code.    *************\n");
    41.     printf ("*  * (C) Sunshine Silicon Corporation    *************\n");
    42.     printf ("*  *  Website: http://www.sunsili.com    *************\n");
    43.     printf ("*  *   E-Mail : fan@sunsili.com          *************\n");
    44.     printf ("*===================================================*\n");
    45.     printf ("* Sun STM32 mini Key Demo code .*\n");
    46.    
    47.         while (1)
    48.         {
    49.         keyVal = Key_Down_Scan();
    50.                 if(Usart1_R_State == 1)//一帧数据接收完成
    51.                 {
    52.                         USART1_SendData((u8 *)Usart1_R_Buff, Usart1_R_Count);   //USART1发送数据缓冲区数据(发送刚接收完成的一帧数据)
    53.                         Usart1_R_State =0;
    54.                         Usart1_R_Count =0;
    55.                 }
    56.         if(keyVal)
    57.         {
    58.             printf("KeyVal:%d\r", keyVal);
    59.             if(keyVal & 0x01) LED3_ON();            
    60.             else if(keyVal & 0x02) LED4_ON();            
    61.         }
    62.         else LED_ALL_OFF();
    63.         }
    64. }



    65. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    66. ********************        END OF FILE main.c        *******************/
    复制代码

  • 编译调试
     方法不再重复,经过前两节练习,大家应该是会了.
     连接串口打印,输出按键值。按下按键对应灯会亮。

工程源码
游客,如果您要查看本帖隐藏内容请回复



+10

本帖被以下淘专辑推荐:

回复

使用道具 举报

沙发
发表于 2024-1-24 13:59:01 | 只看该作者
1111111111111111
+10
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-26 18:44 , Processed in 0.092729 second(s), 46 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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