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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6426|回復: 20
打印 上一主題 下一主題
收起左側

單片機怎么實現獨立按鍵長按和短按的不同效果

  [復制鏈接]
跳轉到指定樓層
樓主
我想讓k1長按0.2s后led發光,長按2s后熄滅,為什么下面這個代碼實現不了這個功能


單片機源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
sbit k1=P3^1;
sbit led=P2^1;



void init()
{
        TMOD=0X01;
        TH0=(65536-10000)/256;                                        //10ms
        TL0=(65536-10000)%256;
        EA=1;
        ET0=1;
                TR0=1;
}




void main()
{        
        init();
        while(1)
        {
                while(k1==1)
                {
                        i=0;
                        led=1;
                }
                while(k1==0)
                {
                        if(200>i>20)
                        {
                                led=0;
                        }
                        if(i>=200)
                        {
                                led=1;
                        }
                }
        }  
}

void time() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        i++;

               
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2020-2-27 13:50 | 只看該作者
把中斷里的  i++; 剪貼到  if(200>i>20) 之前試試。
回復

使用道具 舉報

板凳
ID:158375 發表于 2020-2-27 14:04 | 只看該作者
程序結構不合理。
關鍵是:按鍵查詢時沒有消除抖動的處理。
......
回復

使用道具 舉報

地板
ID:170318 發表于 2020-2-27 14:53 | 只看該作者
k1按下后,啟動一個計數器,長按和短按時計數器出來不同的數字,啟動相應的執行程序
回復

使用道具 舉報

5#
ID:672615 發表于 2020-2-27 15:16 | 只看該作者
man1234567 發表于 2020-2-27 13:50
把中斷里的  i++; 剪貼到  if(200>i>20) 之前試試。

不行啊
回復

使用道具 舉報

6#
ID:672615 發表于 2020-2-27 15:27 | 只看該作者
笨笨兔 發表于 2020-2-27 14:04
程序結構不合理。
關鍵是:按鍵查詢時沒有消除抖動的處理。
......

我加了消抖還是不行啊
回復

使用道具 舉報

7#
ID:679425 發表于 2020-2-27 16:32 | 只看該作者
加了消抖還是不行?那等你解決了,不要忘了貼上啊
回復

使用道具 舉報

8#
ID:94031 發表于 2020-2-27 16:59 | 只看該作者
修改了一下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
sbit k1=P3^1;
sbit led=P2^1;

sbit led0=P2^0;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;

sbit led7=P2^7;


void init()
{
                TMOD=0X01;
                TH0=(65536-10000)/256;                                        //10ms
                TL0=(65536-10000)%256;
                EA=1;
                ET0=1;
                TR0=1;
}

void main()
{        
        init();
        while(1)
        {
                if(k1==1)
                {
                        i=0;
                        led=1;
                }
                if(k1==0)
                {
                        if(i < 100)//&&(i!=0)
                        {
                                led=0;
                        }
                        else
                        {
                                led=1;
                        }
                }
        }  
}

void time() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
       
        led7=~led7;
        i++;
}

回復

使用道具 舉報

9#
ID:558309 發表于 2020-2-27 18:23 | 只看該作者
加一個定時判斷啊,先檢測到按鍵按下定時器計時,200ms后在判斷一次,如果按鍵狀態還是按下就點燈,然后2000ms加一次判斷,如果按鍵狀態不變,滅燈,反正就是只要按鍵按下了,就做兩次判斷
回復

使用道具 舉報

10#
ID:213173 發表于 2020-2-27 18:36 | 只看該作者
在你的程序基礎上改的按鍵長短按LED開關
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint i;
  5. sbit k1=P3^1;
  6. sbit led=P2^1;

  7. void init()
  8. {
  9.         TMOD=0X01;
  10.         TH0=(65536-10000)/256;//10ms
  11.         TL0=(65536-10000)%256;
  12.         EA=1;
  13.         ET0=1;
  14.         TR0=1;
  15. }

  16. void main()
  17. {        
  18.         init();
  19.         while(1);  
  20. }

  21. void time() interrupt 1
  22. {
  23.         TH0=(65536-10000)/256;
  24.         TL0=(65536-10000)%256;
  25.         if(!k1)   
  26.         {  
  27.                 if(i<200)
  28.                         i++;
  29.                 if(i>=200)                                //長按2秒以上
  30.                         led=1;
  31.         }  
  32.         else
  33.         {  
  34.                 if(i>20 && i<200)                //短按0.2~2秒
  35.                         led=0;
  36.                 i=0;
  37.         }
  38. }
復制代碼
回復

使用道具 舉報

11#
ID:313294 發表于 2020-2-27 19:02 | 只看該作者
給你分析一下哈,假如按鍵按下為0,led=0時點亮:按下后key后led直接先是無反應,i加到20后點亮,此時不松開等到i加到200,led熄滅。如果一直不松,i值將會溢出,
回復

使用道具 舉報

12#
ID:313294 發表于 2020-2-27 19:07 | 只看該作者
按你說的你這個就是按下后不松,0.2秒后點亮,持續不松,2S后熄滅
問題1:長時間按住i會溢出
問題2:你的這兩個動作都要建立在不松手的前提下,如果松開,無論之前任何狀態,都將變成熄滅
總結:邏輯不對,程序不合理,while里面再套倆while,看著很別扭,推薦switch case了解一下
回復

使用道具 舉報

13#
ID:698938 發表于 2020-2-27 19:39 | 只看該作者
k1按下后,啟動一個計數器,長按和短按時計數器出來不同的數字,啟動相應的執行程序
回復

使用道具 舉報

14#
ID:693716 發表于 2020-2-27 20:54 | 只看該作者
試試改下代碼

新建位圖圖像.png (14.09 KB, 下載次數: 114)

試試改下代碼

試試改下代碼
回復

使用道具 舉報

15#
ID:693716 發表于 2020-2-27 20:56 | 只看該作者
回復慢了,回來再看多出老多的答案,壇子里面高手多呀,祝愿論壇越來越好
回復

使用道具 舉報

16#
ID:465279 發表于 2020-3-7 12:32 | 只看該作者
最近也在學習按鍵這塊就進來看了,題主要的應該不是手一直按著按鍵吧,如果是這樣這個實際用的地方并不多。我理解題主要的應該是短按LED亮、長按滅,看回復多不能實現這樣功能。
回復

使用道具 舉報

17#
ID:468535 發表于 2020-3-7 13:30 來自觸屏版 | 只看該作者
按一次去抖然后按下啟動計數器,松開取值計數器,以此數值判斷并執行相應操作
回復

使用道具 舉報

18#
ID:468535 發表于 2020-3-7 13:33 來自觸屏版 | 只看該作者
注意按鍵處理請在按鍵松開時進行。
回復

使用道具 舉報

19#
ID:624781 發表于 2020-3-31 12:45 | 只看該作者
樓主改好代碼了嗎  能貼一下嗎
回復

使用道具 舉報

20#
ID:624781 發表于 2020-3-31 12:45 | 只看該作者
;樓主完善好代碼了嗎  麻煩貼一下參考
回復

使用道具 舉報

21#
ID:718310 發表于 2020-3-31 22:18 來自觸屏版 | 只看該作者
用一個按鍵檢測函數就可以
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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