通過按鍵實現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