STM32F4 点亮灯泡【顺序点亮、按键点亮】

news/2024/12/20 1:43:28/

一、顺序点亮灯泡

①初始化

user.c文件中,我们需要对LED进行初始化设置。

在函数LED_GPIO_Config中,可以修改代码如下:

/***********************************************************************
LED初始化
备注 LED 接在GPC14引脚上
***********************************************************************/void  LED_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_3 );									 	  // 关闭所有灯泡GPIO_SetBits(GPIOD, GPIO_Pin_2 );GPIO_SetBits(GPIOD, GPIO_Pin_1 );}

在这段代码中,我们使用GPIO_InitTypeDef结构体对GPIO进行初始化配置。

我们选择使用GPIOD的引脚12、13和14作为LED的控制引脚,并设置为输出模式。

另外,我们将引脚的输出类型设置为推挽输出(PP),输出速度为100MHz,上拉电阻使能。

最后,通过GPIO_SetBits函数将引脚12、13和14设置为高电平,关闭所有灯泡。

问题一:为什么低电平才是点亮灯泡呢?
在这里插入图片描述
我们可以将引脚看作一个开关,通过改变开关的状态来控制灯泡。当引脚处于高电平时,相当于开关处于关闭状态(因为接地线了),电流无法通过开关流向灯泡,因此灯泡不亮。
而当引脚处于低电平时,相当于开关处于打开状态(未接地线),电流可以通过开关流向灯泡,从而使灯泡亮起。

②添加点亮灯泡函数

user.c文件中,我们需要添加一个函数来顺序点亮灯泡。可以在文件末尾添加如下代码:

void Light_Three_Leds(void)
{GPIO_ResetBits(GPIOD, GPIO_Pin_1);Delay_MS(1000);GPIO_SetBits(GPIOD, GPIO_Pin_1);GPIO_ResetBits(GPIOD, GPIO_Pin_2);Delay_MS(1000);GPIO_SetBits(GPIOD, GPIO_Pin_2);GPIO_ResetBits(GPIOD, GPIO_Pin_3);Delay_MS(1000);GPIO_SetBits(GPIOD, GPIO_Pin_3);}

这个函数用于控制三个灯泡的点亮和熄灭。

我们通过GPIO_ResetBits函数将指定的引脚设置为低电平,点亮对应的灯泡,并延时一段时间(这里设置为1秒)。

然后,通过GPIO_SetBits函数将引脚设置为高电平,熄灭灯泡

③在main文件中调用

main.c文件中,我们需要调用Light_Three_Leds函数来点亮灯泡。可以在适当的位置添加如下代码:

int main(void)
{// ...LED_GPIO_Config();  // 初始化LED// ...Light_Three_Leds();  // 调用函数点亮灯泡while (1){// ...// ...}
}

在主函数中,我们首先调用LED_GPIO_Config函数来初始化LED引脚

然后,可以在适当的位置使用Light_Three_Leds函数来点亮灯泡

二、按键点亮灯泡

修改EXTI中断处理函数

user.c文件中,我们需要修改EXTI9_5_IRQHandler函数,使其在检测到按键按下时点亮灯泡。可以将代码修改如下:

void EXTI9_5_IRQHandler(void)
{Delay_MS(20);if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) == 0)  // 检测按键是否按下{while (!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8));printf("This is the system's default operation.\r\n");Delay_MS(1);Light_Three_Leds();  // 调用函数点亮灯泡}EXTI_ClearITPendingBit(EXTI_Line8);
}

在这段代码中,我们首先进行一个20毫秒的延时,以防止按键抖动。

然后,使用GPIO_ReadInputDataBit函数检测按键是否按下(假设按键连接到GPIOE的引脚8)。

如果检测到按键按下,我们进入一个循环,直到按键释放

在循环中,我们打印一条消息表示系统的默认操作,并进行一个1毫秒的延时。然后,调用Light_Three_Leds函数来点亮灯泡

最后,通过EXTI_ClearITPendingBit函数清除中断挂起标志,表示中断已处理完毕。


http://www.ppmy.cn/news/530770.html

相关文章

索尼爱立信手机摇杆失灵的维修方法

摇杆失灵的维修方法:本方法适用于各种带摇杆的各种手机,先关机,拆开前面板,拿下摇杆按钮,会看到有一个方形的手柄,按下摇杆,用竹签蘸取一点无水酒精,滴在摇杆的侧面,让它…

索尼爱立信第一财季亏损;将裁员2,000人

手机生产商索尼爱立信移动通讯有限公司(Sony Ericsson Mobile Communications Ltd.)周五表示,公司将进一步裁员2,000人。受消费者需求疲软及产品分销商和零售商削减库存等因素影响,该公司第一财政季度出现亏损。 该公司第一财季净亏损2.93亿欧元&#xf…

评论:索尼爱立信能否重振雄风?

最近,业界纷纷传言索尼对索尼爱立信公司的业绩很失望,并准备收购索尼爱立信公司。对此传言,索尼CEO斯金格表示:“目前索爱确实比较艰难,但索尼收购合作伙伴的全部股份还很困难。我们已经进入了数码时代,目前…

至尊宝android.phone,Android至尊宝 索尼爱立信X10i行货评测

一、前言: 早在四个多月前我们就对索尼爱立信的当家旗舰智能手机X10进行了详细的评测,其4.0英寸超大电容触摸屏、1GHz处理器和810万像素摄像头等高端配置给我们留下了深刻的印象。而近日经过几个月的酝酿行货版的X10i也终于登场亮相了,值得一…

数据库--->MySQL(0)【函数、索引、事务】

文章目录 视图存储过程使用地方语法 函数函数语法 触发器Mysql架构MySQL引擎 索引为什么要用索引?索引分类创建索引原则(面试基本都问)索引结构聚簇索引和非聚簇索引 事务概述隔离性中不同的隔离级别事务实现原理隔离级别的实现原理(MVCC)锁机…

【switch case简单案例】

switch case语句 switch case格式: switch(表达式) { case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; … case 常量表达式n:语句n;break; default:语句n1;break; } 【注意】 switch 语句注意事项 switch后面的表达式,必须是整型、字符型…

linux-centOS7.9通过docker安装cwmp server:drumsergio/genieacs

一、安装环境 #查看centOS版本 [rootMiWiFi-R4CM-srv network-scripts]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #自动查找最新安装包并升级 [rootMiWiFi-R4CM-srv ~]# sudo yum upgrade 二、关闭firewalld、NetworkManager、selinux 关闭防火墙、…