当前位置:   article > 正文

实验四 stm32按键控制LED灯_基于stm32按键控制led软硬件实验步骤

基于stm32按键控制led软硬件实验步骤

1.新建一个hardware文件,并点击三个盒子,新建一个组名叫hardware

2.点击魔术棒按钮,点击c/c++,添加hardware头文件路径

3.右键hardware,新建文件,选择.c和.h文件

4..c文件右键添加头文件

#include “stm32f10x.h”;

.h文件要添加一个防止头文件重复包括代码

#ifndef__LED_H

#define __LED_H

#endif

5.继续在.c文件中添加初始化代码

#include "stm32f10x.h"                  // Device header


void LED_Init(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
   
   GPIO_SetBits(GPIOA,GPIO_Pin_1 |GPIO_Pin_2);
  
}
void LED1_ON(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED2_ON(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

6.在.h文件中将.c函数的第一行放入,方便调用

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
#endif
 

7.在main.c中添加#include “LED.h”,并且在main函数内写入LED_Init();以方便调用

8.新建key文件,重复以上步骤,然后新建.c和.h文件

.h文件:

#ifndef __KEY_H
#define __KEY_H

#endif
 

.c文件:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void Key_Init(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOB,&GPIO_InitStructure);
 
}
//读取按键值
uint8_t Key_GetNum(void)  //uint8_t =unsigned char
{
   uint8_t KeyNum=0;//如果没有按键按下就返回0
   if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
   {
      Delay_ms(20);
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
      Delay_ms(20);
      KeyNum=1;
   }
   if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
   {
      Delay_ms(20);
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
      Delay_ms(20);
      KeyNum=2;
   }
   return KeyNum;
}
 

然后

1.主函数main:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;//全局变量

int main(void)
{
    LED_Init();
    Key_Init();
    
    while (1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==1)
        {
           LED1_Turn();

         // LED1_ON();
        }
        if(KeyNum==2)
        {
           LED2_Turn();

         //LED1_OFF();
        }
    }
}
2.LED.c:

#include "stm32f10x.h"                  // Device header


void LED_Init(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
   
   GPIO_SetBits(GPIOA,GPIO_Pin_1 |GPIO_Pin_2);
  
}
void LED1_ON(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void)
{
     if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)
     {
        GPIO_SetBits(GPIOA,GPIO_Pin_1);//高电平
     }
     else
     {
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);//低电平
     }
}
void LED2_ON(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED2_Turn(void)
{
     if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)
     {
        GPIO_SetBits(GPIOA,GPIO_Pin_2);  //高电平
     }
     else
     {
        GPIO_ResetBits(GPIOA,GPIO_Pin_2);//低电平
     }
}

3.key.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void Key_Init(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOB,&GPIO_InitStructure);
 
}
//读取按键值
uint8_t Key_GetNum(void)  //uint8_t =unsigned char  局部变量
{
   uint8_t KeyNum=0;//如果没有按键按下就返回0
   if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
   {
      Delay_ms(20);
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
      Delay_ms(20);
      KeyNum=1;
   }
   if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
   {
      Delay_ms(20);
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
      Delay_ms(20);
      KeyNum=2;
   }
   return KeyNum;
}
4.LED.h:

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);
#endif

5.KEY.h:

#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);

#endif
 

实验效果:

tips:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取输入数据寄存器某一个端口的输入值,GPIOx和GPIO_Pin用来指定某一个端口,uint8_t代表这个端口的高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

读取输入整个数据寄存器,GPIOx用来指定外设,uint16_t代表16位数据,每一位代表一个端口
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取输出数据寄存器某一个端口,GPIOx和GPIO_Pin用来指定某一个端口,uint8_t代表这个端口的高低电平
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

读取输出整个数据寄存器,GPIOx用来指定外设,uint16_t代表16位数据,每一位代表一个端口

变量分为局部变量跟全局变量(在函数中的变量就是局部变量,函数运行时优先使用局部变量,其次没有局部变量才使用全局变量)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/685636
推荐阅读
相关标签
  

闽ICP备14008679号