stm32---按键

key.c

#include "key.h"
#include "SysTick.h"

/**********************************************************************
* 函 数 名         : KEY_Init
* 函数功能         : 按键初始化
* 输    入         : 无
* 输    出         : 无
************************************************************************/
void KEY_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;    //GPIO初始化要配置的结构体定义  
    RCC_APB2PeriphClockCmd(KEY_PORT_RCC,ENABLE);   //开启APB2总线的时钟    

    GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN;        //选择要操作的引脚
    //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //工作频率,可以可无,按键是输入输出才要配置速率
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //下拉模式,默认是低电平,这个按键结论个3.3V所以配置下拉才能检测出按下   
    GPIO_Init(KEY_UP_PORT,&GPIO_InitStructure);   //初始化端口
    
    GPIO_InitStructure.GPIO_Pin = KEY_DOWN_PIN|KEY_LEFT_PIN|KEY_RIGHT_PIN;        //选择要操作的引脚
    //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //工作频率,可以可无,按键是输入输出才要配置速率
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //下拉模式,默认是低电平,这个按键结论个3.3V所以配置下拉才能检测出按下   
    GPIO_Init(KEY_PORT,&GPIO_InitStructure);   //初始化端口
}


/*******************************************************************************
* 函 数 名         : KEY_Scan
* 函数功能         : 按键扫描检测
* 输    入         : mode=0:单次按下按键
                     mode=1:连续按下按键
* 输    出         : 0:未有按键按下
                     KEY_UP:K_UP键按下
                     KEY_DOWN:K_DOWN键按下
                     KEY_LEFT:K_LEFT键按下
                     KEY_RIGHT:K_RIGHT键按下
*********************************************************************************/
u8 KEY_Scan(u8 mode)
{
    static u8 key=1;
    if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))  //任意一个按键按下
    {
        delay_ms(10);  //消抖
        key = 0;
        
        //按键内容部分
        if(K_UP==1)
        {
            return KEY_UP;
        }
        else if(K_DOWN==0)
        {
            return KEY_DOWN;
        }
        else if(K_LEFT==0)
        {
            return KEY_LEFT;
        }
        else 
        {
            return KEY_RIGHT;
        }
        //按键内容部分
    }
    else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)  //没有一个按键按下
    {
        key=1;
    }
    
    if(mode==1)    //连续按键按下
    {
        key=1;
    }
    return 0;
}

/*
mode=0是普通模式 ,mode=1是连续模式
当任意按键按下,key=1,消抖后变0。普通模式下,只有在松开按键时key=1,下一次按键内容部分按才能实现。
连续模式下,下面判断mode==1,每次判断完key=1,实现按键内容部分一直运行

*/

key.h

#ifndef _key_h
#define _key_h
#include "system.h"

//按键所用时钟定义
#define KEY_PORT_RCC    RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE  //按键要的开启的时钟

//按键所在引脚定义
#define KEY_UP_PIN      GPIO_Pin_0                                                          
#define KEY_DOWN_PIN    GPIO_Pin_3 
#define KEY_LEFT_PIN    GPIO_Pin_2
#define KEY_RIGHT_PIN   GPIO_Pin_4

//按键所在端口定义
#define KEY_PORT        GPIOE
#define KEY_UP_PORT     GPIOA 

//使用位操作定义
#define K_UP            PAin(0)
#define K_DOWN          PEin(3)
#define K_LEFT          PEin(2)
#define K_RIGHT         PEin(4)


//使用读取管脚状态库函数定义 
//#define K_UP      GPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)
//#define K_DOWN    GPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)
//#define K_LEFT    GPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)
//#define K_RIGHT   GPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)


//定义各个按键值  
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_RIGHT 4  

void KEY_INIT(void);
u8 KEY_Scan(u8 mode);
#endif

main.c

#include "systick.h"
#include "led.h"
#include "system.h"
#include "key.h"

int main()
{
    u8 key,i;
    SysTick_Init(72);  //系统时钟初始
    KEY_INIT();  //初始化KEY
    LED_INIT();  //初始化LED
    
    while(1)
    {
        key = KEY_Scan(0);   //按键扫描
        switch(key)
        {
            case KEY_UP: led2=0;break;      //按下K_UP按键    点亮D2指示灯
            case KEY_DOWN: led2=1;break;    //按下K_DOWN按键  熄灭D2指示灯
            case KEY_LEFT: led3=1;break;    //按下K_LEFT按键  点亮D3指示灯
            case KEY_RIGHT: led3=0;break;   //按下K_RIGHT按键 熄灭D3指示灯
        }
         
        i++;          //每加20就变led状态,每次延时10ms,200ms变换一次
        if(i%20==0)
        {
            led1=!led1;
        }
        delay_ms(10);
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 说明本次redis集群安装在rhel6.8 64位机器上,redis版本为3.2.8,redis的gem文件版本为...
    读或写阅读 14,709评论 3 9
  • 第一章:编译和安装SCons第二章:简单编译第三章:编译相关的一些事情第四章:编译和链接库文件第五章:节点对象第六...
    仙灵儿阅读 11,784评论 0 3
  • “你有糖吗?有糖我就不喝酒了” “有” “没有糖糖也行,你,你给我” “好好好,你要什么我给什么” 甜甜的,很久以...
    老婆婆_阅读 193评论 0 0
  • 月挂枝头风涌云 老友相谈至困顿 忆及往事不少年 万般皆是功名罪
    南天九茴阅读 201评论 0 7