找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4078|回復(fù): 8
收起左側(cè)

請教單片機按鍵雙擊的問題

[復(fù)制鏈接]
ID:275111 發(fā)表于 2018-10-19 09:16 | 顯示全部樓層 |閱讀模式
1.不要所謂的狀態(tài)機方法    2.不要開定時器0的中斷(開/關(guān)定時器0 但不開中斷)  
3.如果開中斷也行(不得已最后方法)

說明:因為用的是觸摸單片機的觸摸按鍵。 按鍵為1有效。不需要濾波。

實現(xiàn)的基本原理:判斷2次按下的時間,>500(or250ms)再有按鍵按下,就是雙擊;沒有就是_單擊_。


目前的狀況:我水平很菜,網(wǎng)上看了很多,書上也翻了,我是沒實現(xiàn)的了。已經(jīng)搞了_3天_了,就這個功能了,怎么弄都不行了,快崩潰了。

回復(fù)

使用道具 舉報

ID:331575 發(fā)表于 2018-10-19 10:03 | 顯示全部樓層
用定時器掃面計數(shù)非中斷模式  假設(shè)按鍵1被觸摸  內(nèi)置flag=1  定時器掃描時間為50ms 讓標(biāo)志time0計數(shù) 計數(shù)到10時即為500ms 再讓flag=2 再次按鍵即可生效
回復(fù)

使用道具 舉報

ID:342822 發(fā)表于 2018-10-19 11:21 | 顯示全部樓層
使用計數(shù)法識別長短按*/
#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;//計數(shù)變量

int main (void)
{
        LED1=1;
        LED2=1;               
        KEY=1; //按鍵輸入端口電平置高      
        while(1)         //主循環(huán)
        {
                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
                }   
        }
}
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-10-23 09:36 | 顯示全部樓層
15942379927 發(fā)表于 2018-10-19 10:03
用定時器掃面計數(shù)非中斷模式  假設(shè)按鍵1被觸摸  內(nèi)置flag=1  定時器掃描時間為50ms 讓標(biāo)志time0計數(shù) 計數(shù)到 ...

牛比。
回復(fù)

使用道具 舉報

ID:56665 發(fā)表于 2019-8-24 10:02 | 顯示全部樓層
taotie 發(fā)表于 2018-10-19 11:21
使用計數(shù)法識別長短按*/
#include
#define key_S 1000 //宏定義短按(約20ms)

你的程序是按鍵長短按鍵程序,別人要按鍵雙擊程序。
回復(fù)

使用道具 舉報

ID:370639 發(fā)表于 2019-8-24 12:15 | 顯示全部樓層
百度搜索杜洋師傅一鍵多能視頻,講的很好
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2019-8-24 20:03 | 顯示全部樓層
回復(fù)

使用道具 舉報

ID:282095 發(fā)表于 2019-8-25 07:04 | 顯示全部樓層
清零置1即可
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 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;         //按鍵連擊次數(shù)
  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亮滅翻轉(zhuǎn)
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表