单片机STM32入门——(2)按键控制

  • 1.理论分析
    • 1.1按键电平分析
    • 1.2按键扫描程序逻辑
  • 2.程序编写
    • 2.1按键扫描程序
      • 2.1.1按键扫描程序的头文件
      • 2.1.2按键扫描程序
    • 2.2主程序

在第一次的学习中已经提到了,我们在需要修改控制灯的状态的时候,都需要重新修改并下载程序,那么我们本次将通过按键来控制LED灯的亮灭。
分别由两个按键控制LED1和LED2

1.理论分析

1.1按键电平分析

理论情况按键的电压波形应该为方波

但是实际按键电压波形,会有电压抖动,我们需要通过延时来进行按键消抖,这里需要用到延时函数delay_ms()

1.2按键扫描程序逻辑

通过分析,我们可以知道。

  • 第一步,判断是否有按键按下,有按键按下时,将继续执行,没有按键按下时,将返回0,即没有按键按下。
  • 第二步,当判断为有按键按下时,判断为key0还是key1,当为key0时,返回1,即为按键1按下;当为key1时,返回为2,即为按键2按下。
Created with Raphaël 2.2.0Start是否有按键按下是否为key0 ?return 1End是否为key1?return 2return 0yesnoyesnoyes

2.程序编写

2.1按键扫描程序

2.1.1按键扫描程序的头文件

首先我们需要GPIO数据读取函数,从PD8和PD9读取数据,并记为key0 和 key1,
然后需要声明void key_init(); int key_scan();这两个函数

#ifndef _KEY_H
#define _KEY_H#include "sys.h"//从PD8和PD9读取数据
#define key0 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)
#define key1 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8)void key_init();
int key_scan();#endif

2.1.2按键扫描程序

按键扫描程序中,我们需要编写void key_init()按键初始化函数,其功能为,初始化定义PD8 和 PD9接口。还需要编写int key_scan()按键扫描函数,通过读取按键电平的变化来判断是否有按键按下与是哪一个按键按下。

#include "key.h"
#include "stm32f10x.h"
#include "delay.h"void key_init(){//初始化按键GPIO_InitTypeDef GPIO_InitStruture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//打开PD时钟GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStruture.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8; //设置端口GPIO_Init(GPIOD,&GPIO_InitStruture);//初始化POID
}int key_scan()
{static u8 flag = 1;//之前没有按键按下if(flag==1&&(key0==0||key1==0))//之前没有按键按下且当前有key0或者key1按下时{flag = 0;//按键key0或者key1按下,flag置0(即为有按键按下)delay_ms(10);//延时按键消抖if(key0==0){return 1;}else if(key1==0){return 2;}}else if(key0==1&&key1==1) flag = 1;//没有按键按下时,flag置1return 0;//无按键按下
}

2.2主程序

首先在主程序中定义无符号的字符变量key
在while循环中通过从按键扫描函数中读取的数值来判断应该控制哪一个灯的状态。
其中特别注意 按键读取函数key = key_scan();需要写在while循环中,因为每一次的循环所扫描到的按键数值不一样。
tips我就在第二次编写时,出现了这样的错误,困扰了很久。

#include "stm32f10x.h"
#include "delay.h"
#include "key.h"
#include "led.h"int main()
{u8 key = 0;//按键数led_init();//LED初始化函数key_init();//按键初始化函数delay_init();while(1){key = key_scan();//必须反在while循环中,每一次读取的函数值不同if(key==1||key==2)//当为按键1或者2时,执行{switch (key){case 1://按键1控制LED1LED1 =! LED1;break;case 2://按键2控制LED2LED2 =! LED2;break;}}}
}

将程序编译下载后,便能通过按键来控制LED1和LED2的状态了。

本次我们学习了如何用按键来控制LED灯的状态,那么下一次的学习,我们将来了解怎样使用矩阵键盘,下一次的难度将会比前两次的学习更大。加油!冲!!

单片机STM32入门——(2)按键控制相关推荐

  1. K_A08_004 基于 STM32等单片机驱动MX1919模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 1.MX1919模块驱动时序 2.对应程序: 3.PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+MX1919 ...

  2. K_A07_003 基于 STM32等单片机驱动DRV8825模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8825模块 1. ...

  3. K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 TB6612模块驱动说明 对应程序: ENA ENB输出PWM 四.部分代码说明 接线说明 1.STC89C52RC+TB661 ...

  4. K_A07_001 基于 STM32等单片机驱动A4988模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+A4988模块 1.2. ...

  5. K_A08_003 基于 STM32等单片机驱动L9110模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 L9110模块驱动时序 对应程序: PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+L9110模块 2.STM ...

  6. K_A07_005 基于 STM32等单片机驱动 DRV8833 模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8833模块 1.2.STM3 ...

  7. K_A08_012 基于 STM32等单片机驱动 DRV8833 模块按键控制直流电机正反转

    目录 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 驱动时序 对应程序: 四.部分代码说明 接线说明 STC89C52RC+DRV8833模块 STM32F103C8T6+DRV8833模 ...

  8. K_A08_005 基于 STM32等单片机驱动XY-160D模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 四.部分代码说明 接线说明 1.STC89C52RC+XY-160D模块 2.STM32F103C8T6+XY-160D模块 五.基础知识学习与相关资料下载 六.视频 ...

  9. K_A07_002 基于 STM32等单片机驱动ULN2003模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 反向输出 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+ULN2003模块 1.2 ...

  10. K_A08_002 基于 STM32等单片机驱动MAX1508模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 3.驱动说明 MAX1508模块驱动时序 对应程序: PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+MAX1508模块 2 ...

最新文章

  1. setcookie第三个值为什么写0
  2. 实验02 Linux文件和目录管理
  3. 2008年10月10日股票池
  4. DIY烤肉加热台,了解一下?
  5. 万物互联时代的边缘计算
  6. c++重载自增与自减运算符(前置与后置)
  7. 周期三角波傅里叶级数例题_如何理解傅里叶级数
  8. IPhone 应用程序管理
  9. 执行shell出现bad interpreter
  10. Exception in thread “main“ java.lang.IllegalStateException: Duplicate key xxx
  11. TypeScript 类(Classes)
  12. 【转载】理解矩阵(一)
  13. 关于MySQL buffer pool的预读机制
  14. 总结目前做得好的新实体店,大致有如下几点
  15. 【更新】火星人敏捷开发手册 2011-12-31
  16. PHP foreach使用 引用 的坑
  17. homestead.yaml配置详解
  18. smb协议讲解_smb协议心得
  19. java计算机毕业设计英语课程学习网站源程序+mysql+系统+lw文档+远程调试
  20. TRACE32——List源代码查看

热门文章

  1. 决策树CART 代价复杂度剪枝
  2. 今日得闲,完善一下之前用python画的滑稽笑脸的代码,附计算过程
  3. img中的title属性和alt属性的异同:
  4. 计算机系军训口号四句霸气,大一新生军训四句口号霸气押韵
  5. 机器人焊钳选型_点焊机器人焊钳的分类及区别
  6. cocos creator制作微信小游戏
  7. 黑盒测试VS白盒测试
  8. 在vscode上快速打开php文件(小白手把手教小白,超级详细)
  9. win10安装UOS双系统过程
  10. 三角诱导公式 两角和与差 二倍角公式 降幂公式 半角公式 万能公式 积化和差公式 和差化积公式