找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)C語(yǔ)言與按鍵操作的相關(guān)問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:792404 發(fā)表于 2020-11-3 21:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用哪條語(yǔ)句可以實(shí)現(xiàn)按鍵按住不放 執(zhí)行一個(gè)操作,松開執(zhí)行另一個(gè)操作?用 if....else...或者if.....while()....這樣的語(yǔ)句都實(shí)現(xiàn)不了,大佬們有何高見可以指點(diǎn)一下!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:339654 發(fā)表于 2020-11-4 00:12 來自手機(jī) | 只看該作者
if(key==1)填語(yǔ)句;else 填語(yǔ)句;
回復(fù)

使用道具 舉報(bào)

板凳
ID:792404 發(fā)表于 2020-11-4 07:26 | 只看該作者
weijoyer 發(fā)表于 2020-11-4 00:12
if(key==1)填語(yǔ)句;else 填語(yǔ)句;

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

使用道具 舉報(bào)

地板
ID:739545 發(fā)表于 2020-11-4 08:58 | 只看該作者
key的設(shè)別標(biāo)志出問題了,一個(gè)按著不放的情況用while,脫手的時(shí)候要去掉while,或者在while內(nèi)部再做判斷。
回復(fù)

使用道具 舉報(bào)

5#
ID:654028 發(fā)表于 2020-11-4 09:13 | 只看該作者
要加計(jì)數(shù),丟定時(shí)器中斷里面檢測(cè)按鍵
if(按鍵按下){
  計(jì)數(shù)加;
  if(計(jì)數(shù)到了長(zhǎng)按){
    執(zhí)行長(zhǎng)按語(yǔ)句
   }
}
else{
    if(計(jì)數(shù)到了長(zhǎng)按){
      計(jì)數(shù)清0
   }
     if(計(jì)數(shù)到了短按){
      計(jì)數(shù)清0
      執(zhí)行短按語(yǔ)句
   }
}

回復(fù)

使用道具 舉報(bào)

6#
ID:792404 發(fā)表于 2020-11-4 10:03 | 只看該作者
lovezjf234 發(fā)表于 2020-11-4 08:58
key的設(shè)別標(biāo)志出問題了,一個(gè)按著不放的情況用while,脫手的時(shí)候要去掉while,或者在while內(nèi)部再做判斷。

在while內(nèi)部判斷可以了,但是初始狀態(tài)就開始檢測(cè)了,這個(gè)不對(duì)的,就是上電后按鍵是松開狀態(tài),不要檢測(cè),等到按下不放時(shí)檢測(cè)一種狀態(tài),松開后在檢測(cè)松開后的狀態(tài)。
回復(fù)

使用道具 舉報(bào)

