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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機如何檢測K1,K2按鍵同時按下,觸發(fā)LED反轉(zhuǎn),且不影響k1,與k2單獨工作

  [復(fù)制鏈接]
ID:544423 發(fā)表于 2019-6-17 09:52 | 顯示全部樓層 |閱讀模式
2黑幣
      單片機如何檢測K1,K2同時按下,觸發(fā)LED反轉(zhuǎn),且不影響k1,與k2單獨工作

        if(k1==0)                  //檢測按鍵K1是否按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if((k1||k2)==0)
                {
                        led=~led;          //led狀態(tài)取反
                }
        }


                  if(k1==0)                  //檢測按鍵K1是否按下
                        {        
                                delay(1000);   //消除抖動 一般大約10ms
                                if(k1==0)         //再次判斷按鍵是否按下
                                {
                                        led1=~led1;          //led1狀態(tài)取反
                                }
                                while(!k1);         //檢測按鍵是否松開
                        }
                        
                        if(k2==0)                  //檢測按鍵K1是否按下
                        {        
                                delay(1000);   //消除抖動 一般大約10ms
                                if(k2==0)         //再次判斷按鍵是否按下
                                {
                                        led2=~led2;          //led2狀態(tài)取反
                                }
                                while(!k2);         //檢測按鍵是否松開
                        }


回復(fù)

使用道具 舉報

ID:564322 發(fā)表于 2019-6-17 10:51 | 顯示全部樓層
if(k1==0)                  //檢測按鍵K1是否按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if(k2==0)
                {
                        led=~led;          //led狀態(tài)取反
                }                 else    led1=~led1;
        }

if(k2==0)                  //檢測按鍵K2是否按下
                        {        
                                delay(1000);   //消除抖動 一般大約10ms
                                if(k1==0)      
                                {
                                        led=~led;          //led2狀態(tài)取反
                                }

                               else  led2=~led2;  
                        }
回復(fù)

使用道具 舉報

ID:429136 發(fā)表于 2019-6-17 11:54 | 顯示全部樓層
if(K1==0)  KEY=1;
if(K1==0)  KEY=2;
if(K1==0&&K2==0)  KEY=3;

消抖啥的自己加
回復(fù)

使用道具 舉報

ID:544423 發(fā)表于 2019-6-17 14:52 | 顯示全部樓層
Shayven 發(fā)表于 2019-6-17 11:54
if(K1==0)  KEY=1;
if(K1==0)  KEY=2;
if(K1==0&&K2==0)  KEY=3;

#include  "reg52.h"

typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;

sbit k1=P3^1;         //定義P31口是k1
sbit k2=P3^0;         //定義P30口是k2
sbit led=P2^0;         //定義P20口是led
sbit led1=P2^1;         //定義P21口是led1
sbit led2=P2^2;         //定義P22口是led2

void delay(u16 i)
{
        while(i--);       
}

int key,linshizhi;

void keypros()
{
                 if(k1==0)                  //檢測按鍵K1是否按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if(k1==0)      
                {
                 key=1;         
                }  
        }

          if(k2==0)                  //檢測按鍵K2是否按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if(k2==0)      
                {
                   key=2;      
                }  
        }

                 if(k1==0&&k2==0)                  //檢測按鍵K1,K2是否按下
        {        
            delay(1000);   //消除抖動 一般大約10ms
            if(k1==0&&k2==0)
            {
               key=3;      
            }      
        }
}

void xianshi()
{
   linshizhi=key;
   if(linshizhi==1){led=~led;}
   if(linshizhi==2){led1=~led1;}
   if(linshizhi==3){led2=~led2;}
   key=0;
}



void main()
{       
        while(1)
        {       
                keypros();  //按鍵處理函數(shù)
                xianshi();       
        }               
}
        實際實現(xiàn)不了


回復(fù)

使用道具 舉報

