[c]代码库#ifndef __KEY_H

#define __KEY_H

#include "common.h"

//

//按键IO端口定义

#define KEY0 PFin(9)

#define KEY1 PFin(8)

#define KEY2 PFin(7)

#define KEY3 PFin(6)

//按键值定义

#define KEY0_DATA 1

#define KEY1_DATA 2

#define KEY2_DATA 3

#define KEY3_DATA 4

//变量声明

extern u8 keydown_data; //按键按下后就返回的值

extern u8 keyup_data; //按键抬起返回值

extern u16 key_time;

extern u8 key_tem;

//函数声明

void KEY_Init(void); //IO初始化

void key_scan(u8 mode); //按键扫描函数

#endif

#include "key.h"

/*********************************************************************************

**********************MCU启明 STM32F407应用开发板(高配版)*************************

**********************************************************************************

* 文件名称: key.c *

* 文件简述:按键扫描程序 *

* 创建日期:2015.10.03 *

* 版 本:V1.0 *

* 作 者:Clever *

* 说 明:该按键扫描,包涵各种按键模式的扫描 *

**********************************************************************************

*********************************************************************************/

/**

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~按键模式剖析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、按键返回值,即按键扫描结果值,分为以下几种情况

1、按键按下未抬起时的返回值,对应代码中 keydown_data 变量的值

2、按键按下抬起后才返回的值,对应代码中 keyup_data 变量的值

3、按任意键有效,只需在程序中判断key_time>某个值,该值取决于执行一次扫描函数的

时间长短,扫描函数时间长,相应这该值就小,反之亦然。

4、需要长按一个键一段时间才执行相应的程序,就需要该键键值key_tem与key_time

配合使用,即实现某个按键(key_tem)长按多久(key_time)后执行相应的程序

二、按键使用模式

1、单按:按键按下(一直按着)只返回一次有效按键值

2、连按:按键一直按着每执行一次按键扫描函数就返回一次按键值

3、void key_scan(u8 mode) 中 mode 0:单按 1:连按

三、按键使用注意事项;

1、当使用抬起返回值keyup_data时,按键的连按模式无效,因为键抬起才返回按键值,你

按再久都没用,所以在使用keyup_data时,模式mode必须设置为0

2、如果需要keydown_data与key_time配合构成长按,模式mode需设置为1,才可用

3、如果需要keyup_data与key_time配合构成长按,就要对程序作出相应的改动,在函数的

末尾,将 key_time=0; 改为 key_tem=0;就可以使用长按一个按键一段时间,等时间到

并且按键抬起才执行相应的代码。不过这样改动,按任意键就失效了,因为按键抬起没

把key_time清零,key_time一直有值。或者用户还是需要任意键有效就要自己在相应的

代码中把key_time清零。这种长按配合使用在实际是很少用到的。

**/

u8 keydown_data=0x00; //按键按下后就返回的值

u8 keyup_data=0x00; //按键抬起返回值

u16 key_time=0x00; //按键按下之后的时间计数,该值乘以扫描一次按键函数的时间就等于按键按下的时间

u8 key_tem=0x00; //长按的按键值与按键扫描程序过渡变量

u8 key_bak=0x00; //按键扫描程序过渡变量

//按键IO口初始化函数

void KEY_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOF时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //KEY0 KEY1 KEY2 KEY3对应引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100M

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIOF6,7,8,9

}

/****************************************************************************

* 名 称: void key_scan(u8 mode)

* 功 能:按键扫描函数

* 入口参数:mode:0:单按

1: 连按

* 返回参数:无

* 说 明:响应优先级,KEY0>KEY1>KEY2>KEY3

****************************************************************************/

void key_scan(u8 mode)

{

keyup_data=0; //键抬起后按键值一次有效

if(KEY0==0||KEY1==0||KEY2==0||KEY3==0) //有键正按下

{

if(KEY0==0) key_tem=1;

else if(KEY1==0) key_tem=2;

else if(KEY2==0) key_tem=3;

else if(KEY3==0) key_tem=4;

if (key_tem == key_bak) //有键按下后第一次扫描不处理,与else配合第二次扫描有效,这样实现了去抖动

{

key_time++; //有键按下后执行一次扫描函数,该变量加1

keydown_data=key_tem; //按键值赋予keydown_data

if( (mode==0)&&(key_time>1) )//key_time>1按键值无效,这就是单按,如果mode为1就为连按

keydown_data=0;

}

else //去抖动

{

key_time=0;

key_bak=key_tem;

}

}

else //键抬起

{

if(key_time>2) //按键抬起后返回一次按键值

{

keyup_data=key_tem; //键抬起后按键值赋予keydown_data

}

key_bak=0; //要清零,不然下次执行扫描程序时按键的值跟上次按的值一样,就没有去抖动处理了

key_time=0;

keydown_data=0;

}

}

