一、
在硬件连接上,按键一端连接在普通IO口上,另一端接地,IO配置为内部弱上拉。

在软件上,先配置一个5ms定时器并打开中断,每进入该定时中断则置位一次标志位“key_handle”。接着在主循环调用一个“scan_key()”函数,判断“key_handle”标志位是否在定时器内被置位,若被置位则将该位复位并读取连接按键的IO口值。

此时,“scan_key()”函数内分为按键按下和松开两个分支:

按键按下,则计数值“longkey”每隔5ms自加一次,因为这个分支每隔5ms才会进入执行一次;

按键放开,则先判断“longkey”的值,若“longkey”的值换算出来代表按键按下时间在10ms-1s内,(10ms是去抖值,1s是与短按与长按的分界点。)则判断按键为短按;若“longkey”的值大于1s,则判断按键为长按。并将按键状态赋值给按键状态变量“keybuf”。同时,由于此时按键已经放开,因此“longkey”的值要置位“0”等待用户下次按下按键并执行从“0”开始的自加操作。

若程序又一次进入按键检测代码段,说明所有功能块代码已经获知key状态,有对key感兴趣的代码段也肯定已经进行过相应处理,因此此时要及时将“keybuf”置为无按键按下状态以此来同步实际按键状态。

void scan_key(void)
{unsigned char key_status;if((longkey == 0) && (keybuf != _KEYNULL)){// 在keybuf被标记为长按或短按后,若是按键已经松开,// 则在主循环跑完一次后,及时将按键状态标记为无按键按下。keybuf = _KEYNULL;}if(key_handle == _ON) { //5ms进入一次key_handle = _OFF;    // 复位5ms标志位 key_status = GPIO_ReadInputDataBit(KEYRESET_GPIO_PORT, KEYRESET_GPIO_PIN);if(key_status == 0) {   //按下按键longkey++;}else {  // 松开按键if((longkey >= 3) && (longkey <= 100) ){    // 15ms - 1skeybuf = _SHORTKEY;} else if(longkey >= 200) { // 2skeybuf = _LONGKEY;} else {keybuf = _KEYNULL;// 若为扰动,按键状态也该为无按键按下}longkey = 0;}}
}

STM32按键检测程序整理相关推荐

  1. stm32 工业按键检测_STM32f103按键检测程序实现长按短按

    背景本文引用地址:http://www.eepw.com.cn/article/201807/384495.htm 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去 ...

  2. linux按键检测程序,Tiny4412 Linux驱动之按键(使用查询方式) | 技术部落

    前几天在TIny4412开发板上做了LED点灯的Linux驱动,其实挺简单,GPIO驱动,今天再看一下按键的驱动,毕竟按键用的还是比较广泛的,本文使用查询的方式获取按键值,后面会有文章使用中断的方式进 ...

  3. 单片机按键检测程序c语言,单片机检测按键短击,连击c程序

    /****************************************************************************/ //文 件 名:key.c //功 能:短 ...

  4. C语言 | 按键检测程序

    /******************************************************************** > File Name: Key_control.c* ...

  5. STM32学习笔记——(5)按键检测

    按键检测 一.按键检测 一.按键检测 如上图所示, 若按键KEY1未按下时检测点为低电平,按下时检测点为高电平. 若按键KEY2/3/4未按下时检测点为高电平,按下时检测点为低电平. 程序如下: /* ...

  6. 一个学妹写的按键检测函数把我秀翻了!

    摘要:今年实验室来了三个学妹,其中一个学妹以前是物联网专业的,进了实验室老师二话没说:先把STM32单片机过一遍 上来第一个例程就是使用按键点亮一个LED灯,好家伙.点灯小师弟比较在行,毕竟32.FP ...

  7. ZedBoard教程PL篇(2):按键检测

    开发板环境:vivado2017.4 开发板:Zedboard 芯片型号:xc7z020clg484-1 本章主要使用用verilog编写一个按键检测程序,按一次按键LED亮一次,依次点亮八个LED灯 ...

  8. STC15单片机-按键检测单击、双击和长按(状态机)

    按键检测(状态机) 传统的按键检测 在单片机的应用中,利用按键实现与用户的交互功能是相当常见的,同时按键的检测也是很讲究的,众所周知,在有键按下后,数据线上的信号出现一段时间的抖动,然后为低,当按键释 ...

  9. STM32-蓝桥杯嵌入式之三行按键检测(按键的长、短,单击、双击)

    STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 目录 STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 一.检测按键下降沿分析 二.检测按键上升沿分析 三.按键检 ...

最新文章

  1. 9.9学python靠谱吗-宅家亲测:9.9的python体验课,到底值不值?
  2. layui中onchange失效以及form动态渲染失效的问题
  3. c语言怎样输入动态数组代码,求助~~ 如何把数组变成动态输入的?
  4. 【DKN】(六)KCNN.py
  5. TVM:使用 Schedule 模板和 AutoTVM 来优化算子
  6. 并发的线程入门到并发安全原理解析,offer拿到手软
  7. PAT 1012. 数字分类 (20)
  8. ObjC点击H5图片Native预览
  9. 云计算决策指南:解析医疗的7大解决方案
  10. pantum打印机驱动安装m6506_奔图PantumM6506驱动程序官方版
  11. 了解Spring的变迁从Spring3到Spring5
  12. 从零开始学习鸿蒙系统
  13. Contest Design with Threshold Objectives(博弈论+机制设计) 论文阅读笔记
  14. H-大时钟(扩展欧几里得)
  15. java蓝桥杯练习 学做菜
  16. str_rot13() 函数
  17. javascript大全
  18. Android canvas
  19. windows开启IIS服务,配置HTTP服务器
  20. linux管理控制面板--可视化管理linux

热门文章

  1. 导出Word时提示 Word无法启动转换器 mswrd632.wpc
  2. SOPA对CIO来说是好是坏?
  3. 国电南瑞电气工程师校招一面面经
  4. Web实时通讯技术简介
  5. 永宏B1系列PLC是否有电池?
  6. Java之集合框架图及 Collection和Collections的区别及用法总结
  7. 如何将视频导出成图片格式
  8. python --moviepy合成视频加转场效果(淡入淡出)
  9. 安防监控实现之A9主框架的搭建
  10. 直流稳压电源与信号产生电路(模电速成)