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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3957|回復: 26
收起左側

51單片機C語言與按鍵操作的相關問題

[復制鏈接]
ID:792404 發表于 2020-11-3 21:08 | 顯示全部樓層 |閱讀模式
用哪條語句可以實現按鍵按住不放 執行一個操作,松開執行另一個操作?用 if....else...或者if.....while()....這樣的語句都實現不了,大佬們有何高見可以指點一下!
回復

使用道具 舉報

ID:339654 發表于 2020-11-4 00:12 來自觸屏版 | 顯示全部樓層
if(key==1)填語句;else 填語句;
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 07:26 | 顯示全部樓層
weijoyer 發表于 2020-11-4 00:12
if(key==1)填語句;else 填語句;

這個試過了,像這樣子的  if(!key){....} else{.....}    直接這樣不行。后面用while(!key) {.....} 是可以的,但是只能操作一次,第二次就沒用了,也就是執行一次,每次都要斷電在通電才可以。
                                                                                                                                
回復

使用道具 舉報

ID:739545 發表于 2020-11-4 08:58 | 顯示全部樓層
key的設別標志出問題了,一個按著不放的情況用while,脫手的時候要去掉while,或者在while內部再做判斷。
回復

使用道具 舉報

ID:654028 發表于 2020-11-4 09:13 | 顯示全部樓層
要加計數,丟定時器中斷里面檢測按鍵
if(按鍵按下){
  計數加;
  if(計數到了長按){
    執行長按語句
   }
}
else{
    if(計數到了長按){
      計數清0
   }
     if(計數到了短按){
      計數清0
      執行短按語句
   }
}

回復

使用道具 舉報

ID:792404 發表于 2020-11-4 10:03 | 顯示全部樓層
lovezjf234 發表于 2020-11-4 08:58
key的設別標志出問題了,一個按著不放的情況用while,脫手的時候要去掉while,或者在while內部再做判斷。

