找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3033|回复: 8
收起左侧

请教单片机按键双击的问题

[复制链接]
ID:275111 发表于 2018-10-19 09:16 | 显示全部楼层 |阅读模式
1.不要所谓的状态机方法    2.不要开定时器0的中断(开/关定时器0 但不开中断)  
3.如果开中断也行(不得已最后方法)

说明:因为用的是触摸单片机的触摸按键。 按键为1有效。不需要滤波。

实现的基本原理:判断2次按下的时间,>500(or250ms)再有按键按下,就是双击;没有就是_单击_。


目前的状况:我水平很菜,网上看了很多,书上也翻了,我是没实现的了。已经搞了_3天_了,就这个功能了,怎么弄都不行了,快崩溃了。

回复

使用道具 举报

ID:331575 发表于 2018-10-19 10:03 | 显示全部楼层
用定时器扫面计数非中断模式  假设按键1被触摸  内置flag=1  定时器扫描时间为50ms 让标志time0计数 计数到10时即为500ms 再让flag=2 再次按键即可生效
回复

使用道具 举报

ID:342822 发表于 2018-10-19 11:21 | 显示全部楼层
使用计数法识别长短按*/
#include<reg52.h>
#define key_S 1000 //宏定义短按(约20ms)
#define key_L key_S*50 //宏定义长按(约1s)
//定义端口
sbit KEY=P1^4;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
unsigned int count=0;//计数变量

int main (void)
{
        LED1=1;
        LED2=1;               
        KEY=1; //按键输入端口电平置高      
        while(1)         //主循环
        {
                if(!KEY)  //如果检测到低电平,说明按键按下
                {  
                        count++;  
                        if(count==key_L)                                //长按
                                LED2=!LED2;
                        if(count>key_L)
                                count=key_L+1;                                //防止count溢出         
                }  
                else                                                                        //按键抬起
                {  
                        if(count>key_S && count<key_L)//短按
                                LED1=!LED1;
                        count=0;                                                        //count清0
                }   
        }
}
回复

使用道具 举报

ID:275111 发表于 2018-10-23 09:36 | 显示全部楼层
15942379927 发表于 2018-10-19 10:03
用定时器扫面计数非中断模式  假设按键1被触摸  内置flag=1  定时器扫描时间为50ms 让标志time0计数 计数到 ...

牛比。
回复

使用道具 举报

ID:56665 发表于 2019-8-24 10:02 | 显示全部楼层
taotie 发表于 2018-10-19 11:21
使用计数法识别长短按*/
#include
#define key_S 1000 //宏定义短按(约20ms)

你的程序是按键长短按键程序,别人要按键双击程序。
回复

使用道具 举报

ID:370639 发表于 2019-8-24 12:15 | 显示全部楼层
百度搜索杜洋师傅一键多能视频,讲的很好
回复

使用道具 举报

ID:332444 发表于 2019-8-24 20:03 | 显示全部楼层
回复

使用道具 举报

ID:282095 发表于 2019-8-25 07:04 | 显示全部楼层
清零置1即可
回复

使用道具 举报

ID:57657 发表于 2021-12-6 12:52 | 显示全部楼层
你可以看看这个程序 按键双击 N连击 都可以
  1. #include "STC15F104E.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define feed_dog() WDT_CONTR |= 0x10
  6. sbit sKEY = P3 ^ 2;
  7. sbit LED = P3 ^ 3;
  8. bit KEY = 1;
  9. u8 KEYms = 0;       //按键按下时间毫秒 松开清0
  10. u8 leave = 0;      //按键松开时间 减到0 则连击清0
  11. u8 add = 0;         //按键连击次数
  12. void InitTimer0(){
  13.     TMOD = 0x01;
  14.     TH0 = 0x0FC;
  15.     TL0 = 0x18;
  16.     EA = 1;
  17.     ET0 = 1;
  18.     TR0 = 1;
  19. }

  20. void main(){
  21.     WDT_CONTR = 0x27;
  22.     InitTimer0();
  23.     P3M0=0x08;P3M1=0x00;
  24.     while (1) {
  25.         feed_dog();
  26.         if (KEY == 0) {
  27.             leave = 250;        //等待250毫秒
  28.             if (++add >= 2) {   //双击
  29.                 add = 0;
  30.                 LED = !LED;     //LED亮灭翻转
  31.             }
  32.             while (KEY == 0) {
  33.                 feed_dog();
  34.             }
  35.         }
  36.     }
  37. }

  38. void Timer0Interrupt() interrupt 1 { //12Mhz 1mS定时器中断
  39.     TH0 = 0x0FC;
  40.     TL0 = 0x18;
  41.     if (leave && !--leave) {
  42.             add = 0;
  43.     }
  44.     if (sKEY) {
  45.         KEYms = 0;
  46.     } else {
  47.         if (KEYms != 0xFF) {
  48.             KEYms++;
  49.         }
  50.     }

  51.     KEY = !(KEYms >= 25);
  52. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表