欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 916|回復: 4
收起左側

51單片機識別 "單擊.雙擊.長按" 問題

[復制鏈接]
ID:143767 發表于 2024-11-21 17:31 | 顯示全部樓層 |閱讀模式
SCH.jpg
這程序是在本論壇找到的,原設定是按一下LED1亮一秒滅,按兩下LED2亮一秒滅,長按LED3亮一秒滅。試驗后發現有時按兩下是LED1亮一秒滅,不知這程序怎樣修改避免發生這種情況,謝謝!
//51單片機識別 "單擊.雙擊.長按" 代碼
//作者:Kxuan163
//程序功能:檢測按鈕的按下彈起次數,以識別"單擊.雙擊.長按"
//MCU: STC89c52RC        晶振 11.0592MHZ
//Proteus8仿真通過;51開發板實驗通過。

#include<reg52.h>   
#include<stdlib.h>  
sbit button =P1^2;    //按鈕連接的單片機引腳
sbit LED1 =P2^7;             //單擊則LED1亮
sbit LED2 =P2^4;      //雙擊則LED2亮
sbit LED3 =P2^0;      //長按則LED3亮
unsigned char count;  //T0計數溢出中斷次數
unsigned char finish; //T0計時一輪結束標志
unsigned char read;   //讀取P1^2引腳電平的變量
unsigned char dn;     //讀得P1^2引腳低電平次數
unsigned char up;     //button彈起次數

//延時函數,入口參數ms為延時的毫秒數/////
void delayms(unsigned int ms)
{         unsigned char i;
         while(ms--)
         { for(i = 0; i < 120; i++); }                                       
} //////////////////////////////////////

//主函數
void main(void)         
{
   //T0 初始化 //////////////////////////
          TMOD=0x01;              //使用定時器T0的模式1
     TH0=(65536-46083)/256;  //定時器T0的高8位設置初值
    TL0=(65536-46083)%256;  //定時器T0的低8位設置初值
    EA=1;                   //開總中斷
    ET0=1;                  //T0中斷允許
  //////////////////////////////////////

   while(1)
    {
     LED1 =1; LED2=1; LED3=1;
     dn =0; up=0; count =0; finish =0;

     TR0=1;              //啟動T0計時
    while(finish !=1 )  //在設定的T0計時段內循環檢測
     {
       read =button;            //讀取P1^2引腳電平
          if (read == 0) delayms(10); //延時10毫秒消熱抖動         

           if (button == 0)
             {dn ++; read =button;} //讀得P1^2低電平次數累加

          if (read ==0 && button ==1) up ++;//彈起次數累加
         } //end of while(finish !=1 )

     // T0計時一輪結束,進行識別:
        TR0 =0;
     if (dn >=1 && up ==1 )       //彈起1次,即單擊               
               { LED1 =0; delayms(1000);} //LED1亮

    if (dn >=2 && up ==2 )            //彈起2次,即雙擊               
        { LED2=0; delayms(1000);}  //LED2亮

        if (dn>=20 && up==0 )        //持續未彈起,即長按     
               { LED3=0; delayms(1000);}  //LED3亮         
           
    } //end of while(1)
} //end of main()  


//函數:定時器T0的中斷服務 ////////////////
void Time0(void ) interrupt 1 using 1
   {
     count++;            //T0計數溢出中斷次數累加
    if(count==20)  //若T0計數溢出次數累計達設定值
          {count =0; finish =1;} //一輪計時結束                          

          TH0=(65536-46083)/256;  
         TL0=(65536-46083)%256;  
   } ///////////////////////////////////////

回復

使用道具 舉報

ID:143767 發表于 2024-11-21 17:32 | 顯示全部樓層
我是實際搭的電路試驗的
回復

使用道具 舉報

ID:123917 發表于 2024-11-21 18:56 | 顯示全部樓層
延時時間縮短試試
回復

使用道具 舉報

ID:140489 發表于 2024-11-22 08:24 | 顯示全部樓層
http://www.raoushi.com/bbs/dpj-99528-1.html到這里看看,你會有所收獲的
回復

使用道具 舉報

ID:401564 發表于 2024-11-22 09:17 | 顯示全部樓層
本論壇有現成的狀態機,雙擊和長按都可以,我復制下來用了,沒有問題
你應該去學一下狀態機,封裝成.c文件,可以輕松的套用到其它的單片機上
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表