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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

使用道具 舉報

沙發
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內部再做判斷。
回復

使用道具 舉報

5#
ID:654028 發表于 2020-11-4 09:13 | 只看該作者
要加計數,丟定時器中斷里面檢測按鍵
if(按鍵按下){
  計數加;
  if(計數到了長按){
    執行長按語句
   }
}
else{
    if(計數到了長按){
      計數清0
   }
     if(計數到了短按){
      計數清0
      執行短按語句
   }
}

回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

加個標志位。
回復

使用道具 舉報

9#
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
                        }
                }
        }
}
回復

使用道具 舉報

10#
ID:792404 發表于 2020-11-4 10:56 | 只看該作者

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

13#
ID:792404 發表于 2020-11-4 13:02 | 只看該作者

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

使用道具 舉報

14#
ID:654028 發表于 2020-11-4 13:04 | 只看該作者
YUANYUXING 發表于 2020-11-4 13:02
現在可以了,加個標志位就正常了,感謝指點!

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

17#
ID:137736 發表于 2020-11-4 17:28 | 只看該作者
學習學習狀態機,論壇有大佬寫的詳細教程。
回復

使用道具 舉報

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

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

使用道具 舉報

19#
ID:792404 發表于 2020-11-4 19:37 | 只看該作者
zmc419 發表于 2020-11-4 17:28
學習學習狀態機,論壇有大佬寫的詳細教程。

現在搞定了,謝謝
回復

使用道具 舉報

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

使用道具 舉報

21#
ID:738987 發表于 2020-11-4 21:18 | 只看該作者
判斷循環語句都可,也可以用中斷
回復

使用道具 舉報

22#
ID:738987 發表于 2020-11-4 21:19 | 只看該作者
判斷循環語句都可以,也可以用中斷
回復

使用道具 舉報

23#
ID:738987 發表于 2020-11-4 21:20 | 只看該作者
判斷循環選擇語句都可以,也可以用中斷
回復

使用道具 舉報

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

謝謝,已經搞定了
回復

使用道具 舉報

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

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

使用道具 舉報

26#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人在线 | 91精品国产91 | 精品久久久久久亚洲综合网站 | 国产精品亚洲一区二区三区在线观看 | 久久精品国产亚洲一区二区 | 成人免费网站 | 一区在线免费视频 | 国产精品久久久乱弄 | 精品久久影院 | 亚洲视频免费在线看 | 日韩喷潮 | 五月激情综合网 | 一区二区三区在线免费 | 草草草影院 | 精品粉嫩aⅴ一区二区三区四区 | 欧美性视频在线播放 | 午夜久久久久久久久久一区二区 | 久久最新 | 久草免费在线 | 成年人免费看 | 国产精品久久久久久久久久久久 | www日本在线观看 | 亚洲人成免费 | 欧美日韩高清在线一区 | 亚洲午夜精品视频 | 国产视频一区在线 | 特a毛片 | 日韩成人在线一区 | 国产精品日韩欧美 | 天天看天天爽 | 一区二区三区免费 | 亚洲国产日本 | 91麻豆精品国产91久久久更新资源速度超快 | 少妇精品亚洲一区二区成人 | 狠狠爱免费视频 | 亚洲成人一区二区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品乱码 | 成人在线观看免费 | 日本网站免费观看 | 91精品国产综合久久久久久漫画 |