关注 + 点赞 不错过精彩内容
大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!
三、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”查看更多内容
如果觉得有用请点个免费的赞