线路的连接
程序部分
#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循环,通过“~”来按位取反,给各个端口引脚输出。