按键的单击与双击与长按短按实现方式相近,以下代码仅供参考,写得不是很好

适用于蓝桥杯开发板

程序扩展性不强,更重要的是思路

io.h

#ifndef _IO_H

#define _IO_H

#include "stm32f10x.h"

#define SingleClick 1

#define DoubleClick 2

#define KEY_B1 1

#define KEY_B2 2

#define KEY_B3 3

#define KEY_B4 4

#define TimeInterval 300 //判断双击与单击时间

#define keyState1 1

#define keyState2 2

#define keyState3 3

#define keyState4 4

//enum ss{keyState1,keyState2,keyState3,keyState4}keyState;

#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)

#define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)

#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

enum k{key0,key1,key2,key3};

extern void Delay_Ms(u32 nTime);

void RCC_Init(void);

void IO_Init(void);

void LED_Control(u16 nled , u8 flag);

u8 KEY_Scan(void);

void Key_Double(void);

#endif

io.c

u8 KEY_Scan(void)//按键扫描函数,查找键值

{

static u8 flag = 1;

if(flag&&(KEY0==0||KEY1==0||KEY2==0||KEY3==0))

{

Delay_Ms(10);

flag = 0;

if(KEY0==0)return key0;

else if(KEY1==0)return key1;

else if(KEY2==0)return key2;

else if(KEY3==0)return key3;

}

else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)flag = 1;

return 0xff;

}

//单击双击

/*

1、两次间隔10ms - 300ms以内是双击, 按下第一次开始计时

2、300ms 之后没有按下第二次就是单击

3、思路与我按键单击双击的思维在方向上不太一样,这里是直接状态中判断按键

*/

void Key_Double(void)

{

static u8 key_value = 0xff;

// static u16 keynum1 = 0,keynum2 = 0;

static u8 key = 0; //记录第一次按键是谁按下

switch(keyState)//keyState见宏定义,是按键第一次按下

{

case keyState1: key_value = KEY_Scan();

if(key_value != 0xff){

// keynum1 = keyTime;

flag_1 = 1;

keyState = keyState2;

if(key_value==key0)key = 1;

else if(key_value==key1)key = 2;

else if(key_value==key2)key = 3;

else if(key_value==key3)key = 4;

}

else

{

flag_1 = 0;

keyState = keyState1;

}

break;

case keyState2: key_value = KEY_Scan();

if(keyTime<300)

{

switch(key)

{

case 1:if(key_value==key0){

keyDouble = KEY_B1;flag_1 = 0;

keyTime = 0;

keyState = keyState1;

} break;

case 2:if(key_value==key1){

keyDouble = KEY_B2;flag_1 = 0;

keyTime = 0;

keyState = keyState1;

} break;

case 3:if(key_value==key2){

keyDouble = KEY_B3;flag_1 = 0;

keyTime = 0;

keyState = keyState1;

}

break;

case 4:if(key_value==key3){

keyDouble = KEY_B4;flag_1 = 0;

keyTime = 0;

keyState = keyState1;

}

break;

}

}

else

{

switch(key)

{

case 1:keySingle = KEY_B1; break;

case 2:keySingle = KEY_B2; break;

case 3:keySingle = KEY_B3; break;

case 4:keySingle = KEY_B4; break;

}

flag_1 = 0;

keyTime = 0;

keyState = keyState1;

key = 0;

}

break;

case keyState3:

break;

case keyState4:

break;

default: break;

}

}

