目录

前言

一、接线

二、模块化编程

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相关推荐

  1. FPGA(1)基础入门 -- 按键控制led灯

    目录 效果说明 1.配置输入输出变量 2.变量赋值 3.配置引脚(输入输出变量) 代码 效果说明 key1按键按下,led1被点亮. key2按键按下,led2被点亮. 1.配置输入输出变量 inpu ...

  2. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

  3. STM32按键控制led四种方法

    文章目录 回顾按键电路 按照之前文章方法在工程文件下加入Hardware中的key.c和key.h 打开固件库用户手册查询io读取相关的函数 第一种方式实现按键控制 第二种方式实现按键控制led 第三 ...

  4. 8个独立按键控制LED

    8个独立按键控制LED

  5. 按键控制LED实现启动、停止按钮

    按键控制LED实现启动.停止按钮

  6. 简单的按键控制LED

    简单的按键控制LED

  7. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  8. 基于Verilog的按键控制LED灯

    按键控制LED灯 原理图 程序设计 `timescale 1ns / 1psmodule key_led( input sys_clk, input sys_rst_n, input [3:0] ke ...

  9. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...

    基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...

最新文章

  1. epoll与select区别
  2. 阿里云和微软共同开源的 OAM 对 Kubernetes 开发人员意味着什么?
  3. 丹麦见闻(转自王重合原创)
  4. source insight怎么生成函数调用关系图?
  5. net clr via c sharp chap1-- note
  6. java怎么安装_Windows、Linux、Mac下安装JDK
  7. 经典算法详解 之 递归算法
  8. naturalWidth 与 naturalHeight
  9. Oracle 安全性一
  10. C++ new和delete 堆和栈
  11. RGB绘制图片Python
  12. 一个牛人给java初学者的建议
  13. 地理探测器的学习与研究初探
  14. 微信小游戏引擎插件,Creator 使用教程!
  15. an怎么做淡入_切换场景的淡入淡出效果
  16. 【富集分析】GO KEGG
  17. matlab给程序加总标题,【转】matlab标题,给figure加标题,subplot的部分用法
  18. 面向对象基础案例(2)
  19. linux ghost系统安装教程,GHOST 使用方法图文详解 PDF
  20. linux查看网络信息命令

热门文章

  1. 阿里云Apsara Clouder基础技能认证:阿里巴巴编码规范题库(最新题库大全)
  2. 第七章·【第一次上岗:核桃编程】
  3. 有向图 G=(V, E) 的拓扑排序
  4. Android手机模拟器旋转快捷键
  5. python当前时间加一分钟_Python实现的当前时间多加一天、一小时、一分钟操作示例...
  6. 电脑出现“选择一个选项” 只有关闭和疑难解答
  7. 医疗空气净化器系统软件总体设计
  8. 聚苯乙烯/二氧化硅荧光微球/硫化镉-聚苯乙烯微球CdS/PS复合微球的制备方式
  9. 笔记:AVS2背景建模
  10. 基于微信小程序付费自习室系统(微信小程序毕业设计)