7#
ID:792404 發(fā)表于 2020-11-4 10:04 | 只看該作者
心有浮生 發(fā)表于 2020-11-4 09:13
要加計(jì)數(shù),丟定時(shí)器中斷里面檢測(cè)按鍵
if(按鍵按下){
  計(jì)數(shù)加;

謝謝指導(dǎo)!現(xiàn)在是在while內(nèi)部判斷可以了,但是初始狀態(tài)就開始檢測(cè)了,這個(gè)不對(duì)的,就是上電后按鍵是松開狀態(tài),不要檢測(cè),等到按下不放時(shí)檢測(cè)一種狀態(tài),松開后在檢測(cè)松開后的狀態(tài)。
回復(fù)

使用道具 舉報(bào)

8#
ID:654028 發(fā)表于 2020-11-4 10:27 | 只看該作者
YUANYUXING 發(fā)表于 2020-11-4 10:04
謝謝指導(dǎo)!現(xiàn)在是在while內(nèi)部判斷可以了,但是初始狀態(tài)就開始檢測(cè)了,這個(gè)不對(duì)的,就是上電后按鍵是松開 ...

加個(gè)標(biāo)志位。
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2020-11-4 10:49 | 只看該作者
給你一個(gè)示例程序,完全能夠解決你的問題。核心是要學(xué)會(huì)使用標(biāo)志位。
#include <reg51.H>

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

unsigned int count;//消抖計(jì)數(shù)變量
bit key_sign;        //按鍵操作狀態(tài)標(biāo)志

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

使用道具 舉報(bào)

10#
ID:792404 發(fā)表于 2020-11-4 10:56 | 只看該作者
心有浮生 發(fā)表于 2020-11-4 10:27
加個(gè)標(biāo)志位。

好的,我在試一下,謝謝
回復(fù)

使用道具 舉報(bào)

11#
ID:792404 發(fā)表于 2020-11-4 11:01 | 只看該作者
wulin 發(fā)表于 2020-11-4 10:49
給你一個(gè)示例程序,完全能夠解決你的問題。核心是要學(xué)會(huì)使用標(biāo)志位。
#include

感謝總工指導(dǎo),我試一下
回復(fù)

使用道具 舉報(bào)

12#
ID:792404 發(fā)表于 2020-11-4 13:01 | 只看該作者
YUANYUXING 發(fā)表于 2020-11-4 11:01
感謝總工指導(dǎo),我試一下

現(xiàn)在可以了,的確是要加個(gè)標(biāo)志位,感謝!
回復(fù)

使用道具 舉報(bào)

13#
ID:792404 發(fā)表于 2020-11-4 13:02 | 只看該作者
心有浮生 發(fā)表于 2020-11-4 10:27
加個(gè)標(biāo)志位。

現(xiàn)在可以了,加個(gè)標(biāo)志位就正常了,感謝指點(diǎn)!
回復(fù)

使用道具 舉報(bào)

14#
ID:654028 發(fā)表于 2020-11-4 13:04 | 只看該作者
YUANYUXING 發(fā)表于 2020-11-4 13:02
現(xiàn)在可以了,加個(gè)標(biāo)志位就正常了,感謝指點(diǎn)!

我自己的程序一開始也是有問題,后來加了標(biāo)志位搞定的
回復(fù)

使用道具 舉報(bào)

15#
ID:89217 發(fā)表于 2020-11-4 13:21 | 只看該作者
直接P11=P10也可以啊
回復(fù)

使用道具 舉報(bào)

16#
ID:137736 發(fā)表于 2020-11-4 17:27 | 只看該作者
設(shè)置標(biāo)志位,不要讓程序老盯住按鍵處理。
回復(fù)

使用道具 舉報(bào)

17#
ID:137736 發(fā)表于 2020-11-4 17:28 | 只看該作者
學(xué)習(xí)學(xué)習(xí)狀態(tài)機(jī),論壇有大佬寫的詳細(xì)教程。
回復(fù)

使用道具 舉報(bào)

18#
ID:792404 發(fā)表于 2020-11-4 19:34 | 只看該作者
zmc419 發(fā)表于 2020-11-4 17:27
設(shè)置標(biāo)志位,不要讓程序老盯住按鍵處理。

現(xiàn)在正常了,加了標(biāo)志位一切OK,感謝指點(diǎn)
回復(fù)

使用道具 舉報(bào)

19#
ID:792404 發(fā)表于 2020-11-4 19:37 | 只看該作者
zmc419 發(fā)表于 2020-11-4 17:28
學(xué)習(xí)學(xué)習(xí)狀態(tài)機(jī),論壇有大佬寫的詳細(xì)教程。

現(xiàn)在搞定了,謝謝
回復(fù)

使用道具 舉報(bào)

20#
ID:838969 發(fā)表于 2020-11-4 20:06 | 只看該作者
按鍵時(shí)間加一個(gè)延時(shí)之類的防抖措施看看
回復(fù)

使用道具 舉報(bào)

21#
ID:738987 發(fā)表于 2020-11-4 21:18 | 只看該作者
判斷循環(huán)語(yǔ)句都可,也可以用中斷
回復(fù)

使用道具 舉報(bào)

22#
ID:738987 發(fā)表于 2020-11-4 21:19 | 只看該作者
判斷循環(huán)語(yǔ)句都可以,也可以用中斷
回復(fù)

使用道具 舉報(bào)

23#
ID:738987 發(fā)表于 2020-11-4 21:20 | 只看該作者
判斷循環(huán)選擇語(yǔ)句都可以,也可以用中斷
回復(fù)

使用道具 舉報(bào)

24#
ID:792404 發(fā)表于 2020-11-5 18:42 | 只看該作者
tooto 發(fā)表于 2020-11-4 20:06
按鍵時(shí)間加一個(gè)延時(shí)之類的防抖措施看看

謝謝,已經(jīng)搞定了
回復(fù)

使用道具 舉報(bào)

25#
ID:792404 發(fā)表于 2020-11-5 18:43 | 只看該作者
comeon劉 發(fā)表于 2020-11-4 21:20
判斷循環(huán)選擇語(yǔ)句都可以,也可以用中斷

謝謝,已經(jīng)找到方法了,加個(gè)標(biāo)志位就好了
回復(fù)

使用道具 舉報(bào)

26#
ID:851329 發(fā)表于 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();
  }
}
這個(gè)是我控制單片機(jī)上長(zhǎng)按和短按的一個(gè)程序,希望對(duì)你有用。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表