找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

8個按鍵分別控制8個LED燈的亮滅,按一次松開常亮,按一次松開常滅,求助大神看看問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:405279 發(fā)表于 2018-10-24 00:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
void delayms(uint y)
{
        uint i,j;
        for(i=y;i>0;i--)
                for(j=110;j>0;j--);
}
main(void)
{
while(1)
{       
      
            if(P1==0xfe)         
            {
                  delayms(1);
               if(P1==0xfe)
                         {
                           while(P1==0xfe)
                           delayms(1);
                        P2=0xfe;
                      }          
                }
                 if(P1==0xfe&&P2==0Xfe)
                 {
                       delayms(1);
                     if(P1==0xfe&&P2==0Xfe)
                         {         delayms(1);
                             while(P1==0xfe)
                                 
                             P2=0xff;
                                 
                         }
                 }
                if(P1==0xfd)         
            {
                   delayms(10);
               if(P1==0xfd)
                        {
                           while(P1==0xfd)
                        P2=0xfd;
                     }          
                }
                 if(P1==0xfd&&P2==0Xfd)
                 {
                     delayms(10);
                     if(P1==0xfd&&P2==0Xfd)
                         {       
                             while(P1==0xfd)
                          P2=0xff;
                         }
                 }
                 if(P1==0Xfb)
                 {
                    delayms(10);
                    if(P1==0xfb)
                        {
                           while(P1==0xfb)
                           P2=0xfb;
                        }
                 }
                 if(P1==0xfb&&P2==0xfb)
                 {
                    delayms(10);
                        if(P1==0xfb&&P2==0xfb)
                        {
                              while(P1==0xfb)
                                  P2=0xff;


                        }
                   }
                 if(P1==0xf7)
                 {
                     delayms(10);
                         if(P1==0xf7)
                         {
                            while(P1==0xf7)
                                P2=0xf7;
                         }
                 }
                 if(P1==0xf7&&P2==0xf7)
                 {
                     delayms(10);
                         if(P1==0xf7&&P2==0xf7)
                         {
                         while(P1==0xf7)
                         P2=0xff;
                         }
                 }
                 if(P1==0xef)
                 {
                    delayms(10);
                        if(P1==0xef)
                        {
                           while(P1==0xef)
                           P2=0xef;
                        }
                 }
                 if(P1==0xef&&P2==0xef)
                 {
                    delayms(10);
                        if(P1==0xef&&P2==0xef)
                        {
                        while(P1==0xef)
                        P2=0xff;
                        }
                 }
       if(P1==0xdf)
           {
              delayms(10);
                    if(P1==0xdf)
                    {
                      while(P1==0xdf)
                      P2=0xdf;
                    }
           }
           if(P1==0xdf&&P2==0xdf)
           {
              delayms(10);
                    if(P1==0xdf&&P2==0xdf)
                    {
                    while(P1==0xdf)
                    P2=0xff;
                    }
           }
           if(P1==0xbf)
           {
              delayms(10);
                    if(P1==0xbf)
                    {
                  while(P1==0xbf)
          P2=0xbf;
         }
       }
       if(P1==0xbf&P2==0xbf)
       {
          delayms(10);
          if(P1==0xbf&&P2==0xbf)
          {
          while(P1==0xbf)
          P2=0xff;
          }
       }
       if(P1==0x7f)
       {
          delayms(10);
          if(P1==0x7f)
          {
            while(P1==0x7f)
            P2=0x7f;
          }
       }
       if(P1==0x7f&&P2==0x7f)
       {
           delayms(10);
                   if(P1==0x7f&&P2==0x7f)
           {
           while(P1==0x7f)
           P2=0xff;
                     }
       }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:164602 發(fā)表于 2018-10-24 08:41 | 只看該作者
沒有電路圖,我猜你是用的矩陣鍵盤吧。
矩陣鍵盤的鍵選擇,可不是你這樣搞的哦。
我在我的板子上試驗了一個,你看看:
#include<reg51.h>

#define GPIO_KEY P1

sbit LED0=P2^0;
sbit LED1=P2^1;
sbit LED2=P2^2;
sbit LED3=P2^3;
sbit LED4=P2^4;
sbit LED5=P2^5;
sbit LED6=P2^6;
sbit LED7=P2^7;

unsigned char KeyValue=9;

void Delay10ms();
void KeyDown();

void main(void)
{
        while(1)
        {
                KeyDown();
                if (KeyValue==0)
                {
                        LED0=~LED0;
                        KeyValue=9;
                }
                if (KeyValue==1)
                {
                        LED1=~LED1;
                        KeyValue=9;
                }
                if (KeyValue==2)
                {
                        LED2=~LED2;
                        KeyValue=9;
                }
                if (KeyValue==3)
                {
                        LED3=~LED3;
                        KeyValue=9;
                }
                if (KeyValue==4)
                {
                        LED4=~LED4;
                        KeyValue=9;
                }
                if (KeyValue==5)
                {
                        LED5=~LED5;
                        KeyValue=9;
                }
                if (KeyValue==6)
                {
                        LED6=~LED6;
                        KeyValue=9;
                }
                if (KeyValue==7)
                {
                        LED7=~LED7;
                        KeyValue=9;
                }
                if (KeyValue==8)
                {
                        LED0=1;
                        LED1=1;
                        LED2=1;
                        LED3=1;
                        LED4=1;
                        LED5=1;
                        LED6=1;
                        LED7=1;
                }
        }                               
}

void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)
        {
                Delay10ms();
                if(GPIO_KEY!=0x0f)
                {
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))
                        {
                                Delay10ms();
                                a++;
                        }
                }
        }
}

