一、元器件介绍
本次实验应用的是 3**6*5mm轻触开关2脚微动两脚的按键,可直插面包板孔,使用方便。
轻触开关
二、基于stm32f10c8t6 基础实验按键控制LED
(1)按键输入原理
首先知道LED是通过stm32芯片配置GPIO驱动点亮或熄灭,那么通过配置按键的I/O状态输入给我们的stm32转而控制LED对应的I/O口状态,达到按键控制点亮LED或熄灭的效果。简单的理解就是通过按键输入一个信号给stm32,再由stm32传递这个信号,给配置LED的寄存器响应这个信号,改变电平的转换,实现点亮或熄灭。
(2)代码部分
key.c
#include "stm32f10x.h"
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//声明结构体——GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时钟使能GPIOB
//RCC APB2PeriphClockcmd(RCC APB2Periph GPIOB | RCC APB2Periph AFIO,ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;//定义引脚GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入模式 Out_PP;//推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//频率50Mhz
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA
}
u8 KEY_Scan(void) //键值反馈
{
static u8 key_up=1; //按键松开状态
if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
delay_ms(20); //按键去抖
key_up=0; //说明有闭合
if(KEY1==0)
{
return 1;
}
else if(KEY2==0)
{
return 2;
}
//else if(KEY3==0&&KEY4==0) 同时按响应功能
else if(KEY3==0)
{
return 3;
}
else if(KEY4==0)
{
return 4;
}
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
key_up=1;
return 0;
}
key.h
#include "stm32f10x.h"
#ifndef __KEY_H
#define __KEY_H
//#define KEY GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define KEY4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
void KEY_Init(void);
u8 KEY_Scan(void);
#endif
main.c
#include "stm32f10x.h"
#include "sys.h"
#include "led.h"
#include "key.h"
#include "delay.h"
u8 t;
u8 k1=0,k2=0,k3=0,k4=0;
int main()
{
LED_Init();
KEY_Init();
delay_init();
while(1)
{
t=KEY_Scan(); //获得键值
if(t)
{
switch(t)
{
case 1:
if(k1==0)
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
else
GPIO_SetBits(GPIOB,GPIO_Pin_15);
k1=!k1;
break;
case 2:
if(k2==0)
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
else
GPIO_SetBits(GPIOB,GPIO_Pin_14);
k2=!k2;
break;
case 3:
if(k3==0)
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
else
GPIO_SetBits(GPIOB,GPIO_Pin_13);
k3=!k3;
break;
case 4:
if(k4==0)
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
else
GPIO_SetBits(GPIOB,GPIO_Pin_12);
k4=!k4;
break;
}
}
else delay_ms(100);
}
}
(3)效果展示
按键控制LED实验现象:
按键控制LED
三、总结与扩展
总结:
根据以上内容,学习按键应用还是容易理解的,输入一个信号给stm32,再由stm32传递这个信号,给配置LED的寄存器响应这个信号,改变电平的转换,实现点亮或熄灭。
按键主要是应用输入信号作为开关的作用。
所以要有信心一步步积累理论和实践经验,一起学习加油!
扩展:可通过按键可以开关灯、抢答器、中断等实验。那么就分享到这,大胆尝试实践探索吧,欢迎讨论。