原创 51学习之小游戏

2011-2-23 17:49 1493 6 6 分类: MCU/ 嵌入式

//描述:测试反应速度游戏,先显示数字在数码管上,然后让玩家迅速地按下相应的键盘,按下与数字相匹配的数字后自动换下一个数字,以此类推...
//按下十六次后退出,将平均的反应时间显示出来,单位是毫秒...
#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条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条