按键检测程序应"等待按键释放"

按键S4是下拉,S1、S2、S3为上拉。一定要等待按键释放,否则按一次S1可能会运行key_scan()函数好几次。

 1 /*******************************************************************************
 2 * Function Name  : key_scan
 3 * Description    : 按键扫描.优先级S4>S0>S1>S2。一定要等待按键释放
 4 * Input          : None
 5 * Output         : None
 6 * Return         : 按键值
 7 *******************************************************************************/
 8 u8 key_scan()
 9 {
10     if( (S4==1) || (S1==0) || (S2==0) || (S3==0) )
11     {
12         delay_ms(10);
13         if(S1==0)
14         {
15             while(S1==0);
16             return S1_Press;
17         }
18         if(S2==0)
19         {
20             while(S2==0);
21             return S2_Press;
22         }
23         if(S3==0)
24         {
25             while(S3==0);
26             return S3_Press;
27         }
28         if(S4==1)
29         {
30             while(S4==1);
31             return S4_Press;
32         }
33     }
34     return 0;
35 }

头文件定义

1 #define S4 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)//S4 PA.0
2 #define S1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)//S1 PE.4
3 #define S2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)//S2 PE.3
4 #define S3 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)//S3 PE.2
5
6 #define S1_Press 1
7 #define S2_Press 2
8 #define S3_Press 3
9 #define S4_Press 4
时间: 2024-08-25 09:35:58

按键检测程序应"等待按键释放"的相关文章

手动按键复位程序(包含按键消抖)

1 //这是一个按键复位程序 2 module stable_key( 3 i_clkin, 4 i_inKey, 5 o_outKey 6 ); 7 8 input i_clkin; 9 input i_inKey; 10 output o_outKey; 11 12 reg key=1; 13 reg key_get = 1; //key输出指示信号 14 reg [20:0] cntK = 0; 15 reg o_outKey_r = 1; 16 17 always@(posedge i_

第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

第12章 ????GPIO输入-按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小

第12章 GPIO输入—按键检测

第12章     GPIO输入-按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小节,

第13章 GPIO输入—按键检测

本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小节,STM32 HAL库中GPIO初始化结构体GPIO_TypeDef的定义与"定义引脚模式的枚举类型"小节中讲解的相同. 13.1  硬件设计 按键机械触点断开.闭合时,由于触点的弹性作用,按键开关不会

新型的按键扫描程序

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉.我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性. 同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点. 对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho--但是对于新手,我建议将全文看完.因为这是实际项目中总结出来的经验

单片机按键扫描程序,仅三行代码(转)

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能.当然,我自己也是在多个项目用过,效果非常好的.      好了,工程人员的习惯,废话就应该少说,开始吧.以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的.用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已.核心算法:unsigned char Trg;unsigned char Cont;void K

nRF51822外设应用[2]:GPIOTE的应用-按键检测

版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 1. nRF51822寄存器类型 nRF51822的寄存器和一般的单片机有所差别,nRF51822的寄存器分为下面的三种类型. Task :任务寄存器,可以由程序或事件触发. Event:事件寄存器,事件可以产生中断或触发任务. Register:普通寄存器,和一般单片机的寄存器一样. Task和event使得操作片上外设十分方便简洁,只需进行少量的配置,即可轻松运用各种外设.同时,Task和e

关于按键扫描程序的终极讨论

一.思路 基于STM8,按键处理,思路是这样的: 每20ms左右一次去扫描按键,用一个key_now记录当前值,用key_last记录上次的值,如果key_now和key_last同时有效,则开始进行cnt++. 我设定两个阈值,LONG_PRESS为100(100*20ms=2s),SHORT_PRESS为4(4*20ms=80ms,去抖). cnt大于LONG_PRESS,表示是长按,反之再判断cnt是不是大于SHORT_PRESS,表示是短按,否则把cnt清零. 另外一种情况,我们在设置参

Android应用程序模拟手机按键

记得以前在做一个C++项目时,需要在某一步操作之后人为用代码模拟敲键盘上的回车键(Enter)效果. 出于好奇,这几天研究了一下Android中手机(或平板)上各种按键的键值.模拟方法及最终效果. 1.先来看看Android中对按键和值的定义方式: 1 public static final int KEYCODE_UNKNOWN = 0; 2 /** Key code constant: Soft Left key. */ 3 public static final int KEYCODE_S