不论是正常抢答还是违规抢答,一旦中断被触发即刻关闭EX0=0封死所有抢答键,只有主持键才能解锁。这只是最基本的抢答器,还需要完善超时弃答,各路加减计分等等。
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char//宏定义
- sbit host=P3^0;
- sbit deng=P3^6;
- bit flag=0;
- bit sign;
- bit key_value;
- uchar count=0;
- uint count1=0;
- uchar num=0;
- uchar code table[]={//共阳数码管段码"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- void delay(uint c) // 延时子程序
- {
- uint i,j;
- for(i=c;i>0;i--)
- for(j=120;j>0;j--);
- }
- void main() //主函数
- {
- EA=1;
- EX0=1;
- IT0=0;
- while(1)
- {
- if(host==0) //主持开关1被按下
- {
- count++; //消抖计数
- if(count>=10 && sign==0)
- {
- sign=1; //锁定键态
- key_value=~key_value;
- if(key_value==1)//开始抢答
- flag=1;
- if(key_value==0)//复位
- {
- key_value=0;
- EX0=1;
- flag=0;
- deng=1;
- num=0;
- P1=0xff;
- }
- }
- }
- else //松手清0
- {
- count=0;
- sign=0;
- }
- if(flag==0 && num==0)
- P0=table[0];//显示0
- else if(flag==1 && num==0)
- P0=table[16];//显示"-"
- else if(flag==1 && num!=0)
- P0=table[num];//显示编号
- else if(flag!=1 && num!=0)
- {//闪烁显示违规编号
- count1++;
- if(count1<500)
- P0=table[num];
- else P0=0xff;
- if(count1>=1000)
- count1=0;
- }
- delay(1);//控制主循环周期约1ms
- }
- }
- void INT_0() interrupt 0
- {
- //由于中断自封锁,无需消抖
- EX0=0;
- switch(P2)
- {
- case 0xfe: P1=0xfe;num=1;break; //按键1
- case 0xfd: P1=0xfd;num=2;break; //按键2
- case 0xfb: P1=0xfb;num=3;break; //按键3
- case 0xf7: P1=0xf7;num=4;break; //按键4
- case 0xef: P1=0xef;num=5;break; //按键5
- case 0xdf: P1=0xdf;num=6;break; //按键6
- case 0xbf: P1=0xbf;num=7;break; //按键7
- case 0x7f: P1=0x7f;num=8;break; //按键8
- }
- deng=0;
- // EX0=1;
- }
复制代码
|