按键双击和单击c语言,按键单击与双击相关推荐

  1. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  2. 单击修复计算机英语怎么说,电脑选择语言方式,单击修复计算机

    其他选项:如果电源在启动过程中中断,则正常启动windows 但是我的电脑现在什么模式都启动不了 pe模式命令提示符输入"cd \windows\system32" 出现系统找不到 ...

  3. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...

    基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...

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

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

  5. jQuery —— 元素绑定单击事件(click),但是双击该元素也能触发单击事件,同时会触发两次单击事件的问题

    最近做项目遇到一个问题,给元素绑定了单击事件,但是双击该元素时同样会触发单击事件,并且触发两次的问题,网上找了解决办法基本上都是用 clearTimeout .setTimeout 解决,但是效果不是 ...

  6. c语言按键控制的步进电机程序,独立按键控制步进电机运转c语言程序

    独立按键控制步进电机运转c语言程序 /* * 名称:步进电机 * * 晶振:12MHZ * * 修改:无 * * 内容: 主程序中用 3 个按键,加速.减速.启动和停止.定时器做数码* * 管动态扫描 ...

  7. VUE 解决双击事件与单击事件冲突(单击模拟双击)

    // 单击模拟双击操作this.clickTimes++;if (this.clickTimes === 2) { //当点击次数为2this.clickTimes = 0; //记得清零// 触发双 ...

  8. 用c写按键精灵脚本语言,按键精灵论坛发脚本的格式自动编排脚本源码

    帮助你将按键脚本源代码,按照论坛Discuz!语言进行重新格式编排,主要是对语法进行着色,使脚本代码看起来更好看. 1.演示了如何调用系统打开文件对话框,以及如何根据用户的选择,进行下一步的操作(如打 ...

  9. 用c语言按键控制数码管,按键与数码管C语言例程

    /* 程序效果:按键按下,蜂鸣器响,数码管有相应键值显示按下E键继电器开, 按下C键继电器关注:本空间所有程序仅供参考,所有程序都经实验过,符合题意. (若全选程序并复制到编译器中进行编译,定会出错, ...

  10. 有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)

    一.[开始] 1.按键精灵android手机脚本 1.1.截取手机上指定范围内的图片,通过api上传到有道智云处理后返回识别后的JSON格式数据. 1.2.代码 Import "ShanHa ...

最新文章

  1. 【Nvivo教程】使用Nvivo构建计算的本体
  2. windows server2012
  3. 【Netty】NIO 网络通信 SelectionKey 常用 API 简介
  4. SAP ABAP实用技巧介绍系列之ABAP取中文字符串的字节长度
  5. [Java]Java中的i++不是原子操作
  6. 索引(转载自百度百科)
  7. apache+php
  8. U盘格式化后容量变小问题修复方案
  9. sel4白皮书翻译 | sel4 whitepaper | sel4简介
  10. i5 6500 HD530 台式机黑苹果记录
  11. 2021_WSDM_Pre-Training Graph Neural Networks for Cold-Start Users and Items Representation
  12. (Hopcroft-Carp二分图匹配)Rain on your Parade
  13. 职教计算机录取分数,今年高职院校录取分数线是多少?
  14. drf celery
  15. 提取了Windows 10 Build 9901 系统自带 高清分辨率壁纸
  16. 【计算方法】实验一:python使用二分法、不动点法、牛顿法求根
  17. maya模型切割工具插件 tjh_Cut_Tool 1.2.0 下载及教程
  18. python实现进度条
  19. 关于数据清理,你必须知道这些!
  20. 自用笔记-Qt5.14.2开发Android环境搭建

热门文章

  1. Java源码-猜数字小游戏(Swing编程版)
  2. libGDX-5:文本显示 BitmapFont 和 工具 hiero
  3. Linux服务器生成https证书
  4. cad插件加载bplot成功用不了_AUTOCAD 能加载BatchPlot.VLX批量打印插件但是输入bplot打不开批量打印界面...
  5. ios13怎么打开科学计算机,教你iOS13怎么投屏到Win10上
  6. quick cocos2dx 组件使用要领
  7. CREO:CREO软件之零件【模型】、【分析】、【注释】、【工具】【视图】、【柔性建模】、【编辑】、【造型】、【渲染】的简介及其使用方法之详细攻略
  8. vba随机抽取人名不重复_excel如何实现随机抽取且不重复
  9. Ubuntu安装和显卡驱动安装
  10. 【通俗理解】开漏/开集,线与