一.硬件设计

1,按键电路

在这次设计中,用到的按键只有WK-UP和KEY2两个按键,按下WK-UP按键红灯闪烁,按下KEY2按键绿灯闪烁。

WK_UP电路采用的是下拉模式,常态下是低电平,当按键按下时低电平转化为高电平,所以是上升沿触发的方式;KEY1--KEY3采用的是上拉模式,常态下是高电平,当按键按下时,由高电平转化为低电平,所以是下降沿触发的方式。

KEY0->PH3 上拉输入

KEY1->PH2 上拉输入

KEY2->PC13 上拉输入

WK_UP->PA0 下拉输入

流水灯电路

三脚二极管:如图所示的这中采用的是共阴极的封装方式。中间引脚为阴极,两边为阳极。当较长的引脚输入高电平时,二极管发红色光;当较短引脚输入高电平时,二极管发绿色光。

连接方式:采用的是共阳极连接,分别把二极管的两个阳极用电烙铁连接到一起,再用一根线引出,阳极初始化为高电平,通过给阴极输入高低电平来控制灯的亮灭。并且编写按键程序,通过按键输入,来控制红色光和绿色光的反转。

二.软件设计

1,主函数程序设计

所需文件

主函数程序介绍

在主函数中,首先我们要做的是对我们所用到的库函数,延迟函数,时钟,led灯函数和按键函数进行初始化,初始化之后,进入while循环,由于while里边参数一直为1(即真),所以单片机就一直执行while循环里边的程序。

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "key.h"

#include "lsd.h"

#include "lsdd.h"

#define a 100

//int i,j;

int main(void)

{

u8 key;

HAL_Init(); //初始化HAL库

Stm32_Clock_Init(360,25,2,8); //设置时钟

delay_init(180); //初始化延时函数

uart_init(115200); //初始化USART

LED_Init(); //初始化LED

KEY_Init(); //初始化按键

如下图所示。我们来讲一下while循环里边的程序。

首先,他是调用了按键扫描函数,并且给的参数为1,按键扫描程序的主要功能,大家可以先去看本文章的第二节按键扫描函数,在来看这里会比较轻松。这里调用按键扫描函数之后,当我们按下按键后,按键扫描函数会相应地给主调函数(即这里的key=KEY_Scan(1)函数)一个返回值,然后使用switch(key)函数可以匹配出是返回的哪一个返回值,匹配成功之后就可以执行我们的心形流水灯代码,执行之后跳出再进行按键扫描。最后还有一个延迟函数,是用来设置扫描的频率。这里设置的是十号秒扫描一次,可以根据自己的爱好设置按键扫描的频率。

while(1)

{

key=KEY_Scan(1); //扫描按键

switch(key)

{

case WKUP_PRES: //控制红色流水灯

lsd_nice();

break;

case KEY2_PRES: //控制绿的流水灯

lsd_fuor();

break;

case KEY1_PRES: //红色先亮,绿色再亮

lsd_nice();lsd_fuor();

break;

case KEY0_PRES: //绿色先亮,红色再亮

lsd_fuor();lsd_nice();

break;

}

delay_ms(10); //每十毫秒扫描一次

}

}

2,按键key.c初始化

按键初始化函数。首先是一个对结构体变量的重命名。通过访问新名词GPIO_Initure即可完成对GPIO_InitTypeDef结构体的访问。接着是打开了GPIOA,C,H的时钟。在配置任何GPIO口的时候,我们第一步都是要先打开对应的时钟,大家可以理解为,这个时钟就是我们的大门,只有大门打开了,我们才可以进出,单片机也一样,只有时钟打开了,我们才可以配置他的引脚,具体打开哪几个引脚,是输入还是书痴,是高速还是低速,是上拉还是下拉等等。设置完之后按键初始化也就完成了。

#include "key.h"

#include "delay.h"

void KEY_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIOA时钟

__HAL_RCC_GPIOC_CLK_ENABLE(); //打开GPIOC时钟

__HAL_RCC_GPIOH_CLK_ENABLE(); //打开GPIOH时钟

GPIO_Initure.Pin=GPIO_PIN_0; //PA0

GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入

GPIO_Initure.Pull=GPIO_PULLDOWN; //Ï下拉

GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速

HAL_GPIO_Init(GPIOA,&GPIO_Initure);

GPIO_Initure.Pin=GPIO_PIN_13; //PC13

GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入

GPIO_Initure.Pull=GPIO_PULLUP; //上拉

GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速

HAL_GPIO_Init(GPIOC,&GPIO_Initure);

GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3

HAL_GPIO_Init(GPIOH,&GPIO_Initure);

}

按键key.c扫描函数

按键扫描函数。这里是重点也是难点。在主函数里边我们调用了KEY_Scan(u8 mode)这个函数,这个函数就是按键扫描函数。在该函数中,当mode=1的时候支持连按,当mode=0的时候不支持连按。他是怎样作用的呢?首先,大家要了解这个静态变量static,他是一个静态变量。当该函数第一次被调用的时候,他会被执行一次,给kup_up赋初值为1,当第二次以及以后再被调用的时候,他就不在执行了,所以在这里首先key_up为1,接下来是一个if判断,当mode等1的时候,支持连按,这里是1,所以到这里,key_up的值还是等于1,接着进入if判断,这里是key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)这两个条件的与运算,当都为真的时候,才会执行下边的程序。首先key_up是为1的,现在就是判断有没有按键被按下。当有按键被按下的时候,就会使后边的为1,if里边的语句也就执行了。首先是延迟函数,用来消除按键的抖动。然后这里又给key_up赋值为0。注意!在这个地方,key_up的值变为0了。接着往下执行,这时候又是一个if语句,用来判断那个按键被按下,然后返回被按下的按键值。如果没有按键被按下的时候,又给kup_up赋值为1,不影响以后得调用。

