STM32入门教程-2023版【3-2】详细讲解实现LED流水灯

发布时间:2024年01月04日

关注?+ 点赞? ??不错过精彩内容

图片

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!?

三、LED流水灯

依据电路图连接电路

图片

复制LED闪烁的工程,改个名字叫3-2 LED流水灯

图片

修改部分代码,因为我们连接的都是GPIOA的端口,所以第一句不用变的

图片

接着初始化端口的这一部分,我们流水灯用的是GPIOA的0到7号端口,所以这里要加一些端口,如图所示这样就可以把这三个端口初始化了

图片

为什么可以这样用“|”操作?

在stm32f10x_gpio.h文件中可以看到,各个端口的定义,将各位转化为二进制是0000000000000001、0000000000000010、0000000000000100,这里每一个端口对应着一个位,按位或的操作就相当于0000000000000111

图片

最后,我们还可以看到,这里有个GPIO_Pin_All,它对应的数据就是0xFFFF,也就是所有位都为1,这样就相当于选中了所有的引脚

图片

在这里,除了这个GPIO_Pin可以用按位或的操作方式外,这个时钟控制的这一项,也是可以用按位或的操作有式来选择多个外设的

图片

介绍完按位或,我们就可以在这里使用按位或把这8个引脚都选上,这样就把16个端口全部配置为推挽输出模式

图片

在while中,为了实现同时控制16个端口,我们就可以使用GPIO_Write这个函数了,我们复制过来,第一个参数是GPIOx,我们直接写GPIOA

图片

第二个转到定义看一下,这第二个参数就是直接写到GPIO的ODR寄存器里的

图片

所以我们可以写0x0001,对应二进制就是0000 0000 0000 0001,因为C语言不支持直接写二进制,所以这里只能转换为十六进制来写,这16个二进制分别对应PA0到PA15总共16个端口,最低位对应PA0,然后往上依次是PA1、PA2,一直到PA15

图片

因为是低电平点亮,所以前面再加一个按位取反的符号,这样就是第一个LED点亮,其他都熄灭了

图片

以此类推可以实现8个Led灯的点亮,再加上Delay延时函数,就可以实现8个Led灯的循环点亮,想快一点的话可以让Delay函数延时时间改为100,如:Delay_ms(100);

#include "stm32f10x.h" ? ? ? ? ? ? ? ? ?// Device header#include "delay.h" int main(void){ ? ? ? ? ? ? ? ?GPIO_InitTypeDef GPIO_Initstructure; ? ? ? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ? ? ? ? ? ? ? ?GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP; ? ? ? ?//GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; 按或取 ? ? ? ?GPIO_Initstructure.GPIO_Pin = GPIO_Pin_All; ? ? ? ?GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; ? ? ? ?GPIO_Init(GPIOA, &GPIO_Initstructure); ? ? ? ? ? ? ? ?while(1) ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000 ? ? ? ? ? ? ? ?Delay_ms(500); ? ? ? ?}}

可以看到LED循环点亮!

图片

作?者?:硬核王同学

-------?END?------

关注公众号回复“加群”按规则加入技术交流群 ?回复“1024”查看更多内容

图片

如果觉得有用请点个免费的赞

文章来源:https://blog.csdn.net/qq_56921854/article/details/135393208
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。