⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于at89c52的乒乓球游戏系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************** 
 * copyright:tiany
 * time:2008-9-20
**************************************/

#include <reg52.h>
#include "lcd.h"
#include "main.h"
#include "speech.h"

uchar button,buttonflag,menuflag,buttonplay,speed,moveflag,pauseflag;//send/*发球标志位*/;
num_info gamenum;//比分信息结构体


///////////////////////////////
//主程序,菜单选项,
///////////////////////////////
void main()
{
  uchar wdata;
  speed=3;
  EA=1;
  EX1=1;//int1
  IT1=1;
  EX0=1;//int0
  IT0=1;
  LCD_Initial();
  LCD_CLR(R);
  put_picture_half(Bmp1,L);
  Delay_x10ms(100);LCD_CLR(L);
  put_picture_half(Bmp1,L);
  Delay_x10ms(100);LCD_CLR(L);
  put_picture_half(Bmp1,R);
  for(;;)
  {
      button=0;
      buttonflag=0;
      menuflag=0;
	  buttonplay=0;
	  pauseflag=0;
	  LCD_CLR(L);LCD_CLR(R);
	  put_picture_half(Bmp1,R);
	  put_menu(1,0);
	  put_menu(2,0);
	  put_menu(3,0);
	  wdata=0;
      gamenum.mark1=0,gamenum.mark2=0,gamenum.game1=0,gamenum.game2=0;//比赛信息初始化
	  while(!wdata)         //主菜单
	  {
	   while(!buttonflag);  //等待按键
	   buttonflag=0;
	   switch(button)//按键查值
	   {
	   case DOWN:
	      { 	   
		    put_menu(1,0);
	        put_menu(2,0);
	        put_menu(3,0);//刷新
			if(menuflag==3) menuflag=1;
			else menuflag+=1;
			put_menu(menuflag,1);//反白现实选中项
			break;
	      }
	      
	   case UP:
	      {
		    put_menu(1,0);
	        put_menu(2,0);
	        put_menu(3,0);//刷新
			if(menuflag<=1) menuflag=3;
			else menuflag-=1;
			put_menu(menuflag,1);//反白现实选中项
			break;
	      }
	      
	   case ENTER:
	      { 
          switch(menuflag)
          {
          case 1://singlaplay
			 wdata=singlaplay();
             break;
          case 2://doubleplay
             wdata=doubleplay();
            break;
          case 3://setingmenu
              wdata=settingmenu();//进入下级菜单
              break;
          default:break;
          }
			   break;
	      }
	      
	   case EXIT:break;
	   default:break;
	   }
   }
  }
}


/////////////////////////////////////
//设置难度选项菜单
/////////////////////////////////////
uchar settingmenu()
{
  LCD_CLR(L);
  put_menu(4,0);
  put_menu(5,0);
  put_menu(6,0);
  menuflag=0;
  while(1)
  {
    while(!buttonflag);//等待按键
    buttonflag=0;
    switch(button)     //按键查值
    {
       case DOWN:
          { 	   
          put_menu(4,0);
          put_menu(5,0);
          put_menu(6,0); //刷新
        if(menuflag==3) menuflag=1;
        else menuflag+=1;
        put_menu(menuflag+3,1);//反白现实选中项
        break;
          }
       case UP:
        {
          put_menu(4,0);
          put_menu(5,0);
          put_menu(6,0); //刷新
          if(menuflag<=1) menuflag=3;
          else menuflag-=1;
          put_menu(menuflag+3,1);//反白现实选中项
          break;
        }
       case ENTER:
          { 
            switch(menuflag)//速度设置
            {
             case 1:speed=1;break;
             case 2:speed=4;break;
             case 3:speed=7;break;
             default:break;
            }
           return 1;
          }
       case EXIT:
          {
           return 1;
          }
       default:break;
    }
  }
}

/////////////////////////////////////
//选项按键中断
/////////////////////////////////////
void int1() interrupt 2 using 3
{
   P2=0xFF;
   buttonflag=1;
   button=P2&0xF0;
   moveflag=P2&0xF0;
   pauseflag=P2&0xF0;
}



