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;

 

 

 

 

 

 

 

 
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是一款基于ARM Cortex-M系列内核的32位微控制器,可用于开发嵌入式系统。按键中断和LED亮灭是嵌入式系统中非常常见的功能,下面我将用300字回答如何使用STM32按键中断控制LED亮灭。 首先,我们需要连接一个按键和一个LEDSTM32控制器的相应引脚上。假设按键连接到PA0引脚,LED连接到PC13引脚。 接下来,我们需要配置STM32的GPIO外设来控制这些引脚。首先,开启相关引脚的时钟。然后,将PA0引脚配置为输入模式,PC13引脚配置为输出模式。可以使用STM32的寄存器或者开发环境提供的库函数来完成这些配置。 然后,我们需要配置外部中断。配置PA0引脚所对应的外部中断线,使其可以检测到按键的状态变化。可以使用STM32的寄存器或者库函数来完成这个配置。 紧接着,我们编写中断处理函数。当按键状态发生变化,中断触发时,中断处理函数被调用。在该函数中,我们可以读取按键引脚的状态,如果按键按下,我们将PC13引脚设置为高电平,LED起;如果按键被释放,我们将PC13引脚设置为低电平,LED。 最后,我们需要在主函数中启用中断。启用中断后,当按键状态发生变化时,中断处理函数将被调用。 以上就是使用STM32按键中断来控制LED亮灭的步骤。通过配置GPIO外设和外部中断,编写中断处理函数,我们能够实现按下按键时,LED起;释放按键时,LED的功能。这样就完成了按键中断控制LED亮灭的任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值