当前位置:   article > 正文

第五讲—按键控制LED_汇编语言实现led闪烁和熄灭

汇编语言实现led闪烁和熄灭

目录

前言

一、接线

二、模块化编程

1.写LED部分

LED.c

2.简要介绍GPIO_ReadOutputDataBit函数

LED.h

3.写按键部分

key.c

main.c



前言

前边介绍了些GPIO的相关函数,整合一下,写一个小实验——按键控制LED

一、接线

二、模块化编程

因为该实验涉及到多个外设,全部代码写到一个文件里太乱太杂,也不适于以后直接使用某模块

(因为某些代码比较简单,比如延时函数代码,以后直接用就行)。

1.写LED部分

LED.c

建议在工程文件夹中新建hardware文件夹,以后外设部分都放在hardware里,如图所示:

 先上代码:LED.c

  1. #include "stm32f10x.h" // Device header
  2. void LED_Init()
  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); //上电时保持LED是灭的
  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) //按键按下 如果输出0,置1,否则置0,这样就实现了电平翻转,即GPIO_ReadOutputDataBit函数的意义
  21. {
  22. if(GPIO_ReadOutputDataBit(GPIOB,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(GPIOB,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. }

在LED模块的GPIO初始化中,要先给LED高电平,保证上电时LED是熄灭状态。

2.简要介绍GPIO_ReadOutputDataBit函数

在LED反转电平函数中涉及到了GPIO_ReadOutputDataBit函数,所以下边简单介绍一下该函数:

该函数作用为,读取指定端口管脚的输出

先看函数定义:

  1. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. {
  3. uint8_t bitstatus = 0x00;
  4. /* Check the parameters */
  5. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  6. assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
  7. if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET)
  8. {
  9. bitstatus = (uint8_t)Bit_SET;
  10. }
  11. else
  12. {
  13. bitstatus = (uint8_t)Bit_RESET;
  14. }
  15. return bitstatus;
  16. }

可以看到,该函数和之前SetBits等函数用法并无不同,在此时LED.c中表示:按键按下时,如果输出0,置1,否则置0,这样就实现了电平翻转,这也就是此刻用GPIO_ReadOutputDataBit函数的意义。

LED.h

头文件的定义和51并无不同:

上代码:

  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

3.写按键部分

key.c

上代码:
 

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. //按键的初始化
  4. void key_Init()
  5. {
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  7. GPIO_InitTypeDef GPIO_InitStrucTure;
  8. GPIO_InitStrucTure.GPIO_Mode = GPIO_Mode_IPU; //按键,用上拉
  9. GPIO_InitStrucTure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
  10. GPIO_InitStrucTure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOB,&GPIO_InitStrucTure);
  12. }
  13. //按键检测
  14. uint8_t key_GetNum(void)
  15. {
  16. uint8_t key_Num = 0;
  17. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) //按键按下
  18. {
  19. Delay_ms(20); //按键消抖
  20. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//检测松手,因为按键按下且松手后才有动作
  21. Delay_ms(20); //按键消抖
  22. key_Num = 1;
  23. }
  24. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
  25. {
  26. Delay_ms(20); //按键消抖
  27. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
  28. Delay_ms(20); //按键消抖
  29. key_Num = 2;
  30. }
  31. return key_Num;
  32. }

因为涉及到两个按键,所以在写按键初始化时,结构体子项GPIO_PIN的值为GPIO_Pin_1 | GPIO_Pin_11,采用上拉输入的模式,按键部分也和51一样注意按键消抖的问题,这样按键部分就写完了。

最后,在主函数中调用即可。

main.c

  1. #include "stm32f10x.h" // Device header
  2. #include "LED.h"
  3. #include "key.h"
  4. #include "Delay.h"
  5. uint8_t key_Num;
  6. int main(void)
  7. {
  8. LED_Init();
  9. key_Init();
  10. while(1)
  11. {
  12. key_Num=key_GetNum();
  13. if(key_Num==1)
  14. {
  15. LED1_turn();
  16. }
  17. if(key_Num==2)
  18. {
  19. LED2_turn();
  20. }
  21. }
  22. }

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

闽ICP备14008679号