📄 抢答器.c
字号:
#include <reg52.h>
#define uchar unsigned char
ucar k,i;//
bit flag,flag_1=1;
uchar duanma[10] =
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};//数码管段码
uchar weima[4] =
{
0xfe, 0xfd, 0xfb, 0xf7
};//位码
uchar huanchun[4];
uchar room[6]={ 100,100,100,100,100,100};//初始化选手分数
void Delay(uchar i)//第huanchun[3]位读取分数
{
do{
huanchun[0] = room[huanchun[3]]%10;
huanchun[1] = (room[huanchun[3]]/10)%10;
huanchun[2] = room[huanchun[3]]/100;
}while(i--);
}
void xianshi()interrupt 3 //中断显示
{
TH1=0Xf8; //显示定时两毫秒。
TL1=0Xcc;
P1 = weima[i];
P2 = duanma[huanchun[i]];
i++;
if(i==4)i=0;
}
unsigned char scankey()//键盘扫描
{
unsigned char k,down,up;
P0=0x00;
P0=0xF0;
k=P0;
if(k==0xF0)return 0xFF;
Delay(50);//去抖动
down=3;
while(k&0x80)down--,k<<=1;
P0=0x00;
P0=0x0F;
k=P0;
if(k==0x0F)return 0xFF;
up=0;
while(k&0x01)up+=4,k>>=1;
return up+down;
}//scankey
songjian() //松键操作
{ uchar k;
while(1)
{ k=scankey();
if(k==scankey()&&k==0xff)break;
}
}
main()
{
TMOD = 0X01;//定时器工作方式1
TH1=0Xf8;
TL1=0Xcc;
EA = 1;//允许中断
ET1 = 1;//T1中断允许
TR1 = 1;
while(1)//键盘扫描
{ flag=0;
flag_1=1;
k=scankey();
Delay(100);
if(k==scankey()&&k!=0xff)
{
songjian();
if(k==15)//裁判复位
{
huanchun[3]=0;
flag=1;
}
if(k==15&&flag==1)
{ flag=0;
while(flag_1)
{ k=scankey();
Delay(100);
if(k==scankey()&&k!=0xff)
{
songjian();
switch(k)
{
case 4: huanchun[3]=1;//1号选手按键
flag_1=0;
break;
case 5: huanchun[3]=2;//2号选手按键
flag_1=0;
break;
case 6: huanchun[3]=3;//3号选手按键
flag_1=0;
break;
case 7: huanchun[3]=4;//4号选手按键
flag_1=0;
break;
case 8: huanchun[3]=5;//5号选手按键
flag_1=0;
break;
}
}
}
}
if(k==14)room[huanchun[3]]+=10;//加10分
if(k==13)room[huanchun[3]]-=10;//减10分
}
}
}//1~5好选手抢答键
//13裁判的减粉14裁判的加粉键
//15号键裁判用的抢答开始键
//当裁判按下15号键时抢答开始选手才能开始抢答
//当友人按下抢答自己的抢答键后数码管显示该选手的号码
//当选手回答后由裁判按13/14见进行加减分并显示当前选手的总的分
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -