按键控制LED灯

目录

文件夹Hardware:

文件LED.c:

文件LED.h:

文件Key.c:

文件Key.h:

文件夹User:

文件main.c:


首先模块化管理代码

文件夹Hardware:

文件LED.c:

// 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "stm32f10x.h"  
  
// LED初始化函数  
void LED_Init(void)  
{  
    // 使能GPIOA端口的时钟,这样才能对GPIOA进行操作。  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
   
    // 定义一个GPIO初始化结构体,用于配置GPIO的参数。  
 GPIO_InitTypeDef GPIO_InitStructure;  
   
    // 设置GPIO模式为推挽输出,且设置LED灯连接到GPIOA的1和2脚。  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  
    // 设置GPIO的输出速率为50MHz。  
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    // 使用上述参数初始化GPIOA的1和2脚。  
 GPIO_Init(GPIOA, &GPIO_InitStructure);  
   
    // 将GPIOA的1和2脚设置为高电平,即初始状态为LED灯灭。  
 GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);  
}  
  



// LED1打开函数  
void LED1_ON(void)  
{  
    // 将GPIOA的1脚设置为低电平,即点亮LED灯。  
 GPIO_ResetBits(GPIOA, GPIO_Pin_1);  
}  
  



// LED1关闭函数  
void LED1_OFF(void)  
{  
    // 将GPIOA的1脚设置为高电平,即熄灭LED灯。  
 GPIO_SetBits(GPIOA, GPIO_Pin_1);  
}  
  



// LED1转换函数  
void LED1_Turn(void)  
{  
    // 如果GPIOA的1脚为低电平(0),则设置为高电平(熄灭LED灯)。否则设置为低电平(点亮LED灯)。  
 if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) {  
 GPIO_SetBits(GPIOA, GPIO_Pin_1);  
 } else {  
 GPIO_ResetBits(GPIOA, GPIO_Pin_1);  
 }  
}  
  



// LED2打开函数,与LED1类似,只是操作的是GPIOA的2脚。  
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);  
    }  
}



文件LED.h:

#ifndef __LED_H
#define __LED_H

//这里都是LED.c里函数的声明

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

#endif
 



文件Key.c:

#include "stm32f10x.h"                  // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "Delay.h"                    // 引入延时函数库的头文件。  
  
// 按键初始化函数  
void Key_Init()  
{  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB端口的时钟,这样才能对GPIOB进行操作。  
 GPIO_InitTypeDef GPIO_InitStructure;                    // 定义一个GPIO初始化结构体,用于配置GPIO的参数。  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;            // 设置GPIO模式为上拉输入。  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;   // 设置要初始化的针脚为GPIOB的1和11脚,这两个脚分别连接Key1和Key2。  
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        // 设置GPIO的输出速率为50MHz。  
 GPIO_Init(GPIOB, &GPIO_InitStructure);                    // 使用上述参数初始化GPIOB的1和11脚。  
}  



  
// 获取按键编号函数  
uint8_t Key_GetNum(void)  
{  
 uint8_t KeyNum = 0;                 // 初始化按键编号为0,表示没有按键按下。  
   
   if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) {  // 如果Key1被按下(即读取的Key1针脚电平为低)  
       Delay_ms(20);                      // 消除按键抖动,等待按键稳定(延迟20毫秒)。  
       while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 等待Key1针脚电平由低变高      (按键释放)。  
       Delay_ms(20);                      // 再次消除按键抖动(延迟20毫秒)。  
       KeyNum = 1;                        // 设置按键编号为1,表示Key1被按下。  
     }  
   
     if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) {  // 如果Key2被按下(即读取的Key2 针脚电平为低)  
         Delay_ms(20);                      // 消除按键抖动,等待按键稳定(延迟20毫秒)。  
         while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 等待Key2针脚电平由低变高(按键释放)。  
         Delay_ms(20);                      // 再次消除按键抖动(延迟20毫秒)。  
         KeyNum = 2;                        // 设置按键编号为2,表示Key2被按下。  
 }  
   
 return KeyNum;                    // 返回按下的按键编号。如果两个按键都没有被按下,返回0。  
}



文件Key.h:

#ifndef __KEY_H
#define __KEY_H

//这里都是对Key.c中的函数进行声明

void Key_Init();
uint8_t Key_GetNum(void);
void LED1_Turn(void);
void LED2_Turn(void);

#endif
 



文件夹User:

文件main.c:

#include "stm32f10x.h"           // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "Delay.h"               // 引入延时函数库的头文件。  
#include "LED.h"                 // 引入LED控制函数库的头文件。  
#include "Key.h"                 // 引入按键检测函数库的头文件。  
  
uint8_t KeyNum;                  // 定义一个全局变量,用于存储按下的按键编号。  
  
int main(void)                   // 主函数入口。  
{
    LED_Init();                  // 初始化LED,可能包括设置GPIO模式、速度等。  
    Key_Init();                  // 初始化按键检测,可能包括使能GPIO时钟、配置GPIO模式等。  
   
    while(1)                     // 无限循环,持续检测按键和LED状态。  
    {  
        KeyNum=Key_GetNum();     // 获取按下的按键编号,并存储在KeyNum变量中。  
        if(KeyNum==1)            // 如果KeyNum等于1(即Key1被按下)  
        {  
           LED1_Turn();          // 转换LED1。  
        }  
        if(KeyNum==2)            // 如果KeyNum等于2(即Key2被按下)  
        {  
           LED2_Turn();          // 打开LED2。  
        }  
    }  
}

你可能感兴趣的:(单片机,stm32,嵌入式硬件)