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

STM32基础实例-按键控制LED

[复制链接]
STMCU-管管 发布时间:2021-5-18 15:35
STM32基础实例-按键控制LED



使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。


    LED和按键的电路图。


1.png

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


    按键另一端是全部接在 GND 上,这个和我们学习 51单片机是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平。


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


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


按键检测处理


按键控制处理


    工程文件目录如下。
2.png

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

  1. /***************************************************************
  2. * 函 数 名 : KEY_Init
  3. * 函数功能 : 按键初始化
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void KEY_Init(void)
  8. {
  9.   GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
  11.   GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; //选择你要设置的IO口
  12.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
  13.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
  14.   GPIO_Init(KEY_UP_Port,&GPIO_InitStructure); /* 初始化GPIO */
  15.   GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
  16. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
  17. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  18. GPIO_Init(KEY_Port,&GPIO_InitStructure);
  19. }
复制代码
  要知道哪个按键被按下,就需要编写按键检测函数,具体代码如下:
  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 发布时间:2021-5-18 15:35

举报

0个回答

所属标签

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