/////////////////////////////////////
//菜单输出
/////////////////////////////////////
void put_menu(uchar menuid,uchar reverse)
{
  switch(menuid)
  {
  case 1://单人游戏
   {
     put_chinese(chinese[0],0,0,reverse);
	 put_chinese(chinese[2],0,16,reverse);
	 put_chinese(chinese[3],0,32,reverse);
	 put_chinese(chinese[4],0,48,reverse);break;
   }
  case 2://双人游戏
     {
     put_chinese(chinese[1],2,0,reverse);
	 put_chinese(chinese[2],2,16,reverse);
	 put_chinese(chinese[3],2,32,reverse);
	 put_chinese(chinese[4],2,48,reverse);break;
   }
  case 3://游戏设置
     {
     put_chinese(chinese[3],4,0,reverse);
	 put_chinese(chinese[4],4,16,reverse);
	 put_chinese(chinese[5],4,32,reverse);
	 put_chinese(chinese[6],4,48,reverse);break;
   }
  case 4://专家
     {
     put_chinese(chinese[7],0,16,reverse);
	 put_chinese(chinese[8],0,32,reverse);break;
   }
  case 5://高手
     {
     put_chinese(chinese[9],2,16,reverse);
	 put_chinese(chinese[10],2,32,reverse);break;
     }
  case 6://菜鸟
     {
     put_chinese(chinese[11],4,16,reverse);
	 put_chinese(chinese[12],4,32,reverse);break;
   }
  default:
        break;
  }
}
//=============================================
//斜线移动:向左下移动  
//============================================= 
uchar Ball_MoveLeftDown(uint speed)
{
  uchar j,wdata;
  int i;
  for(i=8;i>0;i--)
  {
   wdata=0x03;
   for(j=1;j<8;j+=2)
    {
    if(j)
	 {
      LCD_WriteData(0x00,8-i,64+i*8-j+2);//CLR
      LCD_WriteData(0x00,8-i,64+i*8-j+1);
 	}

    LCD_WriteData(wdata,8-i,64+i*8-j);
    LCD_WriteData(wdata,8-i,64+i*8-j-1);
    wdata=wdata<<2;
    Delay_x10ms(speed*10);
	pause();
    }
    if(buttonplay)
     {
		buttonplay=0;
	    if((button==0x02)&&(i<=1)) return 0; 
	    else if(button==0x02||button==0x01) return 1;
	}
   LCD_WriteData(0x00,8-i,64+i*8-j+2);
   LCD_WriteData(0x00,8-i,64+i*8-j+1);
   
  }
  return 1;
}
//=============================================
//斜线移动:向右上移动  
//============================================= 
uchar Ball_MoveRightUp(uint speed)
{
  uchar i,j,wdata;
  for(i=0;i<8;i++)
  {
   wdata=0xc0;
   for(j=0;j<8;j+=2)
   {
    if(j)
	{
      LCD_WriteData(0x00,7-i,64+i*8+j-2);//CLR
      LCD_WriteData(0x00,7-i,64+i*8+j-1);
	}

    LCD_WriteData(wdata,7-i,64+i*8+j);
    LCD_WriteData(wdata,7-i,64+i*8+j+1);
    wdata=wdata>>2;
    Delay_x10ms(speed*10);
	if(i==7&&j>=4) j=10; 
	pause();
   }
   if(buttonplay)
     {
		buttonplay=0;
	    if((button==0x08)&&(i>=7)) return 0; //p2.1
	    else if(button==0x08||button==0x04) return 2;
	}
   LCD_WriteData(0x00,7-i,64+i*8+j-2);
   LCD_WriteData(0x00,7-i,64+i*8+j-1);
   
  }
  return 2;
}

//=============================================
//斜线移动:向左上移动  
//============================================= 
uchar Ball_MoveLeftUp(uint speed)
{
  uchar j,wdata;
  int i;
  for(i=8;i>0;i--)//向左上移动
  {
   wdata=0xc0;
   for(j=1;j<8;j+=2)
   {
    if(j)
	{
      LCD_WriteData(0x00,i-1,64+i*8-j+2);//CLR
      LCD_WriteData(0x00,i-1,64+i*8-j+1);
	}

    LCD_WriteData(wdata,i-1,64+i*8-j);
    LCD_WriteData(wdata,i-1,64+i*8-j-1);
    wdata=wdata>>2;
    Delay_x10ms(speed*10);
	pause();
   }
   if(buttonplay)
   {
		buttonplay=0;
	    if((button==0x01)&&(i<=1)) return 0; //p2.2
	    else if(button==0x01||button==0x02) return 1;
   }
   LCD_WriteData(0x00,i-1,64+i*8-j+2);
   LCD_WriteData(0x00,i-1,64+i*8-j+1);

 }
 return 1;
}

//=============================================
//斜线移动:向右下移动  
//============================================= 
uchar Ball_MoveRightDown(uint speed)
{
  uchar i,j,wdata;
  for(i=0;i<8;i++)//向右下移动
  {
   wdata=0x03;
   for(j=0;j<8;j+=2)
   {
    if(j)
	  {
      LCD_WriteData(0x00,i,64+i*8+j-2);//CLR
      LCD_WriteData(0x00,i,64+i*8+j-1);
	  }
    LCD_WriteData(wdata,i,64+i*8+j);
    LCD_WriteData(wdata,i,64+i*8+j+1);
    wdata=wdata<<2;
    Delay_x10ms(speed*10);
	if(i==7&&j>=4) j=10;
	pause();
   }
   if(buttonplay)
     {
		buttonplay=0;
	    if((button==0x04)&&(i>=7)) return 0; //p2.0
	    else if(button==0x04||button==0x08) return 2;
	}
   LCD_WriteData(0x00,i,64+i*8+j-2);
   LCD_WriteData(0x00,i,64+i*8+j-1);
  }
  return 2;
}

