嵌入式STM32學習筆記之按鍵查詢方式控制led燈的亮滅


        其實接觸STM32已經快半年了,端斷續續的也學習了一下的STM32的各個模塊的基本功能,剛開始的時候也是看比人的寫的代碼,看懂了然后再去修改,能夠在自己的平台上實現基本的功能,也就是到現在才能真正的按照自己的想法來實現寫功能,在本文中我將介紹下比較經典的按鍵驅動程序的實現方式--查詢,當然中斷方式的應用也比較廣泛,在此先不做介紹了。

     首先我的硬件平台是奮斗版STM32,之所以選擇這款開發版是因為板子提供了許多關於ucos和ucgui的例程,想往這方面發展的童鞋可以考慮哦,呵呵,不多說了,開發板帶的芯片型號是STM32F103VET6: 64K 片內SRAM,512K 片內FALSH.

     本文所用到的外設:3個led以及4個按鍵,基本功能就是開發板上電3個led點亮,按下按鍵1時led滅,按下按鍵2時led2熄滅,按下按鍵3時led3熄滅,通過查詢方式來獲取鍵值

     接口設置情況:led燈: V6-PB5--LED1
                                            V7-PD6--LED2
                                            V8-PD3--LED3

                                 按鍵:K1--PC5
                                            K2--PC2
                                            K3--PC3
                                            K4--PE6  

函數部分:首先是主函數:

int main(void)
{
                 TYPEDEF_KEY key = KEY_NULL; 


                 RCC_Configuration();       //系統時鍾配置
                 LED_Config();                   //LED控制配置
                 Key_Config();

                 LED1_ON;                     //開發板上電之后3個LED亮,這里是用宏定義的方式來寫的:

                                                       //#define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_5); //PB5置1  點亮LED1
                 LED2_ON;                   
                 LED3_ON;
   
  
              while (1)
             {  
                     key = GetKey();          //獲取鍵值
                      if(key == KEY_1)
                     {
                                  LED1_OFF;   //按鍵1被按下 在按鍵釋放后LED滅
                     }
                     if(key == KEY_2)
                     {
                                 LED2_OFF;
                     }
                     if(key == KEY_3)
                     {
                                  LED3_OFF;
                     }
                     if(key == KEY_4)
                    {
                                 LED1_ON;      //按鍵4被按下,在按鍵釋放后3個LED全部點亮
                                 LED2_ON;
                                 LED3_ON;
                    }
                   Delay(10);
         }
}

 

接着就是LED的配置函數:                  

void LED_Config(void)
{
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);//外設時鍾使能 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                        //LED1   
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽輸出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //口線翻轉速度為50MHz
      GPIO_Init(GPIOB, &GPIO_InitStructure);    

 

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;   //LED2, LED3 

      GPIO_Init(GPIOD, &GPIO_InitStructure);
}

接着就是按鍵的配置函數:4個按鍵配置為上拉輸入模式

void Key_Config(void)
{
                  GPIO_InitTypeDef GPIO_InitStructure;

                  RCC_APB2PeriphClockCmd(KEY1_PORT_APB2Periph, ENABLE);     
                  GPIO_InitStructure.GPIO_Pin   = KEY1_PIN;    //#define KEY1_PIN GPIO_Pin_5
                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU; //上拉輸入
                  GPIO_Init(KEY1_PORT, &GPIO_InitStructure);     //#define KEY1_PORT GPIOC

                 RCC_APB2PeriphClockCmd(KEY2_PORT_APB2Periph, ENABLE);     
                 GPIO_InitStructure.GPIO_Pin   = KEY2_PIN;
                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
                 GPIO_Init(KEY2_PORT, &GPIO_InitStructure);

                 RCC_APB2PeriphClockCmd(KEY3_PORT_APB2Periph, ENABLE);     
                GPIO_InitStructure.GPIO_Pin   = KEY3_PIN;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
                GPIO_Init(KEY3_PORT, &GPIO_InitStructure);

                RCC_APB2PeriphClockCmd(KEY4_PORT_APB2Periph, ENABLE);     
                GPIO_InitStructure.GPIO_Pin   = KEY4_PIN;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
                GPIO_Init(KEY4_PORT, &GPIO_InitStructure);

查詢方式獲取鍵值函數:

TYPEDEF_KEY GetKey(void)
{
                  TYPEDEF_KEY key = KEY_NULL;  
                  if( GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0 ||  GPIO_ReadInputDataBit(KEY2_PORT,  KEY2_PIN) == 0 || GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0 || GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0)     //有鍵按下
                {
                           Delay(10000);   //去抖動   
                          if(GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0)
                         {
                                    key = KEY_1;
                         }
                        else if(GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0)
                        {
                                    key = KEY_2;
                        }
                       else if(GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0)
                       {
                                    key = KEY_3;
                        }
                      else if(GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0)
                     {
                                   key = KEY_4;
                     }  
                    else
                     {
                                     return(KEY_NULL);
                     }        
                    while(GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0 ||  GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0 || GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0 || GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0)//等待鍵抬起
                    {
                                     Delay(20);   
                    }             
                    return(key);     
           } 
 return(KEY_NULL);   
}

枚舉類型:按鍵值

typedef enum
{
 KEY_1, KEY_2, KEY_3, KEY_4, KEY_NULL = 0xff,
}TYPEDEF_KEY;

 創客學院全新視頻盡在:www.makeru.com.cn

嵌入式學習交流群:561213221


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM