//描述:测试反应速度游戏,先显示数字在数码管上,然后让玩家迅速地按下相应的键盘,按下与数字相匹配的数字后自动换下一个数字,以此类推...
//按下十六次后退出,将平均的反应时间显示出来,单位是毫秒...
#include"reg52.h"
#include"stdlib.h"//包含调用产生随机数的函数int rand()...
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; //数码管显示0-f
uchar code table2[]={0xfe,0xfd,0xfb,0xf7}; //控制P2口来控制数码管的选通
uchar temp,temp1,temp2,temp3,num,i; //定义变量
void display1(uint temp); //数码管显示函数
void display2(uchar temp4);
void delay(uint);
void delay1(uint); //延时函数
void init(void); //初始化函数
void keyscan(void); //键盘扫描函数
void main()
{
init();
for(i=0;i<16;i++)
{
temp3=rand(); /*解决产生的随机数在1—16之间*/
if(temp3>=0&&temp3<=2047)
temp3=1;
if(temp3>=2048&&temp3<=4095)
temp3=2;
if(temp3>=4096&&temp3<=6143)
temp3=3;
if(temp3>=6144&&temp3<=8191)
temp3=4;
if(temp3>=8192&&temp3<=10239)
temp3=5;
if(temp3>=10240&&temp3<=12287)
temp3=6;
if(temp3>=12288&&temp3<=14335)
temp3=7;
if(temp3>=14336&&temp3<=16383)
temp3=8;
if(temp3>=16384&&temp3<=18431)
temp3=9;
if(temp3>=18432&&temp3<=20479)
temp3=10;
if(temp3>=20480&&temp3<=22527)
temp3=11;
if(temp3>=22528&&temp3<=24575)
temp3=12;
if(temp3>=24576&&temp3<=26623)
temp3=13;
if(temp3>=26624&&temp3<=28671)
temp3=14;
if(temp3>=28672&&temp3<=30719)
temp3=15;
if(temp3>=30720&&temp3<=32767)
temp3=16;
display2(temp3);
TR1=1; //开启定时器T1,开始计时
while(1)
{
keyscan();
if(num==temp3)
{
num=0;
break;
} //进入键盘扫描函数,判断返回值是否等于显示值
}
TR1=0; //关闭定时器T1
}
display1(temp2*5/16); //显示最终平均的最终反应时间
}
void init()
{
uchar a=5;
temp1=0;
temp2=0;
num=0;
TMOD=0x11; //设置定时器T0和T1工作方式为16位的定时器
TH0=(65536-50000)/256; //定时50毫秒申请中断
TL0=(65536-50000)%256;
TH1=(65536-5000)/256; //定时5毫秒申请中断
TL1=(65536-5000)%256;
EA=1; //开启总中断
ET0=1; //开启定时器T0中断
ET1=1; //开启定时器T1中断
TR0=1; //在TCON中开启定时器T0
while(1)
{
if(temp1==20)
{
temp1=0;
display2(a--);
if(a==0)
{
TR0=0;
break; //关闭定时器T0并跳出循环
}
}
}
}
void display1(uint b)
{
uchar qian,bai,shi,ge;
while(1)
{
temp=b;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%1000%100/10;
ge=temp%1000%100%10;
P2=table2[0];
P0=table1[qian];
delay1(100);
P0=0xff;
P2=table2[1];
P0=table1[bai];
delay1(100);
P0=0xff;
P2=table2[2];
P0=table1[shi];
delay1(100);
P0=0xff;
P2=table2[3];
P0=table1[ge];
delay1(100);
P0=0xff;
}
}
void display2(uchar temp4)
{
P2=table2[3];
P0=table1[temp4];
}
void keyscan()
{
P1=0xfe;//扫描第一行键盘
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=1;
break;
case 0xd0:num=2;
break;
case 0xb0:num=3;
break;
case 0x70:num=4;
break;
}
}
}
P1=0xfd;//扫描第二行键盘
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=5;
break;
case 0xd0:num=6;
break;
case 0xb0:num=7;
break;
case 0x70:num=8;
break;
}
}
}
P1=0xfb;//扫描第三行键盘
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=9;
break;
case 0xd0:num=10;
break;
case 0xb0:num=11;
break;
case 0x70:num=12;
break;
}
}
}
P1=0xf7;//扫描第四行键盘
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=13;
break;
case 0xd0:num=14;
break;
case 0xb0:num=15;
break;
case 0x70:num=16;
break;
}
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
temp1++;
}
void timer1() interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
temp2++;
}
void delay(uint x)
{
uchar y;
for(;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint c)
{
while(c--);
}
文章评论(0条评论)
登录后参与讨论