学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。
本次是通过按键控制流水灯,按键按一下启动流水灯,按键的使用,在单片机开发中是必不可少的。
这里我用的单片机型号为STM32F103VET
8个LED灯接在了PA口的低八位。
注意点:
1.开启GPIOA和GPIOB的时钟
2.设置GPIOA口的工作模式,和GPIOB口的工作模式
GPIOA:
1)打开0-7 IO口
2)设置8个口为推挽输出
3)速度为50MHz
GPIOB:(和按键相接)
1)设置0口
2)为上拉输入
工程布局如下图:
代码也比较简单,代码如下:(这里我没有将代码模块化,只在main函数中实现,便于初学者理解,以后的代码会逐渐模块化)
#include "stm32f10x.h" // Device header
#include "stm32f10x_gpio.h"
void delay(void);
int main(void)
{
unsigned char temp=0XF0;
RCC_DeInit(); // 将外设RCC寄存器重设为缺省值
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 使能或者失能APB2外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct; // 定义结构体 包含了外设GPIO的配置信息
GPIO_DeInit(GPIOA); // 将外设GPIOA寄存器重设为缺省值
GPIO_DeInit(GPIOB);
GPIO_InitStruct.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为管脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA,&GPIO_InitStruct); // 根据GPIO_InitStruct中指定的参数初始化外设GPIOA寄存器
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_Write(GPIOA,0X00F0);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0) // 检查按键是否按下
{
delay(); // 消抖
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0) // 再次判断按键是否按下
{
temp = ~temp;
GPIO_Write(GPIOA,temp);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0); // 开关松开检测
}
}
}
}
void delay(void)
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<400;j++);
}
}
学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。
本次是通过按键控制流水灯,按键按一下启动流水灯,按键的使用,在单片机开发中是必不可少的。
这里我用的单片机型号为STM32F103VET
8个LED灯接在了PA口的低八位。
注意点:
1.开启GPIOA和GPIOB的时钟
2.设置GPIOA口的工作模式,和GPIOB口的工作模式
GPIOA:
1)打开0-7 IO口
2)设置8个口为推挽输出
3)速度为50MHz
GPIOB:(和按键相接)
1)设置0口
2)为上拉输入
工程布局如下图:
代码也比较简单,代码如下:(这里我没有将代码模块化,只在main函数中实现,便于初学者理解,以后的代码会逐渐模块化)
#include "stm32f10x.h" // Device header
#include "stm32f10x_gpio.h"
void delay(void);
int main(void)
{
unsigned char temp=0XF0;
RCC_DeInit(); // 将外设RCC寄存器重设为缺省值
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 使能或者失能APB2外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct; // 定义结构体 包含了外设GPIO的配置信息
GPIO_DeInit(GPIOA); // 将外设GPIOA寄存器重设为缺省值
GPIO_DeInit(GPIOB);
GPIO_InitStruct.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为管脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA,&GPIO_InitStruct); // 根据GPIO_InitStruct中指定的参数初始化外设GPIOA寄存器
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_Write(GPIOA,0X00F0);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0) // 检查按键是否按下
{
delay(); // 消抖
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0) // 再次判断按键是否按下
{
temp = ~temp;
GPIO_Write(GPIOA,temp);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0); // 开关松开检测
}
}
}
}
void delay(void)
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<400;j++);
}
}
举报