stm32f051按键控制(3)

发布者:SereneNature7最新更新时间:2016-10-10 来源: eefocus关键字:stm32f051  按键控制 手机看文章 扫描二维码
随时随地手机看文章
第3课:按键控制

按键的输入其实就是对GPIO口进行操作。同时引入了中断的概念。实际上按键控制分为两种情况,第一种是按键扫描,这种情况下,CPU需要不停的工作,来判断GPIO口是否被拉低或者置高,效率是比较低的。另一种方式为中断控制,中断控制的效率很高,一旦系统IO口出现上升沿或者下降沿电平就会触发执行中断内的程序。

相信按键是所有接触过MCU的朋友都知道的,其基本原理我就不啰嗦了,这一节的教程主要针对了实验四和实验三。

下面我就来分别介绍下STM32F051的按键控制方式。

首先来学习下按键扫描方式:

硬件准备:

在青风stm32f051开发板上设置了2个用户按键如下图所示:

Key1和Key2分别和PF6和PF7两个IO管脚相连。这里设置了按键管脚加了3.3V的上拉,可以提高驱动能力。当IO管脚为低的时候可以判断管脚已经按下。通过key的按下来控制led的亮灭。

软件准备:

在代码文件中,实验三建立了一个演示历程,我们打开看看需要那些库文件。打开user文件夹中的key工程:

如上图所示:按照上面的方式添加好相应的函数,其中led.c和key.c是用户自己所编写的驱动子文件,用于控制按键和LED灯。Lib库中只需要添加:stm32f0xx_rcc.c和stm32f0xx_gpio.c两个文件。

Led.c和我们第一节所编写的驱动一样,下面我们来看看如何编写key.c文件。Key.c文件主要是要起到两个作用:第一:初始化开发板上的按键。第二:扫描判断按键是否有按下,按键扫描是通过MCU不停的判断端口的状态来实现的。完成这两个功能够就可以在main.c文件中直接调用本驱动了。下面看看代码:

那么在主函数中直接可以调用key,c和led.c两个子文件,代码如下:

那么更加好的按键控制方法是使用中断控制,这样可以大大节省了CPU的占有率。

中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用,这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”。简单的来说就比如某个人正在做某事,突然来了个电话,他就要停下手中的事情去接电话,中断相当于这个电话。触发中断后跳出原来运行的程序去执行中断处理。

软件准备:

在使用stm32f051库函数来完成中断,需要设置如下几个地方:第一:中断嵌套的设置。

第二:外部GPIO中断的设置。 首先是中断嵌套的问题:在stm32f05xx的参考手册第157页有一个中断嵌套列表,列出了各类中断的地址,在库文件stm32f0xx_misc.c里对嵌套进行了设置。并且在stm32f0xx.h文件中给出了中断列表中各类中断的中断频道号,并且封装成IRQn_Type结构体。

我们设置中断的类型只要设置如下结构体的参数就行:

其中NVIC_IRQChannel在stm32f0xx_misc.c里对嵌套进行了设置,NVIC_IRQChannelPriority可以在1到3直接进行设置。 NVIC_IRQChannelCmd频道命令主要是使能和禁能的作用。

第二个问题是外部IO中断的设置,主要是stm32051中断各种外部中断所使用的。在库函数中,在stm32f0xx_exti.c文件中进行了详细设置,我们只需要配置下面一个结构体就可以实现外部中断的控制了:

按照上面的配置要求,我们编写exit.c外部中断子函数,如下面的代码:

其中exit.c就是上面我们编写的按键中断初始化的驱动函数。而Lib树下文件我们之间添加ST公司提供的库函数。这里面,我们需要在stm32f0xx_it.c中加入相应的中断后执行函数,也就是发生按键中断后,我们执行反转LED的命令:

通过上面几个步骤,下面的主函数就相当的简单了,我们直接调用exit.h函数就可以完成按键中断的初始化了。看看下面代码,是不是非常简单不解释:

实验下载到QF-STM32F0开发板后的实验现象如下:

 
 
 
 
 
关键字:stm32f051  按键控制 引用地址:stm32f051按键控制(3)

上一篇:stm32f051(2)系统时钟设置
下一篇:USART发送字符串首字符丢失原因及解决办法

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

