STM32按键控制LED灯亮灭(四)
编程要点:
1)使能GPIO端口时钟;
2)初始化GPIO目标引脚为输入模式(浮空输入);
3)编写简单测试程序,检测按键的状态,实现按键控制LED灯;
bsp_led.h文件
#ifndef T_LED_H_
#define T_LED_H_
#include "stm32f10x.h"
//R-红色
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5
//G-绿色
#define LED2_GPIO_PORT GPIOB
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN GPIO_Pin_0
//B-蓝色
#define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN GPIO_Pin_1
以上代码分别把控制LED灯的GPIO端口,GPIO引脚号以及GPIO端口时钟封装起来了。在实际控制的时候我们就可以直接使用这些宏,以达到应用代码与硬件无关的效果。
/*直接操作寄存器的方法控制IO*/
#define digitalHi(p,i) {p->BSRR=i;}//输出高电平
#define digitalLo(p,i) {p->BRR=i;}//输出低电平
#define digitalToggle(p,i) {p->ODR^=i;}//输出反转状态/*定义控制IO的宏*/
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯反转
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯灭
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯亮#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯反转
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯灭
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯亮#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯反转
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯灭
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯亮//红
#define LED_RED LED1_ON;LED2_OFF;LED3_OFF //红
#define LED_GREEN LED1_OFF;LED2_ON;LED3_OFF //绿
#define LED_BLUE LED1_OFF;LED2_OFF;LED3_ON //蓝
#define LED_YELLOW LED1_ON;LED2_ON;LED3_OFF //黄
#define LED_PURPLE LED1_ON;LED2_OFF;LED3_ON //紫
#define LED_CYAN LED1_OFF;LED2_ON;LED3_ON //青
#define LED_WHITE LED1_ON;LED2_ON;LED3_ON //白
#define LED_RGBOFF LED1_OFF;LED2_OFF;LED3_OFF //黑
void LED_GPIO_Config(void);
#endif /*T_LED_H_*/
bsp_led.c文件:
#include "bsp_led.h"
void LED_GPIO_Config(void)
{ //定义一个GPIO_InitTypeDef类型的结构体变量GPIO_InitTypeDef GPIO_InitStructure;//开启LED相关的GPIO外设时钟RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE); //选择引脚模式为通用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚速率为50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //选择要控制的GPIO引脚GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;//初始化GPIO端口GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); //初始化GPIO引脚GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;//初始化GPIO端口GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);//初始化GPIO引脚GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;//初始化GPIO端口GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);//关灯GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);//关灯GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); //关灯GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}
bsp_key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_PIN GPIO_Pin_13
#define KEY_ON 1
#define KEY_OFF 0
void Key_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
#endif /* __KEY_H */
bsp_key.c文件
#include "bsp_key.h"
void Key_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*开启按键端口的时钟*/RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);//选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; //选择按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);//选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; //选择按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY2_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; }elsereturn KEY_OFF;
}
main.c文件
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h" int main(void)
{ /*LED端口初始化 */LED_GPIO_Config();/*按键初始化*/Key_GPIO_Config();/*查询按键是否按下,若按下LED反转*/while(1) { if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ){/*LED1反转*/LED1_TOGGLE;} if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ){/*LED2反转*/LED2_TOGGLE;} }
}
LED电路连接图
按键电路连接图
程序下载验证:
STM32按键控制LED灯亮灭(四)相关推荐
- 用51单片机实现按键控制LED灯亮灭
用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...
- 【tiny4412】按键控制led灯亮灭
前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果 ...
- STM32中断控制LED灯亮灭
目录 一.中断介绍 1.中断分类 硬件中断(Hardware Interrupt) 软件中断(Software Interrupt) 2.中断优先级 3.中断源种类 4.中断响应原则 二.新建项目 1 ...
- ZYNQ学习笔记(五)---按键控制LED灯亮灭实验
这个实验其实很早就做了,但是由于这段时间自己一直在忙一些其他的事所以没有及时更新.今天抽出个空来更新一下.本次实验是关于按键控制LED亮灭.其中涉及到的内容有计数器.按键消抖以及一些简单的逻辑. 1. ...
- 按键控制led灯亮灭c语言原理,4个独立按键控制4个LED亮灭的单片机程序问题
本帖最后由 ll13536121668 于 2017-11-2 17:32 编辑 4只独立按键控制4只LED亮和灭,按下按键,LED亮,再按下,LED灭.因为我们很多都是按完按键,松开手LED才亮. ...
- CC2530的中断操作----按键控制led灯亮灭
中断使能主要有四个步骤: (1)使.EA 位为 1,开中断. (2)设置寄存器 IEN0.IEN1和IEN2中相应中断使能位为1. (3)如果需要,则设置P0.P1.P2各引脚对应的各中断使能位为1. ...
- 按键控制led灯亮灭c语言实验报告,通过按键控制LED灯的实验
通过查看开发板的核心电路原理图,加上查阅SUMSANG 2440的datasheed得知四个按键K1,K2,K3,K4对应GPF中的GPF1,GPF4,GPF2,GPF0.将这四个引脚配置为输入模式, ...
- 3.按键控制LED灯亮灭
实验现象:本实验通过一个按键来控制一个发光二极管的亮灭.按键按一下LED点亮.再按一下LED熄灭. 理论学习: 该实验主要难点: 如何扫描按键的状态? 如何防抖动? 原理讲解: 按键检测原理:通过把 ...
- 五项按键控制LED灯亮灭
实验需要:CubeMXkeil5STM32F051K8开发板 一.查看实物 1.点灯的引脚配置与文章[使用 CubeMX+Keil5+STM32F051K8 开发实现点亮一盏LED实验] (https ...
最新文章
- ***:***之路的必备技能
- Docker 大势已去,Podman 万岁
- 使用vSphere Web Client导出/导入/还原分布式交换机配置(2034602)
- OKB突破7.2USDT,再创12月新高
- 大数据从入门到就业的四个必备常识
- Python global 语句
- 设置将Maven的jar包发布到lib
- 谈谈可视化编程 (转)
- (三)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 3 数据库应用
- Android开发:设置启动页面
- 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】
- 这种人生最美的场面吸引着千万男孩女孩的憧憬和向往
- 学计算机心得体会50字,阅读心得体会50字
- BUUCTF Misc wp大合集(2)
- rono在oracle的作用_sqlnet.ora的作用
- 黑马程序员_工欲善其事必先利其器
- 预测分析·民宿价格预测baseline
- YEF思想秀:纳须弥于芥子,阐洞见于计算
- jointJS(一)--关于jointJS的初认识
- atm取款机 oracle实战训练_分享一个模拟ATM取款机的DEMO