求助一段程序过于抢答器


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit speak=P2^0;
sbit host=P2^2;
uchar GroupNo;
uchar code Seg7code[9]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//0到8的代码

void delay1ms(void)//延迟1毫秒
{uchar i;
for(i=250;i>0;i--);
}

void ShowG(uchar no)//显示出第几组
{P1=Seg7code[no];}

uchar KeySweep(void)//键盘扫描,获取组数
{uchar temp,no=0;
if(P3!=0xff)
  {delay1ms();
   if(P3!=0xff)
    temp=~P3;
  }
while(temp!=0)
  {temp=temp>>1;
   no++;
  }
return no;
}

void timer0(void) interrupt 1
{TH0=0x10;
TL0=0X60;
speak=~speak;
}

void InitTime0(void)//定时器0初始化
{TMOD=0x02;
TH0=0x10;
TL0=0X60;
ET0=1;
TR0=1;
}

void main()
{InitTime0();
while(1)
{P3=0xff;
  ShowG(0);
  while(P3==0xff);
  GroupNo=KeySweep();
  ShowG(GroupNo);
  EA=1;
  while(host==1);
  delay1ms();
  while(host==1);
  EA=0;
}
}

   
扫描键盘的程序谁给解释下,有没有更好更简单的算法来替代

我也来说两句 查看全部回复

最新回复

  • jiayingzheng (2008-7-04 19:52:48)

    uchar KeySweep(void)//键盘扫描,获取组数 {uchar temp,no=0; if(P3!=0xff) {delay1ms(); if(P3!=0xff) temp=~P3; } while(temp!=0) {temp=temp>>1; no++; } return no; } 就是这个程序

    八路抢答器.rar
    (2008-07-04 19:52:48, Size: 40.8 KB, Downloads: 1)

    仿真程序也在,帮忙解释一下,是在读不懂
  • cjdao (2008-7-05 17:00:01)

    uchar KeySweep(void)//键盘扫描,获取组数
    {uchar temp,no=0;      
    if(P3!=0xff)                      //P3口应该是接键盘的,此处检测是否有键被按下
      {delay1ms();                //延时消抖
       if(P3!=0xff)                   //再次检测是否有按键被按下
        temp=~P3;                 //将P3口的值取反是为了配合下面的while语句算出键值no
      }
    while(temp!=0)
      {temp=temp>>1;
       no++;
      }
    return no;
    }
  • cjdao (2008-7-05 17:00:51)

    能说的就这么多了