优先级:KEY0>KEY1>KEY2>WK_UP!!

u8 KEY_Scan(u8 mode)

{

static u8 key_up=1; //按键松开标志

if(mode==1) //mode=0:不支持连按,=1,支持连按

key_up=1; //支持连按

if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))

{

delay_ms(10);

key_up=0;

if (KEY0==0) return KEY0_PRES;

else if(KEY1==0) return KEY1_PRES;

else if(KEY2==0) return KEY2_PRES;

else if(WK_UP==1) return WKUP_PRES;

}

else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)

key_up=1;

return 0; //无按键按下

3,流水灯程序lsd.c

流水灯程序是用来控制流水灯的亮灭的,这里用了一个for循环来设置循环的次数,一个宏定义来统一调整循环的时间。这个函数比较简单,就不在一一赘述。如果不太明白,欢迎评论。bilibili网站有配套的视频,讲解的更为清晰。打开bilibili->搜索->文静之森->按键扫描函数。里边有对静态变量static,按键原理,按键扫描函数作用原理的详细讲解,欢迎大家查看

#include "lsd.h"

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#define a 100

int i;

void lsd_nice(void)

{

for(i=0;i<=0;i++)

{

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //

delay_ms(a); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); //

delay_ms(a);

}

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);

}

适合学习的基于stm32系列--按键控制心形红绿流水灯的转换相关推荐

  1. 基于STM32安装Stm32CubeMX,配合Keil完成LED流水灯和USART串口通讯程序,及其管脚的时序波形观察

    目录 一.使用HAL库完成LED流水灯 (一).用STM32CUBEMX生成工程文件 (二).用Keil仿真调试并生成hex文件 (三).用STM32串口烧录程序 (四).实物连接 二.使用HAL库完 ...

  2. (学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)

    使用到的各元件: 1.12V电源一个 2.单片机:STM32F103C8T6 3.直流电机4个 4.电机驱动模块:L298N 5.降压模块两个 6:杜邦线若干 对于直流电机的转动控制如下表 两边电平 ...

  3. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  4. 基于51单片机霍尔测速直流电机控制设计(含源码+原理图+论文+PCB封装)、基于STM32闭环步进电机控制系统设计(仿真,程序,说明)-转发分享

    设计思路: 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法.本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理.产生方法以及如何通过软件编 ...

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

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

  6. 【资料转发分享】基于STM32智能路灯灯光自动控制系统设计-基于STM32无刷电机BLDC速度控制器系统设计-基于STM32热释人体感应智能门禁报警系统设计-基于STM32居家加湿器控制仿真系统设计

    1604基于STM32智能路灯灯光自动控制系统设计-毕设课设资料 实现的功能如下,下图是仿真原理图: 通过ARM内部的ADC采集光敏电阻电压,判断电压值 电压值低于设定的值,表示光强太弱,开路灯 光强 ...

  7. 基于STM32的语言控制智能家居系统

    承接单片机定做 文章目录 前言 一.设计目标及内容: 二.框架思路 三.实现 喜欢请点赞哦! 前言 基于STM32的语言控制智能家居系统,主控使用STM32F103(正点原子战舰板子) 一.设计目标及 ...

  8. stm32实现按键控制三色灯(stm32cubeIDE)

    学习目标: 提示:这里可以添加学习目标 通过上次搭建好的环境和三色灯,使用按键控制并点亮三色灯. 学习内容: 提示:这里可以添加要学的内容 一.老规矩看按键工作原理图 右上图可以看出: 引脚分别接在P ...

  9. (毕业设计资料)基于STM32智能窗帘控制系统设计

    096[电路方案]基于STM32智能窗帘控制系统设计 基于STM32单片机的智能窗帘控制系统.该系统集蓝牙遥控.人声识别控制.空调红外遥控.24c02数据储存.433m遥控.热释电红外感应.温湿度检测 ...

最新文章

  1. Object or Function-JS 中的鸡与蛋问题
  2. WOJ 1204 继续找相同
  3. 尖峰 mysql 源码方向_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...
  4. python代码变成运行程序_用Python脚本转换成windows的可执行程序
  5. 运用alarm系统调用检测网络是否断开
  6. 自动采集壁纸的微信小程序
  7. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字
  8. 课程、问题-利用mincemeat编写简单的MapReduce程序-by小雨
  9. JAVA给枚举成员指定值
  10. 用OpenStack构建南方电网广东公司能源云
  11. 压力焊2021年焊工作业考试题库
  12. 双电阻差分电流采样_电阻电桥基础
  13. SD皇冠毛绒布料材质制作视频教程 中文字幕
  14. 为 Hexo 搭建的博客添加属于自己的个性域名
  15. 活动桌面处理和一个例子
  16. centos安装python及导入cv2出现的问题及踩坑记录
  17. AndroidStudio使用之仿微信首页界面
  18. cs231n-LSTM_Captions
  19. 职场选择之大公司 VS 小公司
  20. 微软裁员1万人,遣散费约54亿元,人均获赔54万!

热门文章

  1. java微信获取用户信息_SpringBoot中获取微信用户信息的方法
  2. 给程序猿、射鸡师的养生公开课程
  3. Word编辑试卷,教你一键快速隐藏答案
  4. 第十一届蓝桥杯 ——数青蛙
  5. 自动化测试 selenium工具集介绍以及常用的Webdriver API
  6. 肚子都笑疼的爆笑笑话有哪些?
  7. Java8的Stream API使用
  8. android插件式换肤核心实现
  9. IT168 年初的采访稿
  10. 梦幻西游卖号显示该服务器没有角色,《梦幻西游》第一神豪秦奋要卖号了,35个角色价值过亿现四折出售,是因为没钱了吗?...