功能及说明
使用按键控制LED。
通过 ALIENTEK 精英 STM32F103 上载有的 3 个按钮 KEY_UP 、 KEY0和 KEY1 )),来控制板上的 2 个 LED (DS0 和 DS1 )。KEY0控制DS0, KEY1 控制 DS1 ,按一次亮,再按一次灭 KEY0 则同时控制 DS0 和 DS1按一次,他们的状态就翻转一次。
KEY0 连接在 PE4 上、 KEY1 连 接在 PE3 上 、 KEY_UP 连接在 PA0 上。
KEY0 和 KEY1 是低电平有效的,而 KEY_UP 是高电平有效的, 并且外部都没有上下拉电阻,所以,需要在 STM32F1内部设置上下拉。
main
#include"stm32f10x.h"
#include"sys.h"
#include"key.h"
int main(void){
u8 key;
u8 mode;
LED_Init();
KEY_Init();
while(1)
{
mode=1;
key=KEY_Scan(mode);
if(key==1)//KEY0 按下,DS0亮
{
DS0=!DS0;
}
else if(key==2)//KEY1按下
{
DS1=!DS1;
}
else if(key==3)//反转
{
DS0=!DS0;
DS1=!DS1;
}
}
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include"stm32f10x.h"
#include"sys.h"
#define KEY0 PEin(4) //读取按键 0
#define KEY1 PEin(3) //读取按键 1
#define WK_UP PAin(0) //读取按键 WK_UP)
#define KEY0_PRES 1 //KEY0 按下
#define KEY1_PRES 2 //KEY1 按下
#define WKUP_PRES 3 //WK_UP 按下
#define DS0 PBout(5)//写入
#define DS1 PEout(5)
void KEY_Init(void);
void LED_Init(void);
u8 KEY_Scan(u8);
#endif
key.c
#include"key.h"
#include"stm32f10x.h"
void KEY_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;// GPIO E 3 ~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);// 初始化 GPIOE3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化 WK_UP ---->GPIOA.0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 设置成输入,下拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
}
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;//初始化参数指针结构体,这个结构体中的参数是GPIO寄存器的参数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE); //使能 PB,PE 端口时钟
//给GPIO寄存器参数赋值,设置PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0 ---->PB.5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出最大速度
GPIO_Init(GPIOB, &GPIO_InitStructure);//给GPIOB初始化,根据设定参数配置GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高,置1
//设置PE5,其他参数不变,只改变引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 ---->PE.5 推挽输出
GPIO_Init (GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高,置1
}
//按键处理函数
//返回按键值
//mode:0 不支持连续按 ; 1支持连续按
//0 ,没有任何按键按下
//1 KEY0 按下
//2 KEY1 按下
//3 KEY3 按下 WK_UP
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;// 按键按松开标志
if(mode)key_up=1; // 支持连按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))//有按键按下
{
int i=0;
for(i=0;i<10;i++);// 去抖动
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}
else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}