关于STM32G431RBT6实现按键控制LED

        关于我在csdn上找不到我想要的按键控制LED的代码,然后我打算自己写一下相关的代码实现,主要目的就是在我们的CT117E-M4这块开发板上实现随着B1按下次数增加LED灯的数量同时增加,B2则相反,B3实现按下LED全亮,B4按下就是全灭。下面正文开始。

实验所需端口

        通过查看原理图,为了实现按键控制LED,我们所需要的端口有这么一些:

LED方面我们需要的就是PC8~PC15以及使能573的PD2

按键方面就是PA0,PB0,PB1,PB2四个端口

找到这些东西之后,进入我们的cubemx中对这些端口进行配置

CUBEMX的初始配置

在cubemx的首界面的时候我们首先需要点击右边的install/remove,在里面下载我们所需要的stm32g4的pack,如图所示,然后点击中间的ACCESS TO MCU SELECTOR选择我们的MCU:stm32g431rbt6 双击就好了

实验所需引脚配置

对于LED,我们将其默认置高,这样LED才不会一开始就亮。

然后左边的快捷栏里面点击system core,在里面找到sys,在Debug栏里选中serial wire选项,在rcc里面的hight speed clock选中crystal/ceramic resonator这样就一part配置完成了

试验时钟配置

在顶部工具栏选中clock configuration这一栏,按如图配置(主要就是在第一栏的INPUT frequency中输入24和最后面的HCLK里输入80然后按回车就行)

工程配置

熟悉的顶栏工具栏,熟悉的project manger

第一个空输入你的工程名称(休带中文)

第二个空选择工程生成路径(路径中休带中文,带了中文会导致生成的整个工程没有.s启动文件,需要后续从其他工程里面移植启动文件)

然后再第五栏选中我们的MDK-ARM V5版本

然后转战code generator

勾选第二栏里的第一个选项

最后一步就是在右上角有一个generate code点一下它就好了,我们的工程就建好了。

实现代码

按照蓝桥杯的标准来写我们应该新建一个文件夹叫做dsp,减少麻烦直接新建四个file分别为led.c,led.h,key.c,key.h;

建好之后,将他们保存在工程文件里的core里面,.c文件保存在src文件里面,.h文件保存在inc文件里面,然后点击keil的三个彩色箱子图标,点击中间列的user/core,右下角有一个add files,添加src文件夹中的key.c和led.c文件,这样编译才没有任何问题

 

接下来请欣赏VCR

LED的显示代码

#include "led.h"
#include "main.h"


//LED显示函数,k表示亮灯数量
uint8_t led_num = 0;

void Led_display(uint8_t k)
{
		uint8_t i=0;
	  uint16_t sum=0;
		for(i=1;i<=k;i++)   //通过左移来保证LED数量的增加和减少
	  {
			sum=(GPIO_PIN_8<<(i-1))+sum;
		}
		
		
		//重置所有电平
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		//再重新设置
		HAL_GPIO_WritePin(GPIOC,sum,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

void Led_all() 
{
		led_num=8;
	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_RESET);  //控制八个LED全亮
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //使能PD2,让锁存器工作
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //关闭锁存器
}


void Led_clear()
{
		led_num=0;
	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);  //关闭八个LED
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

接下来是按键控制的代码

#include "key.h"
#include "gpio.h"
#include "led.h"

void key_scan()//编写顺序B1,B2,B3,B4
{
			
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) //判断B1是否被按下
		{
			HAL_Delay(100);//消抖
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) //再次判断按键是否被按下,按下开始执行下面程序
			{
					led_num++; //LED亮的数量渐增
				  if(led_num>8) //判断数量是否达到最大值(如果不加这个判断,会导致MCU认为LED数量无限增加,实际只有八个LED)
					led_num=8;  //固定LED数量最大值
					Led_display(led_num); //LED显示函数
			}
			
		}
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)
		{
			HAL_Delay(100);//消抖
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)
			{
					if(led_num!=0)
				  led_num--;
				  Led_display(led_num);
			}
			
		}
		
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
		{
			HAL_Delay(100);//消抖
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
			{
					Led_all();//让所有灯全亮
			}
			
		}
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
		{
			HAL_Delay(100);//消抖
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
		  {
				Led_clear();   //让所有灯全灭
			}
			
		}
		
}

led.h和key.h

我们在自行编写.h和.c文件时,需要在.h文件里面对c中定义的函数进行申明,不然其他引入的.h头文件都是无效的。

最终效果

请自行参考代码进行烧录,谢谢观看。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值