当前位置:网站首页>STM32学习记录:玩转按键控制蜂鸣器和LED
STM32学习记录:玩转按键控制蜂鸣器和LED
2022-07-06 09:25:00 【Bitter tea seeds】
系列文章目录
STM32F103ZE:正点原子精英板,调用库编写独立按键,控制蜂鸣器和LED。
文章目录
前言
先调用库编写独立按键的控制程序,然后通过提前封装好的位库进行位操作,对蜂鸣器和LED进行编写。
一、对key.c进行编写
看原理图
可以发现,按键KEY_UP在PA0引脚、KEY0在PE4、KEY1在PE3;
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 KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRESS 1
#define KEY1_PRESS 2
#define KEYUP_PRESS 3
void KEY_Init(void);
u8 KEY_Scan(u8);//扫描函数
#endif
2.key.c程序讲解
点开提前封装好的库,找到gpio.c文件
GPIO初始化和RCC使能函数就在gpio.h和rcc.h里,双击打开它俩
找到要使用的函数
GPIO初始化函数
RCC->APB2使能函数
KEY_Init初始化函数程序
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOA、GPIOE
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4;//端口3、4
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉模式
GPIO_Init(GPIOE,&GPIO_InitStruct);//GPIOE初始化
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;//下拉模式
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
可以看到,用到的函数就这俩个,其余都是在这基础上选择“配置”,看传参是什么,就怎么配置就行。
KEY_Scan()按键扫描函数
key_up是静态参数,保持key_up++,mode是形参,它用来决定按键的模式,是连续按键,还是只一按键(仅按一次有效);且mode为0连续,mode为1只一
u8 KEY_Scan(u8 mode)//按键扫描函数
{
static u8 key_up=1;
if(mode)key_up=1;//连续按键
if(key_up&&(KEY0==0||KEY1==0||KEY_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return KEY0_PRESS;
else if(KEY1==0)return KEY1_PRESS;
else if(KEY_UP==1)return KEYUP_PRESS;
}
else if(KEY0==1&&KEY1==1&&KEY_UP==0)key_up=1;
return 0;
}
二、对main.c进行程序编写

1.LED、BEEP定义头文件
LED.h
代码如下(所示):
#ifndef __led_H
#define __led_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
void LED_Init(void);
#endif
BEEP.h
代码如下(所示):
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void BEEP_Init(void); //初始化
#endif
2.main.c
代码如下(所示):
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
int main(void)
{
u8 key=0;
delay_init();
LED_Init();
BEEP_Init();
KEY_Init();
LED0=0;
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case KEYUP_PRESS:BEEP=!BEEP;break;
case KEY1_PRESS:LED1=!LED1;break;
case KEY0_PRESS:LED0=!LED0;LED1=!LED1;break;
}
}else delay_ms(10);
}
}
三、宏定义调用库法
1.key.h头文件
代码如下,所示
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY1_GPIO_PORT GPIOE
#define KEY1_GPIO_PIN GPIO_Pin_3
#define KEY0_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY0_GPIO_PORT GPIOE
#define KEY0_GPIO_PIN GPIO_Pin_4
#define KEY_UP_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY_UP_GPIO_PORT GPIOA
#define KEY__UP_GPIO_PIN GPIO_Pin_0
#define KEY_ON 1
#define KEY_OFF 0
void Key_GPIO_Init(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
#endif
2.key.c编程
代码如下,所示
#include "stm32f10x.h"
#include "key.h"
void Key_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键端口的时钟*/
RCC_APB2PeriphClockCmd(KEY0_GPIO_CLK|KEY1_GPIO_CLK|KEY_UP_GPIO_CLK,ENABLE);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY0_GPIO_PIN;
// 设置按键的引脚为上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//使用结构体初始化按键
GPIO_Init(KEY0_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
//设置按键的引脚为上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//使用结构体初始化按键
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY__UP_GPIO_PIN;
//设置按键的引脚为下拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
//使用结构体初始化按键
GPIO_Init(KEY_UP_GPIO_PORT, &GPIO_InitStructure);
}
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
/*等待按键释放 */
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
3.main.c编程
代码如下,所示
#include "led.h"
#include "key.h"
int main(void)
{
/* LED端口初始化 */
LED_Init();
LED0=0;
/* 按键端口初始化 */
Key_GPIO_Init();
/* 轮流按键状态,若按键按下则反转LED */
/*轮流按下KEY0、KEY1*/
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
/*LED1反转*/
LED1=!LED1;
}
if( Key_Scan(KEY0_GPIO_PORT,KEY0_GPIO_PIN) == KEY_ON )
{
/*LED0反转*/
LED0=!LED0;
}
}
}
四、实验现象
按KEY_UP蜂鸣器开启,再按就关闭,KEY1控制LED1(绿灯)的翻转状态,KEY0控制LED1和LED0的翻转状态。
玩转按键控制蜂鸣器和LED
边栏推荐
- Rearrange spaces between words in leetcode simple questions
- Eigen User Guide (Introduction)
- How to become a good software tester? A secret that most people don't know
- Pedestrian re identification (Reid) - Overview
- ucore lab7
- Introduction to variable parameters
- 自动化测试中敏捷测试怎么做?
- Cadence physical library lef file syntax learning [continuous update]
- Do you know the advantages and disadvantages of several open source automated testing frameworks?
- UCORE lab5 user process management experiment report
猜你喜欢

安全测试入门介绍

Leetcode simple question: check whether two strings are almost equal

ucore lab 2

LeetCode#237. Delete nodes in the linked list

Mysql database (IV) transactions and functions

LeetCode#36. Effective Sudoku

How to build a nail robot that can automatically reply

Lab 8 文件系统

CSAPP homework answers chapter 789

ucore lab6 调度器 实验报告
随机推荐
Brief introduction to libevent
Crawling cat's eye movie review, data visualization analysis source code operation instructions
Interview answering skills for software testing
ucore lab1 系统软件启动过程 实验报告
JS --- all basic knowledge of JS (I)
Mysql database (II) DML data operation statements and basic DQL statements
Introduction to safety testing
STM32 learning record: input capture application
UCORE LaB6 scheduler experiment report
Should wildcard import be avoided- Should wildcard import be avoided?
MySQL数据库(二)DML数据操作语句和基本的DQL语句
Mysql database (I)
Sorting odd and even subscripts respectively for leetcode simple problem
51 lines of code, self-made TX to MySQL software!
Pedestrian re identification (Reid) - Overview
CSAPP homework answers chapter 789
基于485总线的评分系统
Unpleasant error typeerror: cannot perform 'ROR_‘ with a dtyped [float64] array and scalar of type [bool]
Nest and merge new videos, and preset new video titles
Servlet