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

【经验分享】STM32基础实例-按键控制LED

[复制链接]
STMCU小助手 发布时间:2022-6-6 22:59
使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。

    LED和按键的电路图。
    按键 K_LEFT、K_DOWN、K_RIGHT 分别连接在 STM32F1 芯片的 PE2、PE3、PE4引脚上。
    按键另一端是全部接在 GND 上,这个和我们学习 51单片机是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平。
    整个程序实现的流程步骤如下:
  • 初始化按键使用的端口及时钟
  • 按键检测处理
  • 按键控制处理


    工程文件目录如下。
        IO口初始化程序代码在key.c文件中。
  1. 使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。


  2.     LED和按键的电路图。

  3. 图片

  4. 图片

  5.     按键 K_LEFT、K_DOWN、K_RIGHT 分别连接在 STM32F1 芯片的 PE2、PE3、PE4引脚上。

  6.     按键另一端是全部接在 GND 上,这个和我们学习 51单片机是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平,相关实例推荐:按下按键,通过串口发送数据实例。

  7.     整个程序实现的流程步骤如下:

  8. 初始化按键使用的端口及时钟

  9. 按键检测处理

  10. 按键控制处理

  11.     工程文件目录如下。

  12. 图片

  13.         IO口初始化程序代码在key.c文件中。

  14. /***************************************************************
  15. * 函 数 名 : KEY_Init
  16. * 函数功能 : 按键初始化
  17. * 输 入 : 无
  18. * 输 出 : 无
  19. *****************************************************************/
  20. void KEY_Init(void)
  21. {
  22.   GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
  23.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
  24.   GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; //选择你要设置的IO口
  25.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
  26.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
  27.   GPIO_Init(KEY_UP_Port,&GPIO_InitStructure); /* 初始化GPIO */
  28.   GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
  29. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
  30. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  31. GPIO_Init(KEY_Port,&GPIO_InitStructure);
  32. }
  33.     要知道哪个按键被按下,就需要编写按键检测函数,具体代码如下:

  34. /****************************************************************
  35. * 函 数 名 : KEY_Scan
  36. * 函数功能 : 按键扫描检测
  37. * 输 入 : mode=0:单次按下按键
  38.          mode=1:连续按下按键
  39. * 输 出 : 0:未有按键按下
  40. KEY_UP:K_UP 键按下
  41. KEY_DOWN:K_DOWN 键按下
  42. KEY_LEFT:K_LEFT 键按下
  43. KEY_RIGHT:K_RIGHT 键按下
  44. *****************************************************************/
  45. u8 KEY_Scan(u8 mode)
  46. {
  47.   static u8 key=1;
  48.   if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0)) //任意一个按键按下
  49.   {
  50.     delay_ms(10); //消除抖动
  51.     key=0;
  52.     if(K_UP==1)
  53.     {
  54.       return KEY_UP;
  55.     }
  56.     else if(K_DOWN==0)
  57.     {
  58.       return KEY_DOWN;
  59.     }
  60.     else if(K_LEFT==0)
  61.     {
  62.       return KEY_LEFT;
  63.     }
  64.     else
  65.     {
  66.       return KEY_RIGHT;
  67.     }
  68.   }
  69.   else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1) //无按键按下
  70. {
  71.   key=1;
  72. }
  73. if(mode==1) //连续按键按下
  74. {
  75.   key=1;
  76. }
  77.   return 0;
  78. }
  79.     主函数,代码如下:

  80. #include "system.h"
  81. #include "SysTick.h"
  82. #include "led.h"
  83. #include "key.h"
  84. int main()
  85. {
  86.   u8 key;
  87.   SysTick_Init(72);
  88.   LED_Init();
  89.   KEY_Init();

  90. while(1)
  91.   {
  92.     key=KEY_Scan(1);   //Á¬ÐøÉ¨Ãè°´¼ü
  93. if(key)
  94.     {
  95.       led2=0;
  96.       delay_ms(5);//每隔5ms灭一次
  97. if(KEY_Scan(1)!=key)
  98.       {
  99.         led2=!led2;
  100.         delay_ms(5);
  101.       }
  102.     }   
  103.   }
  104. }
复制代码

    要知道哪个按键被按下,就需要编写按键检测函数,具体代码如下:
  1. /****************************************************************
  2. * 函 数 名 : KEY_Scan
  3. * 函数功能 : 按键扫描检测
  4. * 输 入 : mode=0:单次按下按键
  5.          mode=1:连续按下按键
  6. * 输 出 : 0:未有按键按下
  7. KEY_UP:K_UP 键按下
  8. KEY_DOWN:K_DOWN 键按下
  9. KEY_LEFT:K_LEFT 键按下
  10. KEY_RIGHT:K_RIGHT 键按下
  11. *****************************************************************/
  12. u8 KEY_Scan(u8 mode)
  13. {
  14.   static u8 key=1;
  15.   if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0)) //任意一个按键按下
  16.   {
  17.     delay_ms(10); //消除抖动
  18.     key=0;
  19.     if(K_UP==1)
  20.     {
  21.       return KEY_UP;
  22.     }
  23.     else if(K_DOWN==0)
  24.     {
  25.       return KEY_DOWN;
  26.     }
  27.     else if(K_LEFT==0)
  28.     {
  29.       return KEY_LEFT;
  30.     }
  31.     else
  32.     {
  33.       return KEY_RIGHT;
  34.     }
  35.   }
  36.   else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1) //无按键按下
  37. {
  38.   key=1;
  39. }
  40. if(mode==1) //连续按键按下
  41. {
  42.   key=1;
  43. }
  44.   return 0;
  45. }
复制代码

    主函数,代码如下:
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "key.h"
  5. int main()
  6. {
  7.   u8 key;
  8.   SysTick_Init(72);
  9.   LED_Init();
  10.   KEY_Init();

  11. while(1)
  12.   {
  13.     key=KEY_Scan(1);   //Á¬ÐøÉ¨Ãè°´¼ü
  14. if(key)
  15.     {
  16.       led2=0;
  17.       delay_ms(5);//每隔5ms灭一次
  18. if(KEY_Scan(1)!=key)
  19.       {
  20.         led2=!led2;
  21.         delay_ms(5);
  22.       }
  23.     }   
  24.   }
  25. }
复制代码

收藏 评论0 发布时间:2022-6-6 22:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

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