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


 

 1 #include "stm32f10x.h"// 相当于51单片机中的  #include <reg51.h>
 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 }

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM