?? 標準 八路.c
字號:
#include <reg52.h>
#include <intrins.h>
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
uchar i;
uchar flag1,flag2,flag3,flag3_1,flag6,flag6_1,flag4,flag7,flag8,flag9; //flag1為搶答標志
//flag2為顯示標志
//flag3為中斷次數標志
//flag4為鍵值標志
//flag5為答題標志
//flag6為中斷1次數標志
uchar miao,fen,key,key2;
uchar fenzhi=1;
uchar dashi=1;
uchar qiangshi=0;
uchar fen1,fen2,fen3,fen4,fen5,fen6,fen7,fen8;
sbit haoce=P2^7;
sbit jishice=P2^4;
sbit fenshi=P2^6;
sbit fenge=P2^5;
sbit beep=P3^6;
uchar keyscan();
uchar nokeyscan();
void display(uchar);
uchar start();
void init0();
void init1();
void disshi(uchar);
void disfen(uchar);
void discha(uchar);
void fenshu();
uchar jifen();
void chaxun();
void disset(uchar,uchar,uchar);
void set();
void qiangda();
void main()
{
while(1)
{
chaxun();
set();
qiangda();
}
}
void init0()
{
TMOD=0X01;
TH0=(65536-45872)/256;//T0初值,50ms中斷一次
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
}
void init1()
{
TMOD=0X10;
TH1=(65536-45872)/256;//T1初值,50ms中斷一次
TL1=(65536-45872)%256;
EA=1;
ET1=1;
TR1=1;
}
void time0() interrupt 1
{
TR1=0;
flag3++;
TH0=(65536-45872)/256;//T0初值,50ms中斷一次
TL0=(65536-45872)%256;
if(flag3==201) //10秒開始倒計時
{
flag3_1++;
flag3=0;
}
if(flag3_1==qiangshi)//qiangshi為1時是10s;
{
switch(flag3) //10秒搶答時間
{
case 0x14:miao=9;disshi(miao);break;
case 0x28:miao=8;disshi(miao);break;
case 0x3c:miao=7;disshi(miao);break;
case 0x50:miao=6;disshi(miao);break;
case 0x64:miao=5;disshi(miao);break;
case 0x78:miao=4;disshi(miao);break;
case 0x8c:miao=3;disshi(miao);break;
case 0xa0:miao=2;disshi(miao);break;
case 0xb4:miao=1;disshi(miao);break;
case 0xc8:miao=0;disshi(miao);
for(i=20;i>0;i--)
{
beep=~beep;
delay(50);
}
beep=1;
flag2=1;
TR0=0;
jishice=1;
break;
}
}
}
void time1() interrupt 3
{
flag6++;
TR0=0;
TH1=(65536-45872)/256;//T0初值,50ms中斷一次
TL1=(65536-45872)%256;
if(flag6==201) //20秒答題時間,10秒開始倒計時
{
flag6_1++;
flag6=0;
}
if(flag6_1==dashi)//dashi為1時是10s;
{
switch(flag6)
{
case 0x14:miao=9;disshi(miao);break;
case 0x28:miao=8;disshi(miao);break;
case 0x3c:miao=7;disshi(miao);break;
case 0x50:miao=6;disshi(miao);break;
case 0x64:miao=5;disshi(miao);break;
case 0x78:miao=4;disshi(miao);break;
case 0x8c:miao=3;disshi(miao);break;
case 0xa0:miao=2;disshi(miao);break;
case 0xb4:miao=1;disshi(miao);break;
case 0xc8:miao=0;disshi(miao);
for(i=20;i>0;i--)
{
beep=~beep;
delay(50);
}
beep=1;
flag1=0;
TR1=0;
fenshu();
break;
}
}
}
void qiangda()
{
if(start()==1)//等待搶答開始鍵按下
{
flag3=0;
flag3_1=0;
flag6=0;
flag6_1=0;
init0();
if(flag8==1)
{
flag8=0;
flag2=0;
}
while(!flag2)//判斷是否已有人搶答
{
flag4=keyscan();
if(flag4!=0) //有人按下才顯示
{
display(flag4);//顯示
}
}
}
}
uchar keyscan()//帶消抖的鍵盤掃描
{
uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2;break;
case 0xbe:key=3;break;
case 0x7e:key=4;break;
default: key=0;
}
while(temp!=0xf0) //等待釋放
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:key=5;break;
case 0xdd:key=6;break;
case 0xbd:key=7;break;
case 0x7d:key=8;break;
default: key=0;
}
while(temp!=0xf0) //等待釋放
{
temp=P1;
temp=temp&0xf0;
}
}
}
return key;
}
uchar nokeyscan()//無消抖的鍵盤掃描
{
uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:key2=1;break;
case 0xde:key2=2;break;
case 0xbe:key2=3;break;
case 0x7e:key2=4;break;
default: key2=0;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:key2=5;break;
case 0xdd:key2=6;break;
case 0xbd:key2=7;break;
case 0x7d:key2=8;break;
default: key2=0;
}
}
return key2;
}
void display(uchar num)//顯示函數
{
TR0=0;
flag2=1;
while(start()!=2)//等待答題開始鍵按下
{
haoce=0;
jishice=1;
P0=table[num];
delay(10);
haoce=1;
jishice=0;
P0=table[10-miao];
delay(10);
}
jishice=1;
haoce=1;
init1();
while(start()!=3);
TR1=0;
fenshu();
}
void disshi(uchar num1)//顯示倒計時
{
jishice=0;
P0=table[num1];
delay(10);
}
void disfen(uchar num2)//顯示分數
{
while(start()!=4)
{
uchar shi,ge;
jishice=1;
fenshi=0;
fenge=1;
haoce=1;
shi=num2/10;
ge=num2%10;
P0=table[shi];
delay(10);
fenshi=1;
fenge=0;
haoce=1;
P0=table[ge];
delay(10);
fenshi=1;
fenge=1;
haoce=0;
P0=table[flag4];
delay(10);
if(jifen()==1)
{
flag7=0;
num2=num2+fenzhi;
}
if(jifen()==2)
{
flag7=0;
num2=num2-fenzhi;
}
switch(flag4)
{
case 1:fen1=num2;break;
case 2:fen2=num2;break;
case 3:fen3=num2;break;
case 4:fen4=num2;break;
case 5:fen5=num2;break;
case 6:fen6=num2;break;
case 7:fen7=num2;break;
case 8:fen8=num2;break;
}
}
haoce=1;
jishice=1;
fenshi=1;
fenge=1;
flag8=1;
//EA=0;
key=0;
}
void discha(uchar num3)//顯示查詢結果
{
uchar shi2,ge2;
while(start()!=4)
{
jishice=1;
fenshi=0;
fenge=1;
haoce=1;
shi2=num3/10;
ge2=num3%10;
P0=table[shi2];
delay(10);
fenshi=1;
fenge=0;
haoce=1;
P0=table[ge2];
delay(10);
fenshi=1;
fenge=1;
haoce=0;
P0=table[key2];
delay(10);
}
haoce=1;
fenshi=1;
fenge=1;
key2=0;
flag1=0;
}
void fenshu()//顯示每臺分數
{
switch(key)
{
case 1:disfen(fen1);break;
case 2:disfen(fen2);break;
case 3:disfen(fen3);break;
case 4:disfen(fen4);break;
case 5:disfen(fen5);break;
case 6:disfen(fen6);break;
case 7:disfen(fen7);break;
case 8:disfen(fen8);break;
}
}
uchar start() //搶答計時鍵,答題計時鍵,記分鍵,重來鍵
{
uchar temp;
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:flag1=1;break;
case 0xd7:flag1=2;break;
case 0xb7:flag1=3;break;
case 0x77:flag1=4;break;
default:flag1=0;break;
}
}
}
return(flag1);
}
uchar jifen()
{
uchar temp;
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:flag7=1;break;
case 0xdb:flag7=2;break;
case 0xbb:flag7=3;break;
case 0x7b:flag7=4;break;
default:flag1=0;break;
}
while(temp!=0xf0) //等待釋放
{
temp=P1;
temp=temp&0xf0;
}
}
}
return(flag7);
}
void chaxun()
{
switch(nokeyscan())
{
case 1:discha(fen1);break;
case 2:discha(fen2);break;
case 3:discha(fen3);break;
case 4:discha(fen4);break;
case 5:discha(fen5);break;
case 6:discha(fen6);break;
case 7:discha(fen7);break;
case 8:discha(fen8);break;
}
}
void set()
{
if(jifen()==4)
{
flag9++;
flag7=0;
switch(flag9)
{
case 1:disset(fenzhi,dashi,qiangshi);
while(jifen()!=4)
{
if(flag7==1)
{
flag7=0;
fenzhi++;
}
if(flag7==2)
{
flag7=0;
fenzhi--;
}
}
flag7=0;
disset(fenzhi,dashi,qiangshi);break;
case 2:disset(fenzhi,dashi,qiangshi);
while(jifen()!=4)
{
if(flag7==1)
{
flag7=0;
dashi++;
}
if(flag7==2)
{
flag7=0;
dashi--;
}
}
disset(fenzhi,dashi,qiangshi);break;
case 3:disset(fenzhi,dashi,qiangshi);
while(jifen()!=4)
{
if(flag7==1)
{
flag7=0;
qiangshi++;
}
if(flag7==2)
{
flag7=0;
qiangshi--;
}
}
disset(fenzhi,dashi,qiangshi);break;
case 4:disset(fenzhi,dashi,qiangshi);
while(jifen()!=4)
{
if(flag7==1)
{
flag7=0;
qiangshi++;
}
if(flag7==2)
{
flag7=0;
qiangshi--;
}
}
disset(fenzhi,dashi,qiangshi);break;
flag7=0;
case 5:flag9=0;break;
}
}
haoce=1;
fenge=1;
fenshi=1;
}
void disset(uchar num4,uchar num5,uchar num6)
{
while(!jifen())
{
haoce=0;
fenshi=1;
fenge=1;
P0=table[num4];
delay(10);
haoce=1;
fenge=0;
fenshi=1;
P0=table[num5];
delay(10);
haoce=1;
fenge=1;
fenshi=0;
P0=table[num6];
delay(10);
}
haoce=1;
fenge=1;
fenshi=1;
P0=0xff;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -