Stm32的按键控制流水灯

2023-05-16

对于stm32的设置首先是对时钟进行启动
要求:key0控制LED0和LED1的亮
key1控制LED0和LED1的亮
kw_up控制闪灯
led.c

#include "led.h" 
#include "delay.h"
/*初始化led所在口的时钟以及一些输入输出的相关设置*/

void Led_Init()
{
	
	GPIO_InitTypeDef GPIO_Initstructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF口的时钟

	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//设置输入输出引脚
	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_OUT;//设置为输出
	GPIO_Initstructure.GPIO_PuPd  = GPIO_PuPd_UP;//输出上拉
	GPIO_Initstructure.GPIO_Speed  =GPIO_Fast_Speed;//输出速度为高速
	GPIO_Initstructure.GPIO_OType  = GPIO_OType_PP;//输出模式为推挽
	GPIO_Init(GPIOF,&GPIO_Initstructure);//GPIO的初始化
	GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
	
}

/*****************************************
函数: void Led_flash()
作用: led闪烁
返回值:void 
参数:void
作者:马伟
********************************************/
void Led_flash()
{


for(int i=0;i<5;i++)
	{
	
		GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
		delay_ms(300);
	  GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低,灯亮
		delay_ms(300);
	}
	
	
}



led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"

void Led_Init(void);//led初始化函数

void Led_flash(void);//LED闪烁函数


#endif

key.c

#include "key.h"
#include "delay.h"
#include "sys.h"

void Key_Init()
{
	
	
	GPIO_InitTypeDef GPIO_Initstructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOB和GPIOA口的时钟

	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;//设置输入输出引脚
	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IN;//设置为输入
	GPIO_Initstructure.GPIO_PuPd  = GPIO_PuPd_UP;//输入上拉
	GPIO_Initstructure.GPIO_Speed  =GPIO_Fast_Speed;//速度为高速

	GPIO_Init(GPIOB,&GPIO_Initstructure);//GPIO的初始化
	
	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0;//设置输入输入引脚
	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IN;//设置为输入
	GPIO_Initstructure.GPIO_PuPd  = GPIO_PuPd_DOWN;//输入下拉
	GPIO_Initstructure.GPIO_Speed  =GPIO_Fast_Speed;//速度为高速
  GPIO_Init(GPIOA,&GPIO_Initstructure);
	
	
}
/*****************************************
函数: int  Check_key( int mode)
作用: 按键检测
返回值:int
参数:int
作者:马伟
********************************************/
int  Check_key( int mode)
{
	static int  key_mark=1 ;
	if(mode==1) key_mark=1;
	if(key_mark&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);
		key_mark=0;
		if(KEY0==0) return 1;
		
		else if(KEY1==0) return 2;
		
	  else if(WK_UP==1) return 3;
	 
	}
 else if(KEY0==1&&KEY1==1&&WK_UP==0)  key_mark=1 ;
	
	return 0;
}


key.h

#ifndef __KEY_H
#define __KEY_H

#include "key.h"
#include "sys.h"

#define KEY0 		GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9) //PE4
#define KEY1 		GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)	//PE3 
#define WK_UP 	GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)	//PA0
int  Check_key( int mode);
void Key_Init(void);
#endif 


main.c

#include "stm32f4xx.h"
#include "key.h"
#include "delay.h"
#include "led.h"
#include "sys.h"
int  main(void)
{
 int key;
 delay_init(168);		//延时初始化 
 Led_Init();//led初始化函数
 Led_flash();//LED闪烁函数
 Key_Init();

while(1)
	{
		key= Check_key(0);
		switch (key)
		{
			case 1: Led_flash(); break;//LED闪烁函数
			case 2: GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);break;//GPIOF9,F10设置高,灯灭
			case 3: GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);break;//GPIOF9,F10设置高,灯灭
			default:;break;
		}
	
	}
		return 0;
	
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stm32的按键控制流水灯 的相关文章

  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL

随机推荐