当前位置:网站首页>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
边栏推荐
猜你喜欢
UCORE lab1 system software startup process experimental report
Threads et pools de threads
C4D quick start tutorial - Introduction to software interface
JS --- detailed explanation of JS facing objects (VI)
UCORE lab5 user process management experiment report
MySQL development - advanced query - take a good look at how it suits you
Crawler series (9): item+pipeline data storage
Leetcode notes - dynamic planning -day6
The most detailed postman interface test tutorial in the whole network. An article meets your needs
软件测试有哪些常用的SQL语句?
随机推荐
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
C4D quick start tutorial - creating models
Practical cases, hand-in-hand teaching you to build e-commerce user portraits | with code
UCORE LaB6 scheduler experiment report
Should wildcard import be avoided- Should wildcard import be avoided?
[C language] twenty two steps to understand the function stack frame (pressing the stack, passing parameters, returning, bouncing the stack)
Servlet
Capitalize the title of leetcode simple question
LeetCode#62. Different paths
Mysql database (III) advanced data query statement
几款开源自动化测试框架优缺点对比你知道吗?
LeetCode#118. Yanghui triangle
Maximum nesting depth of parentheses in leetcode simple questions
Collection collection and map collection
ucorelab4
Servlet
What is "test paper test" in software testing requirements analysis
Pedestrian re identification (Reid) - Overview
How to change XML attribute - how to change XML attribute
LeetCode#198. raid homes and plunder houses