按键的c语言代码表,各种按键模式的扫描相关推荐

  1. 易语言制作计算机按键指令,易语言制作脚本按键的问题

    我写过个这个小东西吧核心代码给你,用数据库储存键代码的 .版本 2 .支持库 spec .支持库 eAPI .如果 (编辑框脚本.内容 ≠ "") 停止 = 真 脚本 = 分割文本 ...

  2. 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图

    当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...

  3. c语言 按键切换显示屏,51单片机lcd1602按键切屏

    大家好,我又来了,这次是基础切屏(我也只会这基础..),我用的是stc15w4k56s4的单片机,作用是,可以使用和51一样的操作. 切屏 切屏: 例如我想在两个屏幕之间切换:1.先把每个屏幕应该显示 ...

  4. c语言键位大全,按键用法

    1.联系生活 按键的常用做法就像生活中的电磁炉那样,按下电磁炉上的"+"键后马上松开,发现电磁炉上的数就增加了. 现在我们打算用开发板像按电磁炉上的按键一样,按一下灯被点亮,再按一 ...

  5. C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc

    PAGE 1 综合实验 基于NiosII的乐曲演奏设计 单 位: 班 级: 组 员: 指导老师: 首 都 师 范 大 学 2012年5月 目录 TOC \o "1-3" \h \u ...

  6. 单片机2个按键互锁c语言程序,单片机按键点动互锁程序 proteus仿真及源程序

    /******************************************************************** 汇诚科技 ************************* ...

  7. C语言实现设计模式—命令模式

    文章目录 C语言设计模式--命令模式 传统的实现方式如下:(伪代码) 命令模式优化 UML 用例说明 实现流程 command.h command.c main 总结 C语言设计模式--命令模式 好处 ...

  8. srm32f4按键蜂鸣器_stm32 用中断实现按键点灯和蜂鸣器鸣叫(固件库版)

    引言 这是这篇博文的升级版本 https://blog.csdn.net/qq_44885018/article/details/103050388 上面轮询的方法,今天主要讲中断的方法.为了方便不要 ...

  9. php 按键连击,写了一个独立按键 支持组合键、单键长按,连发功能的例子

    你好,我在调试你贴上的程序,发现单个按键都正常,为什么组合键就不正常呢?代码如下: #include #define K_STOP                (1< #define K_ST ...

最新文章

  1. matlab 删除路径_MATLAB自动管理文件
  2. AS3中的序列化与反序列化
  3. 虚拟机ubuntu启动代码界面_Windows10下使用虚拟机安装Ubuntu18.04
  4. Axiso解决跨域访问 !!!!
  5. Zabbix server is not running 报错的排查
  6. XCTF-高手进阶区:Web_php_unserialize(详解)
  7. 装配图位置偏转怎么调整_物理微课|匀变速直线运动、电容器动态分析及磁偏转技巧、方法、模型...
  8. 啤酒与尿布,咩叔原创基于图论简单到爆的实时关联性算法
  9. label包裹input,点击label响应两次解决方法
  10. matlab求解数学题,实验二Matlab求解数学问题
  11. Newifi3(新路由3)刷潘多拉(Pandora)固件
  12. Json解析工具类之GsonUtil类
  13. 管家婆软件二次开发(在管家婆财贸双全中实现建行支付)
  14. 斯特林数 java实现_斯特林数
  15. linux添加jetdirect协议,Padavan 路由器固件 不能驱动 hp1005、hp1020之类打印机 foo2zjs ZjStream协议的linux打印机驱动程序...
  16. L1-009 N个数求和 (20分)【附测试】
  17. Mysql数据库用户密码暴力破解
  18. 人工智能的发展历程和未来发展趋势
  19. SharePoint2010资源库-视频库的使用
  20. python文档学习

热门文章

  1. springboot 没有跳转到指定页面
  2. jenkins如何实现重新发布历史构建记录里的版本
  3. mysql处理字符串的两个绝招:substring_index,concat
  4. yii2 windows 安装
  5. 使用IntentService给自己的Android应用写一个文件下载器。
  6. 旅游自助系统可行性分析
  7. TFS 报错解决方案:tf400324
  8. JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter
  9. k8s启动Pod遇到CrashLoopBackOff的解决方法
  10. Hadoop集群datanode磁盘不均衡的解决方案