STM32学习笔记之按键查询方式控制led灯的亮灭

发布者:Asawen最新更新时间:2018-07-21 来源: eefocus关键字: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;

 


关键字:STM32  按键查询方式  控制led灯 引用地址:STM32学习笔记之按键查询方式控制led灯的亮灭

上一篇:按键点亮LED灯
下一篇:STM32 实战 按键点亮LED(中断)

推荐阅读最新更新时间:2024-03-16 16:09

STM32 中断时间计算
定时中断发生的时间T: T = (arr+1)*(psc+1)/72M T=1/f 32的tclk已知 我们可以直接用这个tclk 去除我们设定的分频系数(psc+1) 也就是把tclk 分成了(psc+)份 这个分频系数的范围在1~65535 这样得到tclk/(psc+1)也就得到了定时器最终的频率 我们在倒过来 得到我们的周期(psc+1)/tclk 在乘上我们的装载值 也就得到我们想要的时间了 例
[单片机]
<font color='red'>STM32</font> 中断时间计算
STM32-SPI的NSS详解
区分开内部NSS和NSS外部引脚的区别,内部NSS的电平状态决定了设备的主从模式,内部NSS状态可以由NSS外部引脚控制,也可以由控制寄存器的SSI位控制。 内部NSS决定了主模式还是从模式,它可以通过设置SSM位选择硬件管理或是软件管理,如下图。 NSS外部引脚,主要作为输入引脚。如果是硬件管理(SSM=0),则当NSS引脚为低电平的时候,NSS状态为从模式,否则为主模式;如果是软件管理(SSM=1),内部NSS则由SSI位决定,STM设置NSS引脚的软件管理是为了可以将NSS引脚空出来,像普通IO引脚运用。 外部NSS引脚可以作为主设备的输出引脚(SSOE=1),此时主设备拉低外部NSS引脚,使其连接上的硬件模式(
[单片机]
STM32-SPI的NSS详解
STM32 基础系列教程 18 – IWDG
前言 学习stm32 独立看门狗(IWDG)接口使用,学会用STM32内部独立看门狗(IWDG)实现程序异常时自复位功能。 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完
[单片机]
<font color='red'>STM32</font> 基础系列教程 18 – IWDG
STM32 学习笔记——GPIO口控制
在配置STM32外设的时候,任何都要先使能该外设的时钟!PB2ENR 是 APB2总线上的外设时钟使能寄存器 我们要使能的PORTA和PORTD的时钟使能位,分别在的时钟使能位,分别在bit2和bit5,只要将这两位置1就可以使能PORTA和PORTD了 STM32的每个IO端口都有7个寄存器来控制。 他们分别是:配置模式的2个32位的端口配置寄存器 CRL 和 CRH;2个32位的数据寄存器IDR 和 ODR ;1个32位的置 复位寄存器 BSRR ;一个 16 位的复寄存器 位的复寄存器 BRR ;1个 32 位的 锁存 寄存器 LCKR ; 这里我们仅介绍常用 的 几个寄存器,我们常用的 IO 端口寄存器只有 4
[单片机]
如何使用STM32中的assert_param
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义; 在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3, 则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。 它确实在程序的运行上牺牲了效率(但只是在调
[单片机]
STM32掌机教程7,演奏音乐
使用定时器来计算时间   在电子琴这节中,我们已经讲述了蜂鸣器的原理,知道如何用蜂鸣器演示不同音调的音乐,本节改进根据频率计算周期的方法,改为定时器,精确度更高,且不再阻塞CPU。   首先,我们不再把蜂鸣器的控制引脚PB1作为普通IO,而是作为定时器的通道。在IO的初始化中,不应当继续操作PB1。通过查看数据手册,可以知道,PB1可以作为定时器3的通道4。(当然也可以作为定时器1和定时器8的通道,只不过定时器1和8是高级定时器,用起来稍微复杂一点点)。 通道的概念类似于道路。   然后编写初始化函数。这段初始化函数可能比较复杂,我们暂时无需深究,只需要知道,这个定时器做了这么一件事情: 把原先这样的代码延时,交给了定时器自
[单片机]
<font color='red'>STM32</font>掌机教程7,演奏音乐
STM32 串口通信实验
一,串口操作相关库函数: 获取状态标志位函数-操作USART_SR寄存器 // 获取状态标志位 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); // 清除状态标志位 void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); // 获取中断状态标志位 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); // 清除中断状态标志位 void USART_ClearITPe
[单片机]
<font color='red'>STM32</font> 串口通信实验
STM32引脚模式GPIOMode_TypeDef
① 浮空输入_IN_FLOATING //串口输入 ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP //置位 ⑦ 复用功能的推挽输出_AF_PP //串口输出 ⑧ 复用功能的开漏输出_AF_OD 推挽输出与开漏输出的区别 推挽输出:可以输出高,低电平,连接数字器件; 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved