嵌入式02 STM32 实验06 按键
按键实验和前面的跑马灯、蜂鸣器主要的区别就是这个是读取外部的输入信号,之前的实验都是对外部输出信号。
一、硬件设计
本实验的硬件为三个按键、两个lED(LED0、LED1)、一个蜂鸣器(BEEP)。
KEY0控制LED0和LED1开,KEY1控制LED0和LED1关,按键WK_UP控制BEEP。

二、软件设计
1、子函数
//key.h
#ifndef __KEY_H
#define __KEY_H #include "sys.h" #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) //读取按键输入
#define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) //读取按键输入
#define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) //读取按键输入 #define KEY0_DOWN 1
#define KEY1_DOWN 2
#define WK_UP_DOWN 3 void KEY_Init(void); //按键初始化
u8 Key_Value(u8 mode); //获取键值 #endif //key.c
#include "key.h"
#include "stm32f10x.h"
#include "delay.h" void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Structure_KEY; //定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE); //使能时钟 GPIO_Structure_KEY.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Structure_KEY.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //PE.3和PE.4
GPIO_Structure_KEY.GPIO_Speed = GPIO_Speed_50MHz; //频率为50MHz
GPIO_Init(GPIOE, &GPIO_Structure_KEY); //初始化端口 GPIO_Structure_KEY.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
GPIO_Structure_KEY.GPIO_Pin = GPIO_Pin_0; //PA.0
GPIO_Init(GPIOA, &GPIO_Structure_KEY); //初始化端口
} u8 Key_Value(u8 mode)
{
static u8 key_up = ; //mode为1表示支持连续按,0不支持连续按 if(mode)key_up = ;
if(key_up&&(KEY0==||KEY1==||WK_UP==))
{
key_up = ;
delay_ms(); //延时消抖
if(KEY0==)
return KEY0_DOWN;
else if(KEY1==)
return KEY1_DOWN;
else if(WK_UP==)
return WK_UP_DOWN;
}
else if(KEY0==&&KEY1==&&WK_UP==)
key_up = ;
return ;
}
2、主函数
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "beep.h" int main()
{
u8 key;
LED_Init(); //LED初始化
delay_init(); //延时初始化
BEEP_Init(); //蜂鸣器初始化
KEY_Init(); //按键初始化
while()
{
key = Key_Value(); //获取键值,支持连续按
if(key)
{
switch(key)
{
case KEY0_DOWN:
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //打开LED0和LED1
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
break;
case KEY1_DOWN:
GPIO_SetBits(GPIOB, GPIO_Pin_8); //打开蜂鸣器
delay_ms();
GPIO_ResetBits(GPIOB, GPIO_Pin_8); //关闭蜂鸣器
break;
case WK_UP_DOWN:
GPIO_SetBits(GPIOE, GPIO_Pin_5); //关闭所有LED
GPIO_SetBits(GPIOB, GPIO_Pin_5);
break;
}
}
else
delay_ms();
}
}
嵌入式02 STM32 实验06 按键的更多相关文章
- 嵌入式02 STM32 实验08 外部中断
一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家 ...
- 嵌入式02 STM32 实验04跑马灯
开学STM32 跑马灯的实验主要就是了解GPIO口的配置及使用,我这里是使用库函数进行编程,主要需要设置以下两方面: 1.使能需要使用的IO口的时钟,一共有A.B.C.D.E.F.G七组IO口 2.初 ...
- 嵌入式02 STM32 实验11 NVIC和中断总结
一.基础知识 1.cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断 2.STM32只有84个中断,包括16个内核中断和68个可屏蔽中断 3.STM32F103上只有60个 ...
- 嵌入式02 STM32 实验10 定时器中断
优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...
- 嵌入式02 STM32 实验07 串口通信
STM32串口通信(F1系列包含3个USART和2个UART) 一.单片机与PC机串行通信研究目的和意义: 单片机自诞生以来以其性能稳定,价格低廉.功能强大.在智能仪器.工业装备以及日用电子消费产品中 ...
- 嵌入式02 STM32 实验05 蜂鸣器
蜂鸣器:是一种一体化结构的电子讯响器.主要分为分压式蜂鸣器和电磁式蜂鸣器两种类型. 一.有源/无源蜂鸣器(不是指是否带电源,而是有没有自带震荡电路) 1.有源蜂鸣器:有源蜂鸣器自带震荡电路,一通电就会 ...
- 嵌入式02 STM32 实验03 时钟系统
时钟系统是处理器的核心,所以认真学习时钟系统是必要的,有助于深入理解STM32. 由于STM32的外设很多,有的外设不需要太高的时钟频率,同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也越弱,所以对 ...
- 嵌入式02 STM32 实验02 端口输入输出各4种模式
GPIO(General-purpose input/output 通用目的输入/输出端口) 电压(A模拟量)与电平(D数字量) GPIO 8种工作模式(输入四种.输出四种) 1.GPIO_Mode_ ...
- 嵌入式02 STM32 实验01 端口复用和重映射
内设与外设: 端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设? 内设:单片机内部集成的功能一般包括:串口模块.SPI模块(Serial Peripheral Interface ...
随机推荐
- Getting A Mime Type From A File Name In .NET Core
Getting a mime type based on a file name (Or file extension), is one of those weird things you never ...
- NOI2019 回家路线 DP
「NOI2019」回家路线 链接 loj 思路 f[i][j]第i个点,时间为j,暴力转移 复杂度O(m*t),好像正解是斜率优化,出题人太不小心了233 代码 #include <bits/s ...
- 洛谷 P5408 【模板】第一类斯特林数·行
传送门 首先,有 \[ x^{\overline n}=\sum_k\begin{bmatrix}{n\\ k}\end{bmatrix}x^{k}\\ \] 那么我们只需要求出\(x^{\overl ...
- CentOS里下载和离线安装rpm包
离线下载rpm包 yum --downloadonly --downloaddir=/home/packages install mariadb-devel 安装离线rpm包 进入下载包的 ...
- 第01组 团队Git现场编程实战
目录 一.组员职责分工 二.github 的提交日志截图(鼓励小粒度提交) 三.程序运行截图 四.程序运行环境 五.GUI界面 六.基础功能实现 七.鼓励有想法且有用的功能 八.遇到的困难及解决方法 ...
- 日常开发中的shell小技巧
工具推荐 命令行中很方便的代码统计工具---cloc 强大的分屏工具---tmux 最舒服的markdown书写工具---typora markdown图床推荐--七牛云 模拟生成熵(避免暴力手搓键盘 ...
- Django实现自动发布(2视图-服务版本查找和新增)
前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查.先在服务的管理页面做一个入口,如下图: 需要在上一步的服务管理页面增加按钮.按钮方法,点击按钮跳转时要打开一个新的页面,所以 ...
- 《微信小程序商城开发实战》唐磊,全网真实评价截图,不吹不黑,全部来自网友的真实评价
偶尔看了下网友的销量和评价,感觉还不错,因为市面上大多关于小程序的书籍可能写的不够全面,要么只是点到为止的大致罗列,要么就是只简单介绍一下小程序的 界面设计这块.这样很难给学习小程序开发的人一个完成的 ...
- 【java编程】vo、po、dto、bo、pojo、entity、mode如何区分
Java Bean:一种可重用组件,即“一次编写,任何地方执行,任何地方重用”.满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员属性 VO valu ...
- Mac Mini 2014 更换SSD 升级SSD
将自己的Mac Mini 2014版升级成固态硬盘 亲自动手, 还算顺利, 参考网络教程, 并改进了里面的关键步骤, 下面是原文链接 Mac Mini 2014 升级成SSD Mac Mini 拆机图 ...