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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6117|回復: 20
收起左側

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

  [復制鏈接]
ID:672615 發表于 2020-2-27 11:10 | 顯示全部樓層 |閱讀模式
我想讓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++;

               
}

回復

使用道具 舉報

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按下后,啟動一個計數器,長按和短按時計數器出來不同的數字,啟動相應的執行程序
回復

使用道具 舉報

ID:672615 發表于 2020-2-27 15:16 | 顯示全部樓層
man1234567 發表于 2020-2-27 13:50
把中斷里的  i++; 剪貼到  if(200>i>20) 之前試試。

不行啊
回復

使用道具 舉報

ID:672615 發表于 2020-2-27 15:27 | 顯示全部樓層
笨笨兔 發表于 2020-2-27 14:04
程序結構不合理。
關鍵是:按鍵查詢時沒有消除抖動的處理。
......

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

使用道具 舉報

ID:679425 發表于 2020-2-27 16:32 | 顯示全部樓層
加了消抖還是不行?那等你解決了,不要忘了貼上啊
回復

使用道具 舉報

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++;
}

回復

使用道具 舉報

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

使用道具 舉報

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. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:698938 發表于 2020-2-27 19:39 | 顯示全部樓層
k1按下后,啟動一個計數器,長按和短按時計數器出來不同的數字,啟動相應的執行程序
回復

使用道具 舉報

ID:693716 發表于 2020-2-27 20:54 | 顯示全部樓層
試試改下代碼

試試改下代碼

試試改下代碼
回復

使用道具 舉報

ID:693716 發表于 2020-2-27 20:56 | 顯示全部樓層
回復慢了,回來再看多出老多的答案,壇子里面高手多呀,祝愿論壇越來越好
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:468535 發表于 2020-3-7 13:33 來自觸屏版 | 顯示全部樓層
注意按鍵處理請在按鍵松開時進行。
回復

使用道具 舉報

ID:624781 發表于 2020-3-31 12:45 | 顯示全部樓層
樓主改好代碼了嗎  能貼一下嗎
回復

使用道具 舉報

ID:624781 發表于 2020-3-31 12:45 | 顯示全部樓層
;樓主完善好代碼了嗎  麻煩貼一下參考
回復

使用道具 舉報

ID:718310 發表于 2020-3-31 22:18 來自觸屏版 | 顯示全部樓層
用一個按鍵檢測函數就可以
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看特色大片免费网站 | 久久一二 | 国产一区二区三区免费观看视频 | 亚洲一区二区三区视频 | 日韩精品人成在线播放 | 精品一区二区三区四区五区 | 中日韩av | 国产一区二区在线播放 | 日韩欧美国产不卡 | 日韩电影免费观看中文字幕 | 欧美日韩中文字幕在线 | 精品视频久久久久久 | 成人免费观看视频 | 精品国产91乱码一区二区三区 | 国产区免费视频 | 天堂成人av | 日韩成人精品在线观看 | 在线免费黄色小视频 | 精品国产欧美日韩不卡在线观看 | 中文天堂网 | 久久久久久久久国产精品 | 欧美日韩国产欧美 | 亚洲精品片 | 国产片侵犯亲女视频播放 | 日韩视频高清 | 国产传媒在线播放 | 欧美一级免费看 | 操操网站 | 黄视频国产 | 成人午夜高清 | 91福利在线观看 | 一区二区av| 中文字幕在线免费观看 | 久久精品国产一区二区三区 | 久色网 | 午夜寂寞影院在线观看 | 日本三级在线 | 亚洲日韩中文字幕一区 | 久久久久久亚洲精品 | 久久国内精品 | 亚洲国产中文字幕 |