第三课,基于stm32f103c8t6的流水灯

文章详细介绍了如何在STM32F10X微控制器上配置GPIO端口,使用推挽输出模式,并通过位操作设置多个引脚的状态来实现流水灯效果。主要步骤包括开启GPIO时钟,初始化结构体,以及使用GPIO_Write函数控制输出电平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线路的连接

 程序部分

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开GPIOA的时钟
    
  GPIO_InitTypeDef GPIO_InitStucture;
    GPIO_InitStucture.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出 高低电平均有驱动,开漏输出只有低电平驱动
    
    GPIO_InitStucture.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); 
    //或上8个引脚,因为每个引脚都是一位,按位或刚好是0000 0000 1111 1111
  //也可以GPIO_InitStucture.GPIO_Pin = GPIO_Pin_All;
    
    GPIO_InitStucture.GPIO_Speed = GPIO_Speed_50MHz;  //50mz的速度
    GPIO_Init(GPIOA, &GPIO_InitStucture);
    
//  GPIO_SetBits(GPIOA, GPIO_Pin_0);                  //给高电平输出
//  GPIO_ResetBits(GPIOA, GPIO_Pin_0);                //给低电平输出
//  GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
    
    while(1) 
    {
        int i;
        for(i=0;i<8;i++)
        {
            GPIO_Write(GPIOA, ~(0x0001<<i));    //ODR控制十六位 0000 0000 0000 0000, 且0为输出
            Delay_ms(500);    
        }
    }
}
 

与闪烁差不多,这里需要注意

    GPIO_InitStucture.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); 
    //或上8个引脚,因为每个引脚都是一位,按位或刚好是0000 0000 1111 1111
  //也可以GPIO_InitStucture.GPIO_Pin = GPIO_Pin_All;

因为流水灯用到八个引脚,0-7,所以我们可以将每个引脚或上去,分别是0000 0000 0000 0001 | 0000 0000 0000 0010 | ... | 0000 0000 1000 0000,最后得到 0000 0000 1111 1111

当然,也可以选择GPIO_InitStucture.GPIO_Pin = GPIO_Pin_All,这样子是选中十六个引脚,即0x1111 1111 1111 1111。

主函数部分,

    while(1) 
    {
        int i;
        for(i=0;i<8;i++)
        {
            GPIO_Write(GPIOA, ~(0x0001<<i));    //ODR控制十六位 0000 0000 0000 0000, 且0为输出
            Delay_ms(500);    
        }
    }
}

因为函数GPIO_Write(GPIOA, ~(0x0001<<i));是指输出到ODR口(可以鼠标右键点击go去查看该函数),当为0时,输出该引脚低电平,一共16个引脚,即可以0000 0000 0000 0001-1111 1111 1111 1111(是按位来,并不是逐步加)

这里使用了一个for循环,通过“~”来按位取反,给各个端口引脚输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值