久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3088|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

請問這個(gè)51單片機(jī)按鍵單雙擊程序怎么不成功?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:893997 發(fā)表于 2021-12-28 17:52 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "reg52.h"            

typedef unsigned int u16;      
typedef unsigned char u8;
sbit ROTARY_MUTE=P3^1;       //按鍵


void keypros()
{
    static bit key_down=0;  //按鍵按下標(biāo)志位
    static  key_down_num=0;
    static u8 count1=0;
    static u16 count2=0;
    if(key_down==1)              
    {
        count2++;                  
        if(count2>20000)           
        {
            count2=0;                           
            if(key_down_num==1)            
            {
                 key_down_num=0;
                 P2=0X01;
                 key_down=0;
            }
            if(key_down_num==2)
            {
                key_down_num=0;
                P2=0x00;
                key_down=0;
            }
        }
                if(ROTARY_MUTE==1)        
                {
                         if(ROTARY_MUTE==0)              
                        {        
                         key_down_num++;                    
                        }
                }
        }
     
    else                       
    {
        if(ROTARY_MUTE==0)              
        {
            count1++;                     
            if(count1>100)               
            {
                count1=0;                  
                if(ROTARY_MUTE==0)         
                {
                    key_down=1;
          key_down_num++;                    
                }
            }
        }
        else
        {
            count1=0;                     
        }
    }
        

}


