STM32F103C8T6按键扫描学习笔记(LED和蜂鸣器的控制)
目录
前言
一、按键初始化
1.key.h
2.key.c
二、LED
1.led.h
2.led.c
三、BEEP
1.beep.h
2.beep.c
四、主函数
五、现象
前言
关于STM32F103C8T6按键扫描,由于STM32F103C8T6只有一个复位(RESET)按键,所以我们需要按键和外设。
一、按键初始化
1.key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)//宏定义读取PA1引脚
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//宏定义读取PA2引脚
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//宏定义读取PA3引脚#define KEY0_PRES 1
#define KEY1_PRES 2
#define WKUP_PRES 3void KEY_Init(void);//初始化函数声明
u8 KEY_Scan(u8);//按键扫描函数声明 #endif
2.key.c
#include "stm32f10x.h"
#include "key.h"
#include "delay.h"void KEY_Init(void) //初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;//KEY0,KEY1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉模式(不按按键时 扫描的是高电平)GPIO_Init(GPIOA, &GPIO_InitStructure);//??? WK_UP-->GPIO_Pin_0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //输入下拉模式(不按按键时 扫描的是低电平)GPIO_Init(GPIOA, &GPIO_InitStructure);}//按键扫描函数,有两种模式(1.支持连续按(按住按键不松开) 2.不支持连续按)
u8 KEY_Scan(u8 mode)//mode 模式选择:1为支持连续按 0为不支持连续按
{ static u8 key_up=1;if(mode)key_up=1; if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)){delay_ms(10);//延时函数消抖key_up=0;if(KEY0==0)return KEY0_PRES;else if(KEY1==0)return KEY1_PRES;else if(WK_UP==1)return WKUP_PRES;}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;
}
关于是否支持连续按,我们需要回顾一下关于C语言的相关知识:
static关键字的使用:用简单一点的换来讲,用static来修饰的变量的值具有记忆性,下面我们以两个函数为例:
函数1:
int fun1(){ int a=0;a++;return a;}
函数1中的变量a不具有记忆性,即当函数1被多次调用时,返回值都是1。
函数2:
int fun2(){static int a=0;a++;return a;}
函数2中的变量a时具有记忆性的,即当函数2被多次调用时,变量a的值不会丢失,会一直累加并返回a的值。
那我们再回到按键扫描函数中,之所以能实现不连续按的原理,就是其有一个用static修饰的变量来记忆上一次按键的状态。当按键被按下后,key_up变量记下按下的状态,不支持连续按就是需要用key_up变量记录的上一次按下的状态和当前按下的状态一起做一个判断,只有当上一状态是没有按下且当前状态为按下时,才返回有效值。
二、LED
1.led.h
#ifndef _led_H
#define _led_H
#include "stm32f10x.h"
#define LED0 PBout(5)// LED0的值是PB5的输出
#define LED1 PBout(12)// LED1的值是PB3的输出
void led_Init(void);//函数声明#endif
2.led.c
#include "led.h"void led_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_12);
}
三、BEEP
1.beep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "stm32f10x.h"#define BEEP PBout(8)//BEEP的值为PB8的输出
void BEEP_Init(void);//函数声明#endif
2.beep.c
#include "beep.h"void BEEP_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB,GPIO_Pin_8);}
四、主函数
#include "main.h"int main(void)
{vu8 key=0; Sys_Delay_Init(); led_Init(); KEY_Init(); BEEP_Init(); LED0=1; LED1=0; while(1){key=KEY_Scan(0);if(key){ switch(key){ case WKUP_PRES:BEEP=!BEEP;//BEEP翻转break;case KEY0_PRES:LED0=!LED0;//LED0翻转break;case KEY1_PRES: LED1=!LED1;//LED1翻转break;}}else delay_ms(10); } }
五、现象
三个按键可控制两个LED和一个蜂鸣器,按一次按键LED开/关,蜂鸣器响/不响。
STM32F103C8T6按键扫描学习笔记(LED和蜂鸣器的控制)相关推荐
- c51单片机学习笔记-LED流水灯实验
目的:实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮. 方法:点亮 D1 且把 D2-D8 熄灭,延时一段时间后再点亮 D2 且把 D1. D3-D8 熄灭,延时一段时间后再点亮 D3 ...
- “物联网开发实战”学习笔记-(二)手机控制智能电灯
"物联网开发实战"学习笔记-(二)手机控制智能电灯 如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台. 腾讯云物联网平台 腾讯物联网平台的优 ...
- 【STM32学习笔记-LED呼吸灯】
STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.呼吸灯原理 二.呼吸灯代码 1.main.c 2.led.c 3.led.h 三.代码分析 一.呼吸灯原理 占空比:占 ...
- 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来
摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...
- 操作系统学习笔记-2.1.3进程控制
操作系统学习笔记-2019 王道考研 操作系统-2.1.3进程控制 文章目录 3.进程控制 3.1知识概览 3.2 基本概念 3.2.1什么是进程控制? 3.2.2如何实现进程控制? 3.3进程控制相 ...
- CoppeliaSim学习笔记之差速小车的控制与传感器的驱动
文章目录 1. 控制篇 2. 传感器篇 2.1 里程计仿真 2.2 TF 发布 2.3 激光雷达仿真 2.4 IMU 仿真 上一章节 CoppeliaSim学习笔记之仿真环境与小车模型的搭建 我们 ...
- 小蜜蜂单片机学习总结--led指示灯的基本控制
2019/11/11 LED指示灯的基本控制 根据小蜜蜂单片机学习总结的.....纯属个人瞎写的. 让8路LED指示灯闪烁3遍然后熄灭,接着依次点亮led指示灯,最后依次熄灭指示灯,程序循环实现上述功 ...
- 学习笔记——LED跑马灯
目录 一.任务简述 二.实现方法 三.参考代码 一.任务简述 在CT107D单片机上实现LED的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,最后依次熄灭指示灯,程序循环实 ...
- CT117E 独立按键操作 学习笔记
开发板:国信长天CT117E(STM32F103RBT6) 环 境 :标准库 V3.5 官方LCD模板 软 件 :Keil-MDK 4 文章目录 文章目录: 前言 一.CT117E开发板独立按键 ...
最新文章
- CVPR 2020 oral 首次提出VPSnet用于分割界新问题-视频全景分割
- language mysql_MySql 语言的分类;
- break stop java_在Java中使用break退出循环是不好的做法吗?
- Flutter SliverAnimatedOpacity 透明渐变动画效果
- 基于Java swing实现的学生选课管理系统
- SetTimer函数的使用
- 密码编码学与网络安全讲的是什么
- Freenom免费域名申请
- 微信小程序的推广方案有哪些
- 让 Windows XP 不用输入密码自动登录
- position常用属性值
- 报错:property on ‘HTMLMediaElement‘: The provided double value is non-finite.
- 计算机等级报错等级怎么办,计算机等级考试怎么报两门(计算机等级考试报错了怎么办)...
- 英语日常短语积累(6)-银行考试真题
- 只需一个DOM,纯CSS实现线性跑马灯特效
- a股历史30年的大盘价_中国股市历史图(中国股市30年走势图)
- 让优秀成为一种习惯!
- SQL Server 中,如何获得上个月的第一天和最后一天
- 佳能镜头的英文缩写含义以及镜头昵称
- c语言轰炸机实现原理,B2轰炸机隐身的工作原理