標題: 獨立按鍵的問題,請幫忙看看。 [打印本頁]

作者: XUSHENG    時間: 2014-7-12 13:11
標題: 獨立按鍵的問題,請幫忙看看。
    獨立按鍵控制LED亮和滅,按下按鍵,LED亮,再按下,LED滅。因為我們很多都是按完按鍵,松開手LED才亮。 我現(xiàn)在是想一按按鍵,LED就亮或滅,這個又怎么寫呢?While(!D)這句是松手之后,LED亮或滅,但是,如果去掉這一句松手檢測,那按鍵就不靈活了,有時行,有時不行,有時要按很多次才亮或者滅,請朋友們幫幫忙,要怎樣改才正確?謝謝。下面是程序
void main()
{
    static bit temp;
BZ=1;
D=1;
temp=BZ;
while(1)
  {
    if(D==0)
    {
    Delay(10);
     if(D==0)
        {
        temp=~temp;
     while(!D);
     Delay(10);
     BZ=temp;
     }
    }
   
  }
}

作者: hkccd    時間: 2014-7-12 20:26
把延時涵數增加一點時間看看
作者: Love丶小柔情    時間: 2014-7-12 22:31
加一個標志位
作者: XUSHENG    時間: 2014-7-13 11:31
如何加標志位?能說清楚嗎?
作者: 涅磐廣廣    時間: 2014-7-17 08:37
說實話,你的程序我看的很是模糊。如果你能把你的變量都加上注釋,這樣更方便我們給你解答。
作者: XUSHENG    時間: 2014-7-18 13:03
涅磐廣廣 發(fā)表于 2014-7-17 08:37
說實話,你的程序我看的很是模糊。如果你能把你的變量都加上注釋,這樣更方便我們給你解答。

D是按鍵,BZ是LED的IO口。temp是一個靜太標志位,程序就這三個參數了。
作者: 明白    時間: 2014-7-26 10:44
小錯誤,更換一下語句位置就好
void main()
{
  static bit temp;
  BZ=1;
  D=1;
  temp=BZ;
while(1)
  {
    if(D==0)
    {
      Delay(10);
      if(D==0)
        {
        temp=~temp;
        BZ=temp;
        while(!D);
        }
    }   
  }
}
作者: 明白    時間: 2014-7-26 10:45
標志位設置,
bit temp;
作者: XUSHENG    時間: 2014-7-26 12:41
問題已解決,謝謝~~
作者: 彬Lsl    時間: 2017-4-17 08:43
XUSHENG 發(fā)表于 2014-7-26 12:41
問題已解決,謝謝~~

請問樓主是怎么解決的,求教
作者: ll13536121668    時間: 2017-10-29 21:12
明白 發(fā)表于 2014-7-26 10:44
小錯誤,更換一下語句位置就好
void main()
{

#include <reg52.h>
//定義一下,方便使用
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P2^4;                //按鍵1定義
sbit key2=P2^5;                //按鍵2定義
sbit key3=P2^6;                //按鍵3定義
sbit key4=P2^7;                //按鍵4定義
sbit led1=P3^0;                //led1端口
sbit led2=P3^1;                //led2端口
sbit led3=P3^2;                //led3端口
sbit led4=P3^3;            //led4端口
/**************************臨時變量定義****************************/
uchar keyflag_1=0;   //按鍵標志位       
uchar keyflag_2=0;   //按鍵標志位       
uchar keyflag_3=0;   //按鍵標志位       
uchar keyflag_4=0;   //按鍵標志位         
/*************************毫秒延時函數****************************/
void delayms(uint z)
{
        uint x,y;
        for(x=0;x<=76;x++)
                for(y=0;y<=z;y++);
}
/**************************按鍵掃描子程序****************************/
void keyscan()
{
        if(key1==0)                                //第一個按鍵按下
        {
                delayms(5);                        //進行短暫延時消除按鍵的抖動
                if(key1==0)                        //第一個按鍵確實按下
                {
               
                        keyflag_1++;   //鍵一按下,標志位加一
                        while(!key1);        //松手檢測
                }
        }
        if(keyflag_1==1){led1=0;} //點亮LED1       
        if(keyflag_1==2){led1=1;keyflag_1=0; } //關閉LED1

        if(key2==0)                                //第二個按鍵按下
        {
                delayms(5);                        //進行短暫延時消除按鍵的抖動
                if(key2==0)                        //第二個按鍵確實按下
                {
                           keyflag_2++;   //鍵一按下,標志位加一
                        while(!key2);        //松手檢測
                }
        }
    if(keyflag_2==1){led2=0;} //點亮LED2       
        if(keyflag_2==2){led2=1;keyflag_2=0; } //關閉LED2

        if(key3==0)                                //第三個按鍵按下
        {
                delayms(5);                        //進行短暫延時消除按鍵的抖動
                if(key3==0)                        //第三個按鍵確實按下
                {
                        keyflag_3++;   //鍵一按下,標志位加一
                        while(!key3);        //松手檢測
                }
        }
        if(keyflag_3==1){led3=0;} //點亮LED3       
        if(keyflag_3==2){led3=1;keyflag_3=0; } //關閉LED3

        if(key4==0)                                //第四個按鍵按下
        {
                delayms(5);                        //進行短暫延時消除按鍵的抖動
                if(key4==0)                        //第四個按鍵確實按下
                {
                        keyflag_4++;   //鍵一按下,標志位加一
                        while(!key4);        //松手檢測
                }
        }
        if(keyflag_4==1){led4=0;} //點亮LED4       
        if(keyflag_4==2){led4=1;keyflag_4=0; } //關閉LED4
}
void main()
{
        while(1)        //程序循環(huán)執(zhí)行
        {
                keyscan();                //按鍵掃描,子函數

        }
}

作者: ll13536121668    時間: 2017-10-29 21:16
明白 發(fā)表于 2014-7-26 10:44
小錯誤,更換一下語句位置就好
void main()
{

獨立按鍵控制LED亮和滅,按下按鍵,LED亮,再按下,LED滅。因為我們很多都是按完按鍵,松開手LED才亮。 我現(xiàn)在是想一按按鍵,LED就亮或滅,這個又怎么寫呢?請朋友們幫幫忙,要怎樣改才正確?謝謝。下面是程序
作者: shanren    時間: 2017-10-29 23:27
加標志位
作者: zhushuaifei1314    時間: 2017-10-30 15:33
說實話,你的程序我看的很是模糊。如果你能把你的變量都加上注釋,這樣更方便我們給你解答
作者: 1639701992    時間: 2017-10-30 17:25
把延時涵數增加一點時間看看
作者: 星際漫游者    時間: 2017-10-31 12:13
ll13536121668 發(fā)表于 2017-10-29 21:12
#include
//定義一下,方便使用
#define uchar unsigned char

你的程序有問題,每次都是松手之后,才開始判斷驅動燈亮還是燈滅,while(!key);去掉。led4=0;后加keyflag=0;





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1