编程要点:

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灯亮灭(四)相关推荐

  1. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

  2. 【tiny4412】按键控制led灯亮灭

    前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果 ...

  3. STM32中断控制LED灯亮灭

    目录 一.中断介绍 1.中断分类 硬件中断(Hardware Interrupt) 软件中断(Software Interrupt) 2.中断优先级 3.中断源种类 4.中断响应原则 二.新建项目 1 ...

  4. ZYNQ学习笔记(五)---按键控制LED灯亮灭实验

    这个实验其实很早就做了,但是由于这段时间自己一直在忙一些其他的事所以没有及时更新.今天抽出个空来更新一下.本次实验是关于按键控制LED亮灭.其中涉及到的内容有计数器.按键消抖以及一些简单的逻辑. 1. ...

  5. 按键控制led灯亮灭c语言原理,4个独立按键控制4个LED亮灭的单片机程序问题

    本帖最后由 ll13536121668 于 2017-11-2 17:32 编辑 4只独立按键控制4只LED亮和灭,按下按键,LED亮,再按下,LED灭.因为我们很多都是按完按键,松开手LED才亮. ...

  6. CC2530的中断操作----按键控制led灯亮灭

    中断使能主要有四个步骤: (1)使.EA 位为 1,开中断. (2)设置寄存器 IEN0.IEN1和IEN2中相应中断使能位为1. (3)如果需要,则设置P0.P1.P2各引脚对应的各中断使能位为1. ...

  7. 按键控制led灯亮灭c语言实验报告,通过按键控制LED灯的实验

    通过查看开发板的核心电路原理图,加上查阅SUMSANG 2440的datasheed得知四个按键K1,K2,K3,K4对应GPF中的GPF1,GPF4,GPF2,GPF0.将这四个引脚配置为输入模式, ...

  8. 3.按键控制LED灯亮灭

    实验现象:本实验通过一个按键来控制一个发光二极管的亮灭.按键按一下LED点亮.再按一下LED熄灭. 理论学习: 该实验主要难点: 如何扫描按键的状态? 如何防抖动?  原理讲解: 按键检测原理:通过把 ...

  9. 五项按键控制LED灯亮灭

    实验需要:CubeMXkeil5STM32F051K8开发板 一.查看实物 1.点灯的引脚配置与文章[使用 CubeMX+Keil5+STM32F051K8 开发实现点亮一盏LED实验] (https ...

最新文章

  1. ***:***之路的必备技能
  2. Docker 大势已去,Podman 万岁
  3. 使用vSphere Web Client导出/导入/还原分布式交换机配置(2034602)
  4. OKB突破7.2USDT,再创12月新高
  5. 大数据从入门到就业的四个必备常识
  6. Python global 语句
  7. 设置将Maven的jar包发布到lib
  8. 谈谈可视化编程 (转)
  9. (三)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 3 数据库应用
  10. Android开发:设置启动页面
  11. 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】
  12. 这种人生最美的场面吸引着千万男孩女孩的憧憬和向往
  13. 学计算机心得体会50字,阅读心得体会50字
  14. BUUCTF Misc wp大合集(2)
  15. rono在oracle的作用_sqlnet.ora的作用
  16. 黑马程序员_工欲善其事必先利其器
  17. 预测分析·民宿价格预测baseline
  18. YEF思想秀:纳须弥于芥子,阐洞见于计算
  19. jointJS(一)--关于jointJS的初认识
  20. atm取款机 oracle实战训练_分享一个模拟ATM取款机的DEMO

热门文章

  1. java中oops是什么意思_什么是oop思想_什么是OOPS
  2. 7-42 就不告诉你
  3. 愿你走过半生,归来仍是少年
  4. 设置Jupyter文档的标题
  5. 从Google Drive用命令行下载大文件
  6. 开放式耳机有什么好处,分享几款知名度高的开放式耳机
  7. uin-app中组件的引用
  8. 关于更新N卡驱动后出现未发现NVIDIA控制面板问题
  9. STM32基本外设超详细44000字教程
  10. ARM探索之旅 | 一、带你认识ARM Cortex-M阵营