求帮忙看下为什么这个程序一开始流水灯从左到右循环后,别的按键都不起作用了

2019-03-24 18:06发布

#include<reg51.h>
#include<intrins.h>
#define GPI0_LED P0
#define GPI0_KEY P1
void Delay10ms(unsigned int c);
unsigned char Key_Scan();
void LED1();
void LED2();
void LED3();
void LED4();
void LED5();
void LED6();
void LED7();
void LED8();
void main(void)
{   
    unsigned char keyNum;
        while(1)
        {   keyNum=Key_Scan();  
                switch (keyNum)
                  {
                    case(0xEF):
                               LED1();
                               break;
                        case(0xDF):
                               LED2();
                               break;
                        case(0xBF):
                               LED3();
                               break;
                        case(0x7F):
                               LED4();                 
                               break;
                        case(0xFE):
                               LED5();
                                   break;
                        case(0xFD):
                               LED6();
                                   break;
                        case(0xFB):
                               LED7();
                                   break;
                        case(0xF7):
                               LED8();
                                   break;
                        dafault:
                        break;
                  }
        }                   
}
unsigned char Key_Scan()
{     unsigned char keyValue=0,i;
        if (GPI0_KEY != 0xFF)
                  {
                            Delay10ms(1);
                              if (GPI0_KEY != 0xFF)
                                   {
                                      keyValue=GPI0_KEY;
                                          i=0;
                                          while((i<50)&&(GPI0_KEY != 0xFF))
                                          {
                                            Delay10ms(1);
                                                i++;
                                          }
                                        }
                   }
                   return keyValue;
}
void Delay10ms(unsigned int c)
{unsigned char a,b;
    for (;c>0;c--)
           {
              for (b=38;b>0;b--)
                    {
                          for (a=130;a>0;a--);
                        }
                }
}
void LED1()
{
   GPI0_LED=0x00;
   Delay10ms(50);
   GPI0_LED=0xFF;
   Delay10ms(50);
  
}
void LED2()
{
GPI0_LED=0xCC;
Delay10ms(5);
GPI0_LED=0x33;
Delay10ms(5);
GPI0_LED=0xCC;
Delay10ms(5);
GPI0_LED=0x33;
Delay10ms(5);
}
void LED3()
{
GPI0_LED=0x99;
Delay10ms(5);
GPI0_LED=0x66;
Delay10ms(5);
GPI0_LED=0x99;
Delay10ms(5);
GPI0_LED=0x66;
Delay10ms(5);
}
void LED4()
{
GPI0_LED=0xAA;
Delay10ms(5);
GPI0_LED=0x55;
Delay10ms(5);
GPI0_LED=0xAA;
Delay10ms(5);
GPI0_LED=0x55;
Delay10ms(5);
}
void LED5()
{
LED1();
LED2();
LED3();
LED4();
}
void LED6()
{GPI0_LED=0xFE;
   while(1)
   { Delay10ms(50);
     GPI0_LED=_crol_(P0,1);
   }
}
void LED7()
{GPI0_LED=0x7F;
   while(1)
   { Delay10ms(50);
     GPI0_LED=_cror_(P0,1);
   }
}
void LED8()
{
GPI0_LED=0x00; 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
dcexpert
1楼-- · 2019-03-24 21:19
 精彩回答 2  元偷偷看……
lonerzf
2楼-- · 2019-03-25 01:01
dcexpert 发表于 2015-2-5 20:42
进入循环后,LED显示是延时方式,按键扫描的机会就很少。除非你一直按着不动才行。如果用中断判断就没有这个问题。如果LED状态用定时器也没有这样问题。

同意。也觉得是流水灯的程序占用太多时间,用中断的方式处理比较好。


xinxinxin2015
3楼-- · 2019-03-25 02:33
谢谢楼上帮助,等会去就改改看
youki12345
4楼-- · 2019-03-25 08:13
 精彩回答 2  元偷偷看……

一周热门 更多>