在while內部判斷可以了,但是初始狀態就開始檢測了,這個不對的,就是上電后按鍵是松開狀態,不要檢測,等到按下不放時檢測一種狀態,松開后在檢測松開后的狀態。
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 10:04 | 顯示全部樓層
心有浮生 發表于 2020-11-4 09:13
要加計數,丟定時器中斷里面檢測按鍵
if(按鍵按下){
  計數加;

謝謝指導!現在是在while內部判斷可以了,但是初始狀態就開始檢測了,這個不對的,就是上電后按鍵是松開狀態,不要檢測,等到按下不放時檢測一種狀態,松開后在檢測松開后的狀態。
回復

使用道具 舉報

ID:654028 發表于 2020-11-4 10:27 | 顯示全部樓層
YUANYUXING 發表于 2020-11-4 10:04
謝謝指導!現在是在while內部判斷可以了,但是初始狀態就開始檢測了,這個不對的,就是上電后按鍵是松開 ...

加個標志位。
回復

使用道具 舉報

ID:213173 發表于 2020-11-4 10:49 | 顯示全部樓層
給你一個示例程序,完全能夠解決你的問題。核心是要學會使用標志位。
#include <reg51.H>

sbit key=P3^4;//按實際電路自行定義

unsigned int count;//消抖計數變量
bit key_sign;        //按鍵操作狀態標志

void main()
{
        while(1)
        {
                if(!key)//按下
                {
                        if(++count>=1500 && key_sign==0)//約10ms消抖
                        {
                                key_sign=1;//記憶操作狀態
                                P1=0xaa;        //任務1
                        }
                }
                else   //松手
                {
                        count=0;                //計數清0
                        if(key_sign==1) //判斷是先按下后松手
                        {
                                key_sign=0; //狀態標志復位
                                P1=0x55;        //任務2
                        }
                }
        }
}
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 10:56 | 顯示全部樓層

好的,我在試一下,謝謝
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 11:01 | 顯示全部樓層
wulin 發表于 2020-11-4 10:49
給你一個示例程序,完全能夠解決你的問題。核心是要學會使用標志位。
#include

感謝總工指導,我試一下
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 13:01 | 顯示全部樓層
YUANYUXING 發表于 2020-11-4 11:01
感謝總工指導,我試一下

現在可以了,的確是要加個標志位,感謝!
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 13:02 | 顯示全部樓層

現在可以了,加個標志位就正常了,感謝指點!
回復

使用道具 舉報

ID:654028 發表于 2020-11-4 13:04 | 顯示全部樓層
YUANYUXING 發表于 2020-11-4 13:02
現在可以了,加個標志位就正常了,感謝指點!

我自己的程序一開始也是有問題,后來加了標志位搞定的
回復

使用道具 舉報

ID:89217 發表于 2020-11-4 13:21 | 顯示全部樓層
直接P11=P10也可以啊
回復

使用道具 舉報

ID:137736 發表于 2020-11-4 17:27 | 顯示全部樓層
設置標志位,不要讓程序老盯住按鍵處理。
回復

使用道具 舉報

ID:137736 發表于 2020-11-4 17:28 | 顯示全部樓層
學習學習狀態機,論壇有大佬寫的詳細教程。
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 19:34 | 顯示全部樓層
zmc419 發表于 2020-11-4 17:27
設置標志位,不要讓程序老盯住按鍵處理。

現在正常了,加了標志位一切OK,感謝指點
回復

使用道具 舉報

ID:792404 發表于 2020-11-4 19:37 | 顯示全部樓層
zmc419 發表于 2020-11-4 17:28
學習學習狀態機,論壇有大佬寫的詳細教程。

現在搞定了,謝謝
回復

使用道具 舉報

ID:838969 發表于 2020-11-4 20:06 | 顯示全部樓層
按鍵時間加一個延時之類的防抖措施看看
回復

使用道具 舉報

ID:738987 發表于 2020-11-4 21:18 | 顯示全部樓層
判斷循環語句都可,也可以用中斷
回復

使用道具 舉報

ID:738987 發表于 2020-11-4 21:19 | 顯示全部樓層
判斷循環語句都可以,也可以用中斷
回復

使用道具 舉報

ID:738987 發表于 2020-11-4 21:20 | 顯示全部樓層
判斷循環選擇語句都可以,也可以用中斷
回復

使用道具 舉報

ID:792404 發表于 2020-11-5 18:42 | 顯示全部樓層
tooto 發表于 2020-11-4 20:06
按鍵時間加一個延時之類的防抖措施看看

謝謝,已經搞定了
回復

使用道具 舉報

ID:792404 發表于 2020-11-5 18:43 | 顯示全部樓層
comeon劉 發表于 2020-11-4 21:20
判斷循環選擇語句都可以,也可以用中斷

謝謝,已經找到方法了,加個標志位就好了
回復

使用道具 舉報

ID:851329 發表于 2020-12-17 21:29 | 顯示全部樓層
# include "reg52.h"

sbit GK1=P3^0;
sbit GK2=P3^1;
sbit GK3=P3^2;
sbit GK4=P3^3;

static unsigned char keyvalue = 0xFF;
static unsigned char keystatus = 0;

void delay(unsigned int i)
{
  while(i--);
}

void keyScan(void)
{  
        static unsigned char counter = 0;
        static unsigned char keytmp  = 0;

        switch(keystatus)
        {
                case 0:
                        if((GK1 == 0) || (GK2 == 0) || (GK3 == 0) || (GK4 == 0))
                        {
                                keystatus = 1;
                        }
                        break;
                case 1:
                        if(GK1 == 0)
                        {
                                keytmp = 1;
                                keystatus = 2;                               
                        }
                        else if(GK2 == 0){
                                keytmp = 2;
                                keystatus = 2;
                        }
                        else if(GK3 == 0){
                                keytmp = 3;
                                keystatus = 2;
                        }
                        else if(GK4 == 0){
                                keytmp = 4;
                                keystatus = 2;
                        }
                        else
                        {
                                keystatus = 0;       
                        }
                        break;
                case 2:
                        if((GK1 == 1) && (GK2 == 1) && (GK3 == 1) && (GK4 == 1))
                        {

                                if(counter < 40)
                                {
                                        counter = 0;
                                        keystatus = 0;
                                        keyvalue = keytmp;
                                }
                                else
                                {
                                        counter = 0;
                                        keystatus = 0;
                                        keyvalue = 4 + keytmp ;        // keyval 5-8
                                }
                        }
                        else
                        {
                                if(counter < 40)
                                {
                                        ++counter;
                                }
                        }
                        break;

        }
}
void taskProcessKey(void)
{
        unsigned char value = keyvalue;

        if(value != 255)
        {
                switch(keyvalue)
                {
                        case 1:P2=0x00; break;
                        case 5:P2=0xab; break;
                        default:break;
                }
        }
}

int main(void)
{
  while(1)
  {
     keyScan();
     delay(2000);
     taskProcessKey();
  }
}
這個是我控制單片機上長按和短按的一個程序,希望對你有用。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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