不論是正常搶答還是違規搶答,一旦中斷被觸發即刻關閉EX0=0封死所有搶答鍵,只有主持鍵才能解鎖。這只是最基本的搶答器,還需要完善超時棄答,各路加減計分等等。
無標題.jpg (161.18 KB, 下載次數: 41)
下載附件
2020-7-30 10:30 上傳
- #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;
- }
復制代碼
|