mini2440裸机试炼之--按键控制蜂鸣器和LED
根据用户手册和数据手册得到 *************************************************************************************************************************************************************** *****************************************************************************************************************************
[单片机]
mini2440裸机试炼之--<font color='red'>按键</font><font color='red'>控制</font>蜂鸣器和LED
PWM 按键控制灯亮度(改变占空比)
功能说明:PWM,通过改变占空比,PWM_T/100,这里100是周期,每个按键都会给PWM_T一个定值,这样就改变了输出波形。 #include reg52.h sbit P10=P1^0; unsigned char i; void delay(unsigned char n) { unsigned char i,j; for(i=0;i n;i++) for(j=0;j 20;j++); } void ex0() interrupt 0 { i+=10; } void main() { EX0=1; IT0=1; EA=1; i=150; while(1) { P10=0; delay(i); P10
[单片机]
51单片机 矩阵按键控制数码管显示0~F
通过按下4*4矩阵按键让数码管显示对应的数值 #include reg52.h typedef unsigned char u8; typedef unsigned int u16; u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0 1 2 3 4 5 6 7 8 9 A b C d E F u16 key_value; void delay(u16 i) { while(i--); } void keyscan() { P1=
[单片机]
通过按键控制IO口操作
今天对单片机按键有了一定的认识,单片机分为独立式键盘和矩阵式键盘,独立式占用IO口资源比较大,适合按键少的控制操作,其优点是设计编程一目了然,比较简单,矩阵式占用IO口比较少,适合对按键要求比较高而IO口资源比较宝贵的操作,这两者各有其优点和缺点,以后应用时要根据需要进行设计,特别是矩阵式的要利用行线,和列线的高低电平检测和处理数据信息的原理要记住。 下面把今天学的一个简单的通过按键控制IO口LED灯工作的程序写一下,呵呵,可以加深我对按键操作(ELSE语句)的理解。 #include reg52.h #define uint unsigned int #define uchar unsigned char sbit DIPsw
[单片机]
通过<font color='red'>按键</font><font color='red'>控制</font>IO口操作
一键多功能(按键控制LED亮度)
本例子利用主要实现功能,一个按键,控制LED台灯的亮度。上电默认关机,第一次按下,LED全亮,第二次按下,LED亮58%,第三次按下,LED亮47%,第四次按下,LED亮9%。 本例中主要利用模拟PWM进行LED亮度控制。由于考虑成本,所以使用价格低廉,功能单一的单片机(没有中断功能)。所以一切靠模拟。选用 PIC16F505,其实可以用12F508或者12F509,反正8脚的单片机都可以用。RC4接按键,RC2接LED(可以通过扩流去驱动更大概率的 LED负载)。 程序如下: } 利用timer1(uint y)这个函数实际上很好的解决了,利用按键控制PWM调光,RGB渐变等多种状态的转跳。 #include
[单片机]
控制单个单片机IO的按键+定时器10ms定时器程序
/*刚刚开始学习AVR单片机, *把学习到的知识和大家分享。有错误或者更好的写法,欢迎交流。 *方便新手学习,我都尽可能的注释 */ #include iom16v.h #include macros.h #include stdio.h //标准输入输出头文件 #define LED_DDR DDRA //LED接PA0~PA7 #define LED_P0RT PORTA //指示灯 /********************************* *按键定义 *******************************/ #define K1 PINC & (1 P
[单片机]
S3C2410 按键控制LED(中断)
一、开发环境 1、硬件平台:UP-TECH2410DVK1.1 2、主机:PC+eclipse 二、相关原理图 LED1-- GPC5 LED2-- GPC6 LED3-- GPC7 KEY1-- EINIT3 KEY2-- EINIT5 KEY3-- EINIT9 三、基本原理 通过按键的按下而触发中断,从而进行中断处理,进而实现相应功能(如闪烁LED),然后退出中断。 如何判断按键被按下: 以KEY1为例,未按下时,因为EINT3连接的是VDD,所以为高电平,当按键发生,EINT3连接的是GND,接地,此时为低电平。 通过芯片手册可查到EINT3 、5、9连接的为复
[单片机]
S3C2410 <font color='red'>按键</font><font color='red'>控制</font>LED(中断)
四个按键控制的四个流水灯的速度
#define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include //包括一个52标准内核的头文件 sbit K1= P3^1; sbit K2= P3^2; sbit K3= P3^3; sbit K4= P3^4; bit ldelay=0; //长定时溢出标记,预置是0 uchar speed=90; //设置一个变量保存默认的跑马灯的移动速度 char code dx516 _at_ 0x003b;//这是为了仿真设置的 //4个按键4级变速的跑马灯试
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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