当前位置:   article > 正文

江科大stm32学习笔记7——按键控制LED_keil按键分组控制led

keil按键分组控制led

接线:

复制粘贴蜂鸣器文件夹,重命名为“3-4 按键控制LED”,新建一个名为“Hardware”的文件夹用于存放硬件驱动文件。

打开keil5,点击三个箱子按钮,在“Groups”中新建一个“Hardware”。

 

再点击魔术棒按钮,在C/C++中选择“Include Paths”,将Hardware的文件路径加入进来。

 

回到keil,右键“Hardware”新建“LED.c”和“LED.h”,注意在新建时记得更改文件路径到“Hardware”文件夹

LED.c:

  1. #include "stm32f10x.h" // Device header
  2. void LED_Init(void)
  3. {
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_Init(GPIOA,&GPIO_InitStructure);
  10. GPIO_SetBits(GPIOA,GPIO_Pin_1 |GPIO_Pin_2);
  11. }
  12. void LED1_ON(void)
  13. {
  14. GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  15. }
  16. void LED1_OFF(void)
  17. {
  18. GPIO_SetBits(GPIOA,GPIO_Pin_1);
  19. }
  20. void LED1_Turn(void)
  21. {
  22. if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)
  23. {
  24. GPIO_SetBits(GPIOA,GPIO_Pin_1);
  25. }
  26. else
  27. {
  28. GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  29. }
  30. }
  31. void LED2_ON(void)
  32. {
  33. GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  34. }
  35. void LED2_OFF(void)
  36. {
  37. GPIO_SetBits(GPIOA,GPIO_Pin_2);
  38. }
  39. void LED2_Turn(void)
  40. {
  41. if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)
  42. {
  43. GPIO_SetBits(GPIOA,GPIO_Pin_2);
  44. }
  45. else
  46. {
  47. GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  48. }
  49. }

 “GPIO_ReadOutputDataBit”是读取GPIO输出端的函数,在“LED1_Turn”中,如果这个端口原来的输出是0,那么将它改变为1;反之亦然。

 LED.h:

  1. #ifndef __LED_H
  2. #define __LED_H
  3. void LED_Init(void);
  4. void LED1_ON(void);
  5. void LED1_OFF(void);
  6. void LED2_ON(void);
  7. void LED2_OFF(void);
  8. void LED1_Turn(void);
  9. void LED2_Turn(void);
  10. #endif

接着仿照上面的步骤新建“Key.c”和“Key.h”

Key.c:

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. void Key_Init(void)
  4. {
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_11;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOB,&GPIO_InitStructure);
  11. }
  12. uint8_t Key_GetNum(void)
  13. {
  14. uint8_t KeyNum = 0;
  15. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
  16. {
  17. Delay_ms(20);
  18. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);
  19. Delay_ms(20);
  20. KeyNum = 1;
  21. }
  22. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
  23. {
  24. Delay_ms(20);
  25. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);
  26. Delay_ms(20);
  27. KeyNum = 2;
  28. }
  29. return KeyNum;
  30. }

 “GPIO_ReadInputDataBit”是用来读取GPIO输入的函数,如果接入按键的引脚读取为0,那么代表按键被按下,此时先Delay20ms消抖,再进入一个while循环,当按键一直按下时就停在这里。当按键弹起时代表整个按压过程结束,再Delay20ms消抖后返回“KeyNum”变量。

Key.h:

  1. #ifndef __KEY_H
  2. #define __KEY_H
  3. void Key_Init(void);
  4. uint8_t Key_GetNum(void);
  5. #endif

 main.c:

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "LED.h"
  4. #include "Key.h"
  5. uint8_t KeyNum;
  6. int main(void)
  7. {
  8. LED_Init();
  9. Key_Init();
  10. while(1)
  11. {
  12. KeyNum = Key_GetNum();
  13. if(KeyNum == 1)
  14. {
  15. LED1_Turn();
  16. }
  17. if(KeyNum == 2)
  18. {
  19. LED2_Turn();
  20. }
  21. }
  22. }

编译运行成功后,即可看到按下哪个按钮,对应的LED改变状态。

版权声明:部分图片来源于网络,仅做教学使用,如有侵权请联系本文作者。  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/685660
推荐阅读
相关标签
  

闽ICP备14008679号