51单片机八位抢答器,多添加一个抢答犯规功能

在此程序下添加一个抢答犯规功能,修改程序和仿真

第1个回答  2017-06-13
main()
{
uchar num,flag,flagwg=0,wgn;
while(1)
{
if(start==0)
{
delay10ms();
if(start==0)
{
P0=led_tab[0];
while(flag==0)
{
switch(P2)
{
case 0xfe:
...............

}
P0=led_tab[num];
}
}else fangui();
}else fangui();
if(rst==0)
{
delay10ms();
if(rst==0)
{
num=0;
flag=0;
flagwg=0;
P0=0xff;
}
}
}
}
void fangui()
{
uchar tmp1,tmp2,num;
if(P2!=0xff)
{
tmp1=~P2;
tmp2=0x01;
for(num=0;num<8;num++)
{
if(tmp1 & tmp2)(flagwg=1;wgn=num+1;break;}
tmp2<<=1;
}
}
if(flagwg)
{
P0=led_tab[wgn];
delay10ms();delay10ms();delay10ms();
P0=0xff;
delay10ms();delay10ms();delay10ms();
}

}
第2个回答  2017-06-13
把仿真文件和代码发过来,我帮你改。追问

怎么发给你?

追答

仿真已通过,犯规抢答时,他的号码会闪烁。

//字数超多了,只能摘抄出来了,详见网盘资料
main()
{
//
    uchar workstate=0;//工作状态,0为未开始(复位),1为开始,2为犯规
    uchar num_fg,flag_fg;//【犯规编号、犯规标志】
 while(1)
 {//......
        if(workstate!=1 )//未开始,
        {
           if(P2!=0xff)//有人按键
           {
               workstate =2; //犯规状态
               while(flag_fg==0)
                { 
                   switch(P2)
                    {
                        case 0xfe:num_fg=1;flag_fg=1;break;
                       //
                        default:  num_fg=0;flag_fg=0;break;
                    }
                }
           }
        }
         if(workstate==2 )//有人犯规
        {
            P1=led_tab[num_fg];
            delay10ms();delay10ms();delay10ms();
            P1=0xff;
            delay10ms();delay10ms();delay10ms();
        }
    }
}

本回答被提问者采纳
第3个回答  2017-06-13
多简单啊,自己添加就好了。