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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3509|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩午夜精品 | 激情六月丁香 | 久久久久欧美 | 国产特级毛片aaaaaa | 激情欧美一区二区三区中文字幕 | 在线看无码的免费网站 | 一区二区三区视频在线 | 成人日b视频 | 一级特黄视频 | 国产精品成av人在线视午夜片 | 亚洲一区中文字幕 | 99精品热视频 | 日韩中文一区二区三区 | 亚洲社区在线 | 免费精品久久久久久中文字幕 | 午夜视频网 | 亚洲国产精久久久久久久 | 色爱区综合| 国产视频一区二区三区四区五区 | 久草福利| 欧美aa在线| 九九视频在线观看 | 国产成人在线视频 | 国产精品国产a级 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 精品亚洲一区二区三区 | 日韩一区二区在线视频 | 天堂色 | 日本福利视频免费观看 | 欧美a在线| 国产99久久| 精品国产乱码久久久久久图片 | a级片播放 | 久久九精品 | 精品一区二区三区在线观看国产 | 极品粉嫩国产48尤物在线播放 | 最新中文字幕久久 | 中文字幕一区二区三区四区五区 | 色综合天天天天做夜夜夜夜做 | 亚洲天堂久久 | 北条麻妃一区二区三区在线观看 |