- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key9=P2^0; //主持人清除鍵
- sbit key10=P2^1; //主持人非定時搶答開啟鍵
- sbit key11=P2^2; //主持人定時搶答開啟鍵
- sbit wei1=P2^4; //數(shù)碼管位選段
- sbit wei2=P2^5;
- sbit wei3=P2^6;
- sbit wei4=P2^7;
- sbit contr=P2^3;
- uchar code seg7[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- }; //共陰極數(shù)碼管顯示編碼
- //定義搶答時間,中斷次數(shù),選手編號三個全局變量
- uchar time=30,count,playernum;
- //存儲8個選手按鍵狀態(tài),若對應選手按鍵被按下,則
- //相應存儲位置存儲選手編號,否則對應存儲位置存儲數(shù)字0
- uchar num[8];
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void display(uchar time,uchar num) //數(shù)碼管顯示函數(shù)
- {
- uchar shi,ge;
- shi=time/10; //顯示搶答時間
- ge=time%10;
- P0=seg7[shi]; //段選數(shù)據(jù)
- wei1=0; //位選數(shù)據(jù)
- delayms(10);
- wei1=1;
- P0=seg7[ge];
- wei2=0;
- delayms(10);
- wei2=1;
- shi=num/10; //顯示選手編號
- ge=num%10;
- P0=seg7[shi];
- wei3=0;
- delayms(10);
- wei3=1;
- P0=seg7[ge];
- wei4=0;
- delayms(10);
- wei4=1;
- }
- void keyscan()
- {
- if(key9==0) //主持人清除鍵
- {
- delayms(2);
- if(key9==0)
- {
- while(!key9) ;
- P3=0xff; //關閉和被按下?lián)尨疰I對應的發(fā)光二極管
- time=0; //清除搶答時間
- contr=1; //開發(fā)搶答按鈕輸入
- playernum=0; //清除選手編號
- TR0=0; //關閉定時器
- }
- }
- if(key10==0) //非定時搶答開始鍵
- {
- delayms(2);
- if(key10==0)
- {
- while(!key10);
- contr=0; //只允許首先按下?lián)尨疰I者的狀態(tài)輸入
- time=0; //清除時間
- TR0=0; //關閉定時器
- }
- }
- if(key11==0) //定時搶答開啟鍵
- {
- delayms(2);
- if(key11==0)
- {
- while(!key11);
- contr=0; //只允許首先按下?lián)尨疰I者的狀態(tài)輸入
- time=30; //初始化搶答時間
- TR0=1; //開啟定時器
- }
- }
- }
- void getplayernum() //獲取搶答鍵被按下編號
- {
- uchar i,temp;
- temp=P1;
- P3=P1; //將被按下的搶答鍵對應二極管點亮
- for(i=0;i<8;i++)
- {
- temp=temp>>1;
- if(CY==0) //該選手按下?lián)尨疰I
- {
- num[i]=(i+1);
- }
- else
- num[i]=0;
- }
- }
- void main()
- {
- uchar i;
- P2=0xFF;
- TMOD=0x01; //定時器0工作在方式1
- TH0=(65536-50000)/256; //定時時間50ms
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- while(1)
- {
- keyscan();
- getplayernum();
- for(i=0;i<8;i++)
- {
- if(num[i]!=0)
- {
- playernum=num[i];
- }
- display(time,playernum); //顯示搶答鍵被按下編號和時間
- }
- }
- }
- void timer0_int() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20)
- {
- time--;
- if(time==0)
- time=30;
- count=0;
- }
- TR0=1;
- }
復制代碼 |