目录

前言

一、按键初始化

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和蜂鸣器的控制)相关推荐

  1. c51单片机学习笔记-LED流水灯实验

    目的:实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮. 方法:点亮 D1 且把 D2-D8 熄灭,延时一段时间后再点亮 D2 且把 D1. D3-D8 熄灭,延时一段时间后再点亮 D3 ...

  2. “物联网开发实战”学习笔记-(二)手机控制智能电灯

    "物联网开发实战"学习笔记-(二)手机控制智能电灯 如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台. 腾讯云物联网平台 腾讯物联网平台的优 ...

  3. 【STM32学习笔记-LED呼吸灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.呼吸灯原理 二.呼吸灯代码 1.main.c 2.led.c 3.led.h 三.代码分析 一.呼吸灯原理 占空比:占 ...

  4. 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来

    摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...

  5. 操作系统学习笔记-2.1.3进程控制

    操作系统学习笔记-2019 王道考研 操作系统-2.1.3进程控制 文章目录 3.进程控制 3.1知识概览 3.2 基本概念 3.2.1什么是进程控制? 3.2.2如何实现进程控制? 3.3进程控制相 ...

  6. CoppeliaSim学习笔记之差速小车的控制与传感器的驱动

    文章目录 1. 控制篇 2. 传感器篇 2.1 里程计仿真 2.2 TF 发布 2.3 激光雷达仿真 2.4 IMU 仿真   上一章节 CoppeliaSim学习笔记之仿真环境与小车模型的搭建 我们 ...

  7. 小蜜蜂单片机学习总结--led指示灯的基本控制

    2019/11/11 LED指示灯的基本控制 根据小蜜蜂单片机学习总结的.....纯属个人瞎写的. 让8路LED指示灯闪烁3遍然后熄灭,接着依次点亮led指示灯,最后依次熄灭指示灯,程序循环实现上述功 ...

  8. 学习笔记——LED跑马灯

    目录 一.任务简述 二.实现方法 三.参考代码 一.任务简述 在CT107D单片机上实现LED的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,最后依次熄灭指示灯,程序循环实 ...

  9. CT117E 独立按键操作 学习笔记

    开发板:国信长天CT117E(STM32F103RBT6) 环  境 :标准库 V3.5  官方LCD模板 软  件 :Keil-MDK 4 文章目录 文章目录: 前言 一.CT117E开发板独立按键 ...

最新文章

  1. CVPR 2020 oral 首次提出VPSnet用于分割界新问题-视频全景分割
  2. language mysql_MySql 语言的分类;
  3. break stop java_在Java中使用break退出循环是不好的做法吗?
  4. Flutter SliverAnimatedOpacity 透明渐变动画效果
  5. 基于Java swing实现的学生选课管理系统
  6. SetTimer函数的使用
  7. 密码编码学与网络安全讲的是什么
  8. Freenom免费域名申请
  9. 微信小程序的推广方案有哪些
  10. 让 Windows XP 不用输入密码自动登录
  11. position常用属性值
  12. 报错:property on ‘HTMLMediaElement‘: The provided double value is non-finite.
  13. 计算机等级报错等级怎么办,计算机等级考试怎么报两门(计算机等级考试报错了怎么办)...
  14. 英语日常短语积累(6)-银行考试真题
  15. 只需一个DOM,纯CSS实现线性跑马灯特效
  16. a股历史30年的大盘价_中国股市历史图(中国股市30年走势图)
  17. 让优秀成为一种习惯!
  18. SQL Server 中,如何获得上个月的第一天和最后一天
  19. 佳能镜头的英文缩写含义以及镜头昵称
  20. c语言轰炸机实现原理,B2轰炸机隐身的工作原理

热门文章

  1. 解构电商产品——订单系统
  2. js如何精确判断是否是数组?
  3. 排名算法(二)--淘宝搜索排序算法分析
  4. 【加密】DES加密算法中,ECB和CBC模式有什么区别?
  5. 有趣的流言称英特尔将收购AMD,这2家公司才是英特尔更好的目标
  6. JS 进阶: 深入理解键盘事件 Keyboard Event
  7. WordPress 网站漏洞扫描 wpscan Kali Linux
  8. 前端之body标签中相关标签(一)
  9. (转)閱讀的未來 | 數位出版
  10. 蚂蚁金服、微众银行、度小满都来了,智能金融将何去何从?(文末福利)