STM32
直播中

贾熹

8年用户 1687经验值
私信 关注
[问答]

如何利用STM32F103VET按键控制流水灯?

如何利用STM32F103VET按键控制流水灯?

回帖(1)

向婧宇

2021-11-25 09:50:14
学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。
本次是通过按键控制流水灯,按键按一下启动流水灯,按键的使用,在单片机开发中是必不可少的。
这里我用的单片机型号为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++);
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分