void main()
{   
    while(1)
    {   
        keypros();  //按鍵處理函數(shù)   
    }        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2021-12-28 22:24 | 只看該作者
以#include "reg52.h"為第1行
由第33到35行的時(shí)間太短(幾個(gè)us)
不足以檢測到按鍵按下
回復(fù)

使用道具 舉報(bào)

板凳
ID:893997 發(fā)表于 2021-12-29 15:32 | 只看該作者
lkc8210 發(fā)表于 2021-12-28 22:24
以#include "reg52.h"為第1行
由第33到35行的時(shí)間太短(幾個(gè)us)
不足以檢測到按鍵按下

非常感謝,我按照需求加了一定的延時(shí)之后可以使用的,但是有時(shí)候還是會(huì)誤觸發(fā),我再試著改改
回復(fù)

使用道具 舉報(bào)

地板
ID:839438 發(fā)表于 2021-12-29 15:39 | 只看該作者
為什么不用狀態(tài)機(jī)?
回復(fù)

使用道具 舉報(bào)

5#
ID:313048 發(fā)表于 2021-12-29 15:42 | 只看該作者
用狀態(tài)機(jī)去做,比較簡單。
回復(fù)

使用道具 舉報(bào)

6#
ID:839438 發(fā)表于 2021-12-29 15:47 | 只看該作者
void Timer0Init(void)                //1000微秒@22.1184MHz
{
        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x9A;                //設(shè)置定時(shí)初值
        TH0 = 0xA9;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
        ET0 =1;
}
void Timer0() interrupt 1
{
       
  TL0 = 0x9A;                //設(shè)置定時(shí)初值
        TH0 = 0xA9;                //設(shè)置定時(shí)初值
        num++;
        Time_key_cnt++;
        Timer0_cnt++;
        if(Timer0_cnt >10)
                        {
                                Timer0_cnt=0;
                                Key_scan();
                        }
                        if(num >1000)
                        {
                                num =0;
                                LED =~LED;
                        }
}
void Key_scan(void)
{
           
         switch(Key_cnt)
         {
                 case 0x00:
                          if(Key ==0)
                                {
         Key_cnt = 0x01;
         Time_key_cnt=0;                                       
                                        break;
                                }                          
     case 0x01:                               
                     if(Key == 0)
                                 {
                                   Key_cnt = 0x02;
                                         Lamp_flag =1;
                                         break;
                                 }
                                 else
                                         Key_cnt =0x00;
                                 break;
                 case 0x02:
           if(Key ==1)
              Key_cnt = 0x00;
              if(Time_key_cnt >200)
                                                        {
                                                           Lamp_mode = 1;//燈模式選擇 1 電抗 0 為電容
                                                                 Time_key_cnt =0;//長按按鍵計(jì)時(shí)清零
                                                        }                                                               
                     break;
                default :   break;
                }
}
void Button_scan() //開關(guān)感應(yīng)器軟件抗干擾處理函數(shù),放在定時(shí)中斷里。
{
   if(Button_right == 1)  //左邊感應(yīng)器是高電平,說明有可能沒有被接觸    對應(yīng)朱兆祺學(xué)習(xí)板的S5鍵  
   {
      Button_cnt1 = 0;//在軟件濾波中,非常關(guān)鍵的語句!!!類似按鍵去抖動(dòng)程序的及時(shí)清零
      Button_cnt2++; //類似獨(dú)立按鍵去抖動(dòng)的軟件抗干擾處理
           if(Button_cnt2 > 20)
           {
                  Button_cnt2=0;
                  Button_right=1;   //說明感應(yīng)器確實(shí)沒有被接觸
           }
   }
   else    //左邊感應(yīng)器是低電平,說明有可能被接觸到了
   {
         Button_cnt2=0; //在軟件濾波中,非常關(guān)鍵的語句!!!類似按鍵去抖動(dòng)程序的及時(shí)清零
        Button_cnt1++;
        if(Button_cnt1 > 20)
           {
                  Button_cnt1=0;
                  Button_right=0;   //說明感應(yīng)器確實(shí)被接觸
           }
   }
}
這是我前段時(shí)間抄的代碼,一個(gè)時(shí)狀態(tài)機(jī),一個(gè)類似于狀態(tài)機(jī) 兩個(gè)都可以消抖
回復(fù)

使用道具 舉報(bào)

7#
ID:488334 發(fā)表于 2021-12-29 16:16 | 只看該作者
你可以改成一定時(shí)間內(nèi)計(jì)時(shí)是否按下第二次,比如300ms,不要死循環(huán)在那里等。
回復(fù)

使用道具 舉報(bào)

8#
ID:883031 發(fā)表于 2021-12-29 16:28 | 只看該作者
需要去抖才行,不然速度太快根本無法判斷呀。
回復(fù)

使用道具 舉報(bào)

9#
ID:893997 發(fā)表于 2021-12-29 19:13 來自觸屏版 | 只看該作者
tatachaoren 發(fā)表于 2021-12-29 16:16
你可以改成一定時(shí)間內(nèi)計(jì)時(shí)是否按下第二次,比如300ms,不要死循環(huán)在那里等。

這個(gè)程序默認(rèn)是設(shè)置200毫秒檢測時(shí)間的
回復(fù)

使用道具 舉報(bào)

10#
ID:893997 發(fā)表于 2021-12-29 19:14 來自觸屏版 | 只看該作者
cn_zhx 發(fā)表于 2021-12-29 16:28
需要去抖才行,不然速度太快根本無法判斷呀。

嗯,也是過了,主要還是上面那位朋友說的延時(shí)問題
回復(fù)

使用道具 舉報(bào)

11#
ID:491577 發(fā)表于 2022-1-4 01:39 | 只看該作者
單片機(jī)也玩雙擊?一般用短按和長按比較好,雙擊很難用,經(jīng)常沒有反應(yīng),最好不用。
回復(fù)

使用道具 舉報(bào)

12#
ID:161164 發(fā)表于 2022-1-4 09:21 | 只看該作者
hhh402 發(fā)表于 2022-1-4 01:39
單片機(jī)也玩雙擊?一般用短按和長按比較好,雙擊很難用,經(jīng)常沒有反應(yīng),最好不用。

邏輯清晰
代碼寫得好
就算是雙擊,三擊
都很靈敏,很好用
藍(lán)燈:單擊亮滅
綠燈:雙擊亮滅
黃燈:三擊亮滅



回復(fù)

使用道具 舉報(bào)

13#
ID:57657 發(fā)表于 2022-1-4 10:17 | 只看該作者
你應(yīng)該這樣寫:
  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;       //按鍵按下時(shí)間毫秒 松開清0 最大255
  10. u8 leave = 0;      //按鍵松開時(shí)間 減到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定時(shí)器中斷
  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ù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www欧美| 中文字幕观看 | 欧美日韩 | 免费在线a | 亚洲精品美女 | 精品国产一区二区三区四区 | 黄色小视频免费观看 | 国产精品成人免费精品自在线观看 | 久综合| 亚洲成人精品一区 | 能看毛片的网站 | 精品久久久久久久久久久久久久久久 | 日韩精品视频在线 | 成人在线一区二区 | 亚洲精品第一页 | 欧美在线日韩 | 国产精品日韩欧美 | 亚洲国产精品久久久 | 国产成人tv| 激情综合五月婷婷 | 亚洲综合影院 | 国产自偷自拍 | 欧美日韩综合网 | 在线亚洲天堂 | 国产一区欧美 | 91久久久久久久久久久 | 看一级黄色片 | www欧美| 日韩一区二区精品 | 中文字幕在线观看免费 | 亚洲成a人片 | 国产尤物视频 | 午夜激情视频在线观看 | 黄色三级视频网站 | 亚洲一区二区免费视频 | 成人免费毛片入口 | 欧美一区二区在线视频 | 精品免费在线 | 天天操夜夜操狠狠操 | 国产精品尤物 | 日韩毛片免费看 |