求助一段程序过于抢答器
字体: 小 中 大 | 打印 发表于: 2008-7-04 19:45 作者: jiayingzheng 来源: proteus仿真社区
#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)
八路抢答器.rar
仿真程序也在,帮忙解释一下,是在读不懂(2008-07-04 19:52:48, Size: 40.8 KB, Downloads: 1)
cjdao (2008-7-05 17:00:01)
{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)