void Delay10ms(void)
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
電路圖也發(fā)出來,程序都是與電路對應(yīng)的。




回復(fù)

使用道具 舉報

板凳
ID:23606 發(fā)表于 2018-10-24 08:49 | 只看該作者
感覺太復(fù)雜了,一個按鍵按下對相應(yīng)的燈取反一下就行了
回復(fù)

使用道具 舉報

地板
ID:357401 發(fā)表于 2018-10-24 09:14 | 只看該作者
你這個if判斷這里:if(P1==0xfe)         
            {
                  delayms(1);
               if(P1==0xfe)
                         {
                           while(P1==0xfe)
                           delayms(1);
                        P2=0xfe;
                      }         
                }判斷有按鍵按下就亮燈,亮燈后并沒有其他后續(xù)可執(zhí)行任務(wù),并且你是放在while(1)的死循環(huán)里的。所以你的程序?qū)嶋H表現(xiàn)就是按一下就一直亮,再按一下就滅。
回復(fù)

使用道具 舉報

5#
ID:111634 發(fā)表于 2018-10-24 09:27 | 只看該作者
本帖最后由 zl2168 于 2018-10-24 10:48 編輯

介紹你一個按鍵操作案例。
實例5  4種不同方式鍵控信號燈
Proteus仿真一下,確認(rèn)有效。
實例5 不同方式鍵控?zé)?rar (31.72 KB, 下載次數(shù): 27)

以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1.書中電路和程序設(shè)計有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報

6#
ID:313336 發(fā)表于 2018-10-24 09:40 來自手機(jī) | 只看該作者
qwersdfgfg 發(fā)表于 2018-10-24 09:14
你這個if判斷這里:if(P1==0xfe)         
            {
                  delayms(1);

按鍵掃描出現(xiàn)問題了吧
回復(fù)

使用道具 舉報

7#
ID:89515 發(fā)表于 2018-10-24 09:52 | 只看該作者
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
void delayms(uint y)
{
        uint i,j;
        for(i=y;i>0;i--)
                for(j=110;j>0;j--);
}
void main(void)
{
while(1)
{            
     if(P1==0xfe)         
     {
   delayms(10);
   if(P1==0xfe)
   {
          while(P1==0xfe) ;
          delayms(10);
         ( P2&=0xfe)?(P2|=0x01):(P2&=0xfe);
   }         
     }
  //類似上……
}
}

回復(fù)

使用道具 舉報

8#
ID:414462 發(fā)表于 2018-10-24 09:58 | 只看該作者
程序搞復(fù)雜了
回復(fù)

使用道具 舉報

9#
ID:839984 發(fā)表于 2020-11-6 22:37 來自手機(jī) | 只看該作者
能不能幫忙用if語句寫一個開始八個全亮,之后按一個按鍵熄滅一個,在按一下,熄滅兩個,直到全滅為止
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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