当前位置:网站首页>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
边栏推荐
- How to do agile testing in automated testing?
- Servlet
- Sorting odd and even subscripts respectively for leetcode simple problem
- JS --- all knowledge of JS objects and built-in objects (III)
- Example 071 simulates a vending machine, designs a program of the vending machine, runs the program, prompts the user, enters the options to be selected, and prompts the selected content after the use
- ucore lab8 文件系统 实验报告
- 遇到程序员不修改bug时怎么办?我教你
- MySQL transactions
- Dlib detects blink times based on video stream
- LeetCode#19. Delete the penultimate node of the linked list
猜你喜欢
软件测试有哪些常用的SQL语句?
ucore Lab 1 系统软件启动过程
The number of reversing twice in leetcode simple question
ucore lab7 同步互斥 实验报告
如何成为一个好的软件测试员?绝大多数人都不知道的秘密
JS --- detailed explanation of JS facing objects (VI)
Mysql database (I)
Threads and thread pools
STM32学习记录:输入捕获应用
The wechat red envelope cover designed by the object is free! 16888
随机推荐
自动化测试你必须要弄懂的问题,精品总结
MySQL数据库(五)视 图 、 存 储 过 程 和 触 发 器
ucore lab 6
LeetCode#237. Delete nodes in the linked list
Knowledge that you need to know when changing to software testing
CSAPP homework answers chapter 789
Sorting odd and even subscripts respectively for leetcode simple problem
In Oracle, start with connect by prior recursive query is used to query multi-level subordinate employees.
A method and implementation of using VSTO to prohibit excel cell editing
软件测试需求分析之什么是“试纸测试”
CSAPP Shell Lab 实验报告
C4D quick start tutorial - Introduction to software interface
ucore lab 2
UCORE lab5 user process management experiment report
软件测试面试回答技巧
Report on the double computer experiment of scoring system based on 485 bus
MySQL数据库(二)DML数据操作语句和基本的DQL语句
LeetCode#204. Count prime
Should wildcard import be avoided- Should wildcard import be avoided?
Pedestrian re identification (Reid) - data set description market-1501