ID:544423 發(fā)表于 2019-6-17 14:56 | 顯示全部樓層
電子菜 發(fā)表于 2019-6-17 10:51
if(k1==0)                  //檢測按鍵K1是否按下
        {        
                delay(1000);    ...

void keypros()
{
         if(k1==0)                  //檢測按鍵K1是否按下
        {        
        delay(1000);   //消除抖動 一般大約10ms
                if(k2==0)
                {
                     led=~led;          //led狀態(tài)取反
                }   else    led1=~led1;
        }

        if(k2==0)                  //檢測按鍵K2是否按下
        {        
        delay(1000);   //消除抖動 一般大約10ms
                if(k1==0)      
                {
                led=~led;          //led2狀態(tài)取反
                }  else  led2=~led2;               
        }               
}

   現(xiàn)象不理想
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2019-6-17 19:34 | 顯示全部樓層
同時按下用“與邏輯”不是用“或邏輯”
回復(fù)

使用道具 舉報

ID:517466 發(fā)表于 2019-6-17 22:46 | 顯示全部樓層
樓主代碼中的第一個判斷中
if(k1==0)                  //檢測按鍵K1是否按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if((k1||k2)==0)
                {
                        led=~led;          //led狀態(tài)取反
                }
        }
改成
if(k1==0 && k2==0)                  //檢測按鍵K1和K2是否同時按下
        {        
                delay(1000);   //消除抖動 一般大約10ms
                if(k1==0 && k2==0)  //檢測按鍵K1和K2是否同時按下
                {
                        led=~led;          //按鍵K1和K2同時按下, led狀態(tài)取反
                }
        }
即可
回復(fù)

使用道具 舉報

ID:544423 發(fā)表于 2019-6-18 06:40 | 顯示全部樓層
與不是“&&”這個嗎
回復(fù)

使用道具 舉報

ID:56665 發(fā)表于 2019-6-18 08:13 | 顯示全部樓層
你的程序K1 K2單獨按下也可以使LED取反,兩個同時按下也是,要用&&。
回復(fù)

使用道具 舉報

ID:565305 發(fā)表于 2019-6-18 09:21 | 顯示全部樓層
本帖最后由 egypt 于 2019-6-18 17:31 編輯

多兩個變量,記錄按住時間長度,不會阻塞其它流程,這種邏輯最簡單了

int  k1_count=0, k2_count=0;  

while(1)
{        // 注意 int 在 16bit 機器上可能會超過 32768 變成負數(shù)所以下文有30000這個常數(shù)
     if(k1==0) { if(k1_count<30000) k1_count++; } else k1_count=0;
     if(k2==0) { if(k2_count<30000) k2_count++; } else k2_count=0;
     
     // 所謂同時按下,代表 k1_count 和 k2_count 都位于 10ms-20ms 之間(10ms的去抖時間)
     // 假設(shè)一個先按了20ms 還沒松開,另外一個再按下,那就不叫同時,叫先后按下
     // 去抖可以通過連續(xù)性判斷得到。k1_count 自加不滿 10次(每ms算一次)那就是接觸不好
     // 補充 k1_count k2_count 賦值是為了防止不停重入。可以根據(jù)實際情況自行調(diào)整合理方案
     if( k1_count>=10 && k1_count<20 && k2_count>=10 && k2_count<20)
     {    led=~led;
          k1_count=30000; k2_count=30000;
     }
     ... delay(1ms); ...
}
回復(fù)

使用道具 舉報

ID:564322 發(fā)表于 2019-6-18 09:21 | 顯示全部樓層
18796492606 發(fā)表于 2019-6-17 14:56
void keypros()
{
         if(k1==0)                  //檢測按鍵K1是否按下

具體現(xiàn)象是什么?
回復(fù)

使用道具 舉報

ID:565305 發(fā)表于 2019-6-18 10:28 | 顯示全部樓層
我補充一下我回復(fù)的 10樓

*   關(guān)于去抖,回復(fù)中這種以連續(xù)性計時作為按下依據(jù),并不是最好(分時間片1ms能否準時、以抖動第一次作為計時依據(jù)之類的前置條件等),但是誤差也不大

*   關(guān)于人手按鍵,記憶中任天堂的游戲手柄有人可以按出17下每秒,一般人12-13下。兩次按鍵間隔差不多有 60ms 吧

*   所以如果覺得代碼中同時性條件太苛刻,可以把程序中 20 的數(shù)字改大,如 40 或 50 吧,以測試為準
回復(fù)

使用道具 舉報

ID:564631 發(fā)表于 2019-6-18 16:20 | 顯示全部樓層
加多一條 if(看)
回復(fù)

使用道具 舉報

ID:564631 發(fā)表于 2019-6-18 16:21 | 顯示全部樓層
if(k1==0&&k2==0)  led=~led;  主體內(nèi)容就就是這樣,加多一條就可以實現(xiàn)了
回復(fù)

使用道具 舉報

ID:565305 發(fā)表于 2019-6-18 18:12 | 顯示全部樓層
quanquan12 發(fā)表于 2019-6-18 16:21
if(k1==0&&k2==0)  led=~led;  主體內(nèi)容就就是這樣,加多一條就可以實現(xiàn)了

關(guān)鍵是判斷 “同時按下瞬間”

如果 k1==0 和 k2==0 這樣判斷的話,按住 k1 和 k2 一個小時也會進 led 切換,按住一天也會進 led 切換的
回復(fù)

使用道具 舉報

ID:452821 發(fā)表于 2019-6-18 18:56 | 顯示全部樓層
18796492606 發(fā)表于 2019-6-17 14:52
#include  "reg52.h"

typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義

這樣不會一直在反轉(zhuǎn)嗎,看上去也就一直是亮的,你可以在按鍵的時候加一步?jīng)]有按鍵按下的時候key為0,這樣顯示的時候只有檢測到key為0之后的下一步才判斷鍵值,不然不判斷就不會一直反轉(zhuǎn)看上去一直亮了
回復(fù)

