关于我在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头文件都是无效的。
最终效果
请自行参考代码进行烧录,谢谢观看。