第五讲—按键控制LED
目录
前言
一、接线
二、模块化编程
1.写LED部分
LED.c
2.简要介绍GPIO_ReadOutputDataBit函数
LED.h
3.写按键部分
key.c
main.c
前言
前边介绍了些GPIO的相关函数,整合一下,写一个小实验——按键控制LED
一、接线
二、模块化编程
因为该实验涉及到多个外设,全部代码写到一个文件里太乱太杂,也不适于以后直接使用某模块
(因为某些代码比较简单,比如延时函数代码,以后直接用就行)。
1.写LED部分
LED.c
建议在工程文件夹中新建hardware文件夹,以后外设部分都放在hardware里,如图所示:
先上代码:LED.c
#include "stm32f10x.h" // Device headervoid LED_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //上电时保持LED是灭的}void LED1_ON(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_1); //灯亮
}
void LED1_OFF(void)
{GPIO_SetBits(GPIOA,GPIO_Pin_1); //灯灭
}
void LED1_turn(void) //按键按下 如果输出0,置1,否则置0,这样就实现了电平翻转,即GPIO_ReadOutputDataBit函数的意义
{if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1); }
}
void LED2_ON(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{ GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED2_turn(void)
{if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2); }
}
在LED模块的GPIO初始化中,要先给LED高电平,保证上电时LED是熄灭状态。
2.简要介绍GPIO_ReadOutputDataBit函数
在LED反转电平函数中涉及到了GPIO_ReadOutputDataBit函数,所以下边简单介绍一下该函数:
该函数作用为,读取指定端口管脚的输出
先看函数定义:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{uint8_t bitstatus = 0x00;/* Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET){bitstatus = (uint8_t)Bit_SET;}else{bitstatus = (uint8_t)Bit_RESET;}return bitstatus;
}
可以看到,该函数和之前SetBits等函数用法并无不同,在此时LED.c中表示:按键按下时,如果输出0,置1,否则置0,这样就实现了电平翻转,这也就是此刻用GPIO_ReadOutputDataBit函数的意义。
LED.h
头文件的定义和51并无不同:
上代码:
#ifndef __LED_H__
#define __LED_H__void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_turn(void);
void LED2_turn(void);#endif
3.写按键部分
key.c
上代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"//按键的初始化
void key_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStrucTure;GPIO_InitStrucTure.GPIO_Mode = GPIO_Mode_IPU; //按键,用上拉GPIO_InitStrucTure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStrucTure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStrucTure);}//按键检测
uint8_t key_GetNum(void)
{uint8_t key_Num = 0;if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) //按键按下{Delay_ms(20); //按键消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//检测松手,因为按键按下且松手后才有动作Delay_ms(20); //按键消抖key_Num = 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){Delay_ms(20); //按键消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);Delay_ms(20); //按键消抖key_Num = 2;} return key_Num;}
因为涉及到两个按键,所以在写按键初始化时,结构体子项GPIO_PIN的值为GPIO_Pin_1 | GPIO_Pin_11,采用上拉输入的模式,按键部分也和51一样注意按键消抖的问题,这样按键部分就写完了。
最后,在主函数中调用即可。
main.c
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "key.h"
#include "Delay.h"uint8_t key_Num;int main(void)
{LED_Init();key_Init();while(1){key_Num=key_GetNum();if(key_Num==1){LED1_turn();}if(key_Num==2){LED2_turn();}}
}
第五讲—按键控制LED相关推荐
- FPGA(1)基础入门 -- 按键控制led灯
目录 效果说明 1.配置输入输出变量 2.变量赋值 3.配置引脚(输入输出变量) 代码 效果说明 key1按键按下,led1被点亮. key2按键按下,led2被点亮. 1.配置输入输出变量 inpu ...
- led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验
1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...
- STM32按键控制led四种方法
文章目录 回顾按键电路 按照之前文章方法在工程文件下加入Hardware中的key.c和key.h 打开固件库用户手册查询io读取相关的函数 第一种方式实现按键控制 第二种方式实现按键控制led 第三 ...
- 8个独立按键控制LED
8个独立按键控制LED
- 按键控制LED实现启动、停止按钮
按键控制LED实现启动.停止按钮
- 简单的按键控制LED
简单的按键控制LED
- petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)
注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...
- 基于Verilog的按键控制LED灯
按键控制LED灯 原理图 程序设计 `timescale 1ns / 1psmodule key_led( input sys_clk, input sys_rst_n, input [3:0] ke ...
- 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...
基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...
最新文章
- epoll与select区别
- 阿里云和微软共同开源的 OAM 对 Kubernetes 开发人员意味着什么?
- 丹麦见闻(转自王重合原创)
- source insight怎么生成函数调用关系图?
- net clr via c sharp chap1-- note
- java怎么安装_Windows、Linux、Mac下安装JDK
- 经典算法详解 之 递归算法
- naturalWidth 与 naturalHeight
- Oracle 安全性一
- C++ new和delete 堆和栈
- RGB绘制图片Python
- 一个牛人给java初学者的建议
- 地理探测器的学习与研究初探
- 微信小游戏引擎插件,Creator 使用教程!
- an怎么做淡入_切换场景的淡入淡出效果
- 【富集分析】GO KEGG
- matlab给程序加总标题,【转】matlab标题,给figure加标题,subplot的部分用法
- 面向对象基础案例(2)
- linux ghost系统安装教程,GHOST 使用方法图文详解 PDF
- linux查看网络信息命令
热门文章
- 阿里云Apsara Clouder基础技能认证:阿里巴巴编码规范题库(最新题库大全)
- 第七章·【第一次上岗:核桃编程】
- 有向图 G=(V, E) 的拓扑排序
- Android手机模拟器旋转快捷键
- python当前时间加一分钟_Python实现的当前时间多加一天、一小时、一分钟操作示例...
- 电脑出现“选择一个选项” 只有关闭和疑难解答
- 医疗空气净化器系统软件总体设计
- 聚苯乙烯/二氧化硅荧光微球/硫化镉-聚苯乙烯微球CdS/PS复合微球的制备方式
- 笔记:AVS2背景建模
- 基于微信小程序付费自习室系统(微信小程序毕业设计)