使用道具 舉報

ID:517466 發(fā)表于 2019-6-18 21:14 | 顯示全部樓層
我的記憶中,消抖處理一般是20ms。
回復(fù)

使用道具 舉報

ID:207421 發(fā)表于 2019-6-18 22:28 | 顯示全部樓層
流程:
1. 判斷K1
2. 判斷K2
3. 判斷K1和K2
以上邏輯都不通,按K1,后面的K2是執(zhí)行不了的,當你K1執(zhí)行成功了,那么兩個按鍵同時按下,那就邏輯錯誤了,不可能跳過執(zhí)行,用兩個中斷,配合時間間隙和標志位,可能行吧,很有可能還要用到GOTO
回復(fù)

使用道具 舉報

ID:566255 發(fā)表于 2019-6-18 23:47 | 顯示全部樓層
查一下相關(guān)書籍也可以
回復(fù)

使用道具 舉報

ID:565305 發(fā)表于 2019-6-19 08:37 | 顯示全部樓層
suncat0504 發(fā)表于 2019-6-18 21:14
我的記憶中,消抖處理一般是20ms。

要看樓主的按鍵是什么樣的,便宜的軟膠墊碳膜,印象中差異比較大,鍋仔片的就好些

在示波器量一下波形可以大致看出要去抖的時間去這兒看看別人是怎么測試的吧:
https://blog.csdn.net/xu8023636/article/details/79219880
回復(fù)

使用道具 舉報

ID:429136 發(fā)表于 2019-6-19 11:00 | 顯示全部樓層
18796492606 發(fā)表于 2019-6-17 14:52
#include  "reg52.h"

typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義

if(K1==0&&K2==0)  KEY=3;
else if(K1==0)  KEY=1;
else KEY=2;
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美aaaa视频 | 中文字幕在线看人 | 国产精品一区二区欧美黑人喷潮水 | 久久69精品久久久久久久电影好 | 国产美女特级嫩嫩嫩bbb片 | 国产精品1区 | 日韩高清一区二区 | 看片地址 | 最新日韩欧美 | 亚洲久久 | 91精品久久久久久久久中文字幕 | 黄色一级片视频 | 一级片av | 亚洲人成人网 | 欧美成人精品一区二区男人看 | 午夜精品久久久久久久星辰影院 | 亚洲精品一区二区三区蜜桃久 | 欧美性大战久久久久久久蜜臀 | 二区在线观看 | 国产高清在线精品一区二区三区 | 色综合天天天天做夜夜夜夜做 | 日本不卡一区 | 国产高清免费视频 | 91精品国产综合久久久久 | 国产在线一区二区 | 日日骚av | a级网站| 精品欧美一区二区三区久久久 | 欧美日韩精品一区二区天天拍 | 国产一区免费视频 | 丁香五月网久久综合 | 久久久久久国产精品免费免费狐狸 | 中文字幕第一页在线 | 天天天操 | 国产日韩欧美精品一区二区三区 | www.99精品 | 无码日韩精品一区二区免费 | 北条麻妃99精品青青久久 | 91色视频在线观看 | 欧美精品一区二区三区蜜桃视频 | 日韩欧美专区 |