STM32F103实验二:按键控制LED亮灭

0.前言

  基于正点原子mini板的程序设计,完成按键控制LED的功能。

  在STM32F103实验一:点亮LED灯的基础下(已经建立好led.h和led.c文件),添加头文件key.h和源文件key.c到HARDWARE文件夹下。



1.原理图参照:

在这里插入图片描述



3.程序开发思路:

  • 编写头文件key.h,声明相关调用和函数
  • 在key.c文件中编写按键初始化函数
  • 在key.c中编写按键检测函数
  • 在主函数main()中编写按键控制led的程序


3.1编写key.h文件

#ifndef __KEY_H_
#define __KEY_H_

#include "stm32f10x.h"
#include "sys.h"

//声明按键返回值
#define KEY_0  1
#define KEY_1  2 
#define WK_UP  3

//声明按键引脚
#define key_0  PCin(5)
#define key_1  PAin(15)
#define wk_up  PAin(0)

void KEY_Init(void);
u8 KEY_Scan(void);

#endif


3.2编写key.c文件

#include "key.h"
#include "delay.h"

void KEY_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);	
    //WK_UP初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 		//下拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //KEY_1初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		//上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //KEY_0初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //上拉输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//按键扫描函数
u8 KEY_Scan()
{
    if(wk_up){
        delay_ms(10);
        if(wk_up){
            while(wk_up);
            return WK_UP;
        }
    }
    
    if(!key_1){
        delay_ms(10);
        if(!key_1){
            while(!key_1);
            return KEY_1;
        }
    }
    if(!key_0){
        delay_ms(10);
        if(!key_0){
            while(!key_0);
            return KEY_0;
        }
    }   
    return 0;//默认返回值
}

3.3编写主函数main()

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"

int main(void)
{
    u8 key;   
    LED_Init();
    KEY_Init();
    delay_init();
    while(1){
        key = KEY_Scan();
        switch(key){
            case KEY_0:   LED0=!LED0  ;      break;
            case KEY_1:   LED1=!LED1  ;      break;
            case WK_UP:   LED1=!LED1, LED0=!LED0;      break;           
        }
    }        
}

3.4效果

  按下KEY_0键后,LED0的状态反转,按下KEY_1键后,LED1的状态反转,按下WK_UP后,LED0和LED1的状态都反转。



时间:2019年8月8日21:59:38


评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值