//=============================================
//水平移动 
//0:-->
//1:<--
//============================================= 
uchar Ball_MoveP(uchar Data,uchar direction,uchar hang,uint speed,uchar value)
{ 
  int i;
  if(direction)
    {
	  for(i=0;i<62;i++)//-->
	  { 
	    if(i){
		  LCD_WriteData(0,hang,64+i-2);LCD_WriteData(0,hang,64+i-1);}
       if(buttonplay)
          {
		      buttonplay=0;
		      if((button==value)&&(i>=51)) return 0; 
			  else if(button==value) return 2;
		  }
	    LCD_WriteData(Data,hang,64+i);LCD_WriteData(Data,hang,64+i+1);
	    Delay_x10ms(speed*10);
		i++;
		pause();
	  }
	  LCD_WriteData(0,hang,64+i-2);LCD_WriteData(0,hang,64+i-1);
	  return 2;
    }
  else
    {
	  for(i=62;i>0;i--)//<--
	  { 
	    if(i!=62){
		  LCD_WriteData(0,hang,64+i+2);LCD_WriteData(0,hang,64+i+1);}
		if(buttonplay)
          {
		      buttonplay=0;
		      if((button==value)&(i<=10))  return 0;
			  else if(button==value)      return 1;
		  }
	    LCD_WriteData(Data,hang,64+i);LCD_WriteData(Data,hang,64+i-1);
	    Delay_x10ms(speed*10);
		i--;
		pause();
	  }
	  LCD_WriteData(0,hang,64+i+2);LCD_WriteData(0,hang,64+i+1);  
	  return 1;
    }
}

void Delay_x10ms(uchar DelayTime)   //*******ms延时*****//
{
       unsigned char i,j,k;
       for(i=0;i<DelayTime;i++){
          if(buttonplay) break;
          for(j=0;j<10;j++){
             if(buttonplay) break;
             for(k=0;k<45;k++) {if(buttonplay) break;}
       }  }
}

/*******************************
双人游戏
********************************/
uchar doubleplay()
{
   uchar i,flag,sendball=0,j=0;
   uchar a[3]={0,0,0},b[3]={0,0,0};
   LCD_CLR(L);LCD_CLR(R);
   //画边框
   for(i=0;i<8;i++){//球与信息分割线
      LCD_WriteData(0xFF,i,63);}
   for(i=1;i<7;i++){
      LCD_WriteData(0xFF,i,127);}//右边线
   put_chinese(chinese[20],0,4,0);//甲
   put_chinese(chinese[21],2,4,0);//乙
   for(;;)  {
    LCD_CLR(R);
	LCD_WriteData(0xFF,0,127);
	LCD_WriteData(0xFF,7,127);
	for(i=0;i<8;i++){//球与信息分割线
      LCD_WriteData(0xFF,i,63);}
    for(i=0;i<8;i++){
      LCD_WriteData(0xFF,i,127);}//右边线
    infodisplay();
    if(double_modle_1(sendball)) return 1;
	sendball++;
	if(sendball>=4) sendball=0;
    infodisplay();
	//比分局分控制
    if((gamenum.mark1>=11)&&((gamenum.mark1-gamenum.mark2)>=2))
	    {
		 a[j]=gamenum.mark1;
		 b[j]=gamenum.mark2;
		 gamenum.game1++;
		 gamenum.mark1=0;
 		 gamenum.mark2=0;
		 put_chinese(chinese[20],0,64,1);
         put_chinese(chinese[13],0,80,1);
		 enter();LCD_CLR(R);j++;
		 }
	  else if((gamenum.mark2>=11)&&((gamenum.mark2-gamenum.mark1)>=2))
 	    {
		 a[j]=gamenum.mark1;
		 b[j]=gamenum.mark2;
		 gamenum.game2++;
		 gamenum.mark1=0;
 		 gamenum.mark2=0;
		 put_chinese(chinese[21],0,64,1);
         put_chinese(chinese[13],0,80,1);
		 enter();LCD_CLR(R);j++;
	    }	 
   if(gamenum.game2>=2) {flag=1;break;}
   else if(gamenum.game1>=2) {flag=0;break;}
   }
   infoflash(a,b,flag);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -