通过按键实现LED灯的亮灭(含两种情况)

发布时间: 2024-08-14
来源: 电子工程世界

 1 #include 'stm32f10x.h'// 相当于51单片机中的  #include

 2 #include 'stm32f10x_gpio.h'

 3 /*通过按键实现LED灯的亮灭

 4 *本项目是两个效果,烧程序时注意分开!!!!!

 5 *1、LED实现的效果实是K1一直按下LED一直亮,直到K1松开LED熄灭

 6 *2、按一下key实现LED亮,再按一下实现LED灭

 7 *

 8 */

 9 

10 /*配置GPIO

11 *step1配置时钟

12 *结构体:Speed、Mode、Pin

13 *初始化

14 */

15 int main(void)

16 {

17     //点亮红色灯

18     //step1:使能

19     

20     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

21     //结构体

22     GPIO_InitTypeDef a;

23     a.GPIO_Speed=GPIO_Speed_50MHz;

24     a.GPIO_Pin=GPIO_Pin_5;

25     //推挽输出

26     a.GPIO_Mode=GPIO_Mode_Out_PP;

27     //调用GPIO初始化函数

28     GPIO_Init(GPIOB,&a);

29     //设置PB5为低点平

30     //GPIO_ResetBits(GPIOB,GPIO_Pin_5);

31     //GPIO_SetBits(GPIOB,GPIO_Pin_5);

32     

33     

34     

35     /**************按键初始*************/

36     

37     //step1:时钟使能

38     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

39     //step2:定义GPIO初始化结构体变量

40     GPIO_InitTypeDef b;

41     b.GPIO_Speed=GPIO_Speed_50MHz;

42     b.GPIO_Pin=GPIO_Pin_0;

43     //浮空输入

44     b.GPIO_Mode=GPIO_Mode_IN_FLOATING;

45     //stept3:调用GPIO初始化函数

46     GPIO_Init(GPIOA,&b);

47 /************************1********************************/

48 /*

49 *知识点:读取电平的函数:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);

50 *详细见后面截图

51 */

52 

53         /*LED实现的效果实是K1一直按下LED一直亮,直到K1松开LED熄灭*/

54         

55     while(1)//死循环随时检测按键的情况

56     {

57             //读取引脚的点平并赋值给i

58         int i = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);

59         if(i==0)//判断K1的电平是否为0

60         {

61                 //为0时,设置PB5为高电平,

62             GPIO_SetBits(GPIOB,GPIO_Pin_5);

63         }

64         else

65         {

66             

67                 //设置PB5为低点平

68             GPIO_ResetBits(GPIOB,GPIO_Pin_5);

69         }

70     }

71     

72 

73 /***************************2*********************************/

74 /*********以下代码实现按键按一下LED亮,再按以下LED灭*********/

75     int pre=0;//上一次循环按键的点平

76     while(1)

77     {

78         //读取引脚的点平

79         int states = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);

80         if(states==0&&pre==1)//states是循环时检测的电平,难点在这???????????

81         {

82             //按键刚松开那一刻,states马上变为0,但是上一次循环中给pre赋的值还是1

83             if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)//再判断是否为低电平

84             {

85                 //给GPIOB端口5赋值为高电平,实现LED亮

86                 GPIO_SetBits(GPIOB,GPIO_Pin_5);

87             }

88             else

89             {

90                 //给GPIOB端口5赋值为低电平,实现LED灭

91                     GPIO_ResetBits(GPIOB,GPIO_Pin_5);

92             }

93         }

94         pre=states;//把本次循环按键的电平赋值给上一次

95     }

96 /*******************************************************************/    

97 }

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。