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

📄 lcd_disp.c

📁 俄罗斯方块 在Proteus仿真通过 有兴趣的自己下载看看
💻 C
📖 第 1 页 / 共 2 页
字号:
*函数名称:Check_Interfc
*功    能:检测两个缓存区域是否存在干涉
*参    数:X  横坐标  Y  纵坐标
		  *p_figuer  指向方块的内容
          
*返    回:1  存在干涉
          0  不准在干涉
---------------------------------------------------*/
uchar Check_Interfc(uchar X,uchar Y,uchar *p_figuer)
{
 uchar temp,i,j,reval;     		
 reval=0;
 if(X>9)
    i=X-10;
 else
 	i=0; 
 for(j=0;j<4;j++)
 {
 if((Y-j)<32)
 {
 temp=((Disp_Buff[Y-j]>>i)&0x0f);
 switch (X)
 	{
 	 case 9 : temp=((temp<<1)|0x01); break;
	 case 8 : temp=((temp<<2)|0x03); break;
	 case 7 : temp=((temp<<3)|0x07); break;
	 case 39: temp=(temp|0x08); break;
	 case 40: temp=(temp|0x0c); break;
	 case 41: temp=(temp|0x0e); break;
 	}
 }
 else if(((Y-j)>31)&&((Y-j)<35))
 	temp=0x0f;
 else temp=0x00;
 
 if(*p_figuer&temp)
 	reval=1;
 p_figuer++;
 }
 return reval; 	
}

/*--------------------------------------------------
*函数名称:Clr_figure
*功    能:清除当前方块
*参    数:*p_figure     方块数据
          X             横坐标
          Y             纵坐标
*返    回:无
---------------------------------------------------*/
void Clr_Figure(uchar X,uchar Y,uchar *p)
{
 uchar i,j,temp;
 for(i=0;i<4;i++)
 	{
 	 temp=*p;
 	 for(j=0;j<4;j++)
 	 	{
 	 	 if(temp&0x01)
		 	Write_OneLargeDot( X+j,  Y-i, 0);
		 temp=temp>>1;		 
 	 	}
     p++;	 
 	} 

}
/*--------------------------------------------------
*函数名称:Rand
*功    能:产生一个1-11的随机数
*参    数:无       
*返    回:无          
---------------------------------------------------*/
uchar Ran(void)
{
 srand(TL0);
 return (rand()%11+1); 
}

/*--------------------------------------------------
*函数名称:Exchange
*功    能:一个数组的内容赋值给另外一个数组
*参    数:*p1  源数组
          *p2  目标数组          
*返    回:无          
---------------------------------------------------*/
void Exchange(uchar *p1,uchar *p2)
{
 uchar i;
 for(i=0;i<4;i++)
 	{
 	 *p2=*p1;
	 p2++;
	 p1++;
 	}
}

/*--------------------------------------------------
*函数名称:Read_Figure
*功    能:从ROM中读取方块,存放到Figure_Date[]中
*参    数:*p1  *p2       
*返    回:无
---------------------------------------------------*/
void Read_Figure(uchar code *p1,uchar *p2)
{
 uchar i;
 for(i=0;i<4;i++)
 	{
 	 *p2=*p1;
	 p1++;
	 p2++;
 	}
}
/*--------------------------------------------------
*函数名称:Read_Sel_Figure
*功    能:从ROM中读取选定的方块,存放到Figure_Date[]中
*参    数:type 方块的形状代码(1-11)
          *p  存放读取内容的数组
*返    回:无
---------------------------------------------------*/
void Read_Sel_Figure(uchar type,uchar *p)
{
 switch (type)
 	{
 	 case 1:Read_Figure(a, p); break;  // 田
	 
	 case 2:Read_Figure(b, p); break;  // |
	 case 3:Read_Figure(c, p); break;  //一
	 
	 case 4:Read_Figure(d, p); break;  // 一I一
	 case 5:Read_Figure(e, p); break;
	 case 6:Read_Figure(f, p); break;
	 case 7:Read_Figure(g, p); break;
	 
	 case 8:Read_Figure(h, p); break;
	 case 9:Read_Figure(i, p); break;
	 
	 case 10:Read_Figure(j, p); break;
	 case 11:Read_Figure(k, p); break;	 
 	}
}
/*--------------------------------------------------
*函数名称:Trans
*功    能:方块变形程序
*参    数:type 方块当前形状代码       
*返    回:无
---------------------------------------------------*/
void Trans(uchar type)
{
 if(Y_Coor>1)
 {
 switch (type)
 	{
 	 case 1: ; break;
	 case 2:{
	 	     Read_Sel_Figure(3,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
             {Fig_Type=3;
			 Read_Sel_Figure(3,Figure_Date);//从内存中读取新的方块数据
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }	           
			} break;
	 case 3:{
			 Read_Sel_Figure(2,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=2;
			 Read_Sel_Figure(2,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 4:{
			 Read_Sel_Figure(5,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
             {Fig_Type=5;
			 Read_Sel_Figure(5,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 5:{
			 Read_Sel_Figure(6,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=6;
			 Read_Sel_Figure(6,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 6:{
			 Read_Sel_Figure(7,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=7;
			 Read_Sel_Figure(7,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 7:{
			 Read_Sel_Figure(4,Figure_Date_New);
            if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			{Fig_Type=4;
			Read_Sel_Figure(4,Figure_Date);	
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			}			
			} break;
	 case 8:{
			 Read_Sel_Figure(9,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=9;
			 Read_Sel_Figure(9,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 9:{
			 Read_Sel_Figure(8,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=8;
			 Read_Sel_Figure(8,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 10:{
			 Read_Sel_Figure(11,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=11;
			 Read_Sel_Figure(11,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;
	 case 11:{
			 Read_Sel_Figure(10,Figure_Date_New);
			 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date_New)) //检测变形后是否干涉
			 {Fig_Type=10;
			 Read_Sel_Figure(10,Figure_Date);
			 Write_Preview(Clr_Preview);
             Write_Preview(Figure_Date);
			 }				
			} break;	 
 	}
 	}
}

/*--------------------------------------------------
*函数名称:Chk_Line_Full
*功    能:检查一行是否满
*参    数:Y     
*返    回:0 该行未填满
          1 该行已经填满
---------------------------------------------------*/
uchar Chk_Line_Full(uchar y)
{
 if(y<32)
 	{
 if(Disp_Buff[y]==0xffffffff)
 	return 1;
 else 
 	return 0;
 	}
 return 0;
}
/*--------------------------------------------------
*函数名称:Line_Move_Down
*功    能:整行下移一行
*参    数:Y 开始下移的行坐标      
*返    回:无
---------------------------------------------------*/
void Line_Move_Down(uchar y)
{
 while(y)
 	{
 	 Disp_Buff[y+1]=Disp_Buff[y];
	 y--;
 	}
 Disp_Buff[y+1]=Disp_Buff[y];

}

/*--------------------------------------------------
*函数名称:Move_Down
*功    能:图形下移子程序
*参    数:无    
*返    回:无
---------------------------------------------------*/
void Move_Down(void)
{ uchar i;
 if(Y_Coor==0)
 Write_Preview(Figure_Date);            //刷新预览区
 Y_Coor=Y_Coor+1;

 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date)) //检查是否能下落
      {
       if(Y_Coor>1)                  //初始状态没有方块可清除
        {
         Clr_Figure(X_Coor,Y_Coor-1,Figure_Date_Old);  //清除上一个方块
         Exchange(Figure_Date,Figure_Date_Old);         
        }
 	   Write_4x4Ram(X_Coor,Y_Coor,Figure_Date);   //写入新的方块
 	  }
 else
	{Y_Coor--;
	 Update_Disp_Buff(Figure_Date);      //如果不能继续下落,将方块写入背景
	 Clr_Figure(X_Coor,Y_Coor,Figure_Date_Old);
	 Write_4x4Ram(X_Coor,Y_Coor,Figure_Date);
     for(i=0;i<4;i++)                      //检查是否满行
     	{
     	 if(Chk_Line_Full(Y_Coor-3+i))
     	 	{Line_Move_Down(Y_Coor-4+i);
             Disp_Update();
			 SUM=SUM+10;   //总分加十
			 if(SUM>10)   //如果总分超过200,速度加一
			 	{SUM=0;
			 	 speed++;
				 if(speed>6)
				 	speed=0;
				 Move_Down_Delay=(5-speed)*10 ;
				 Disp_Num(speed,0);
			 	}
			 Disp_Num(SUM,1);
		    }
     	}
	if(Y_Coor==0)                      //第0行即存在干涉游戏结束
 	   Game_Over=0;
	else
	  {Y_Coor=0;                      //方块重新落下
	  X_Coor=25;
	  Fig_Type=Ran();                 //读取随机数,产生新的方块
	  Read_Sel_Figure(Fig_Type, Figure_Date); //根据形状代码读取方块
	  Write_Preview(Clr_Preview);            //清除预览区
	  Exchange(Figure_Date,Figure_Date_Old); //上一个方块存储当前方块
	  Write_Preview(Figure_Date);            //刷新预览区
	  }
    }
}

/*--------------------------------------------------
*函数名称:Move_Left
*功    能:图形左移子程序
*参    数:无    
*返    回:无
---------------------------------------------------*/
void Move_Left(void)
{
 //Figure(X_Coor,Y_Coor,Figure_Date);
 X_Coor--;
 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date))   //检测是否能够向左移动
    {Clr_Figure(X_Coor+1,Y_Coor,Figure_Date);     //能够移动清除上一个方块
     Write_4x4Ram(X_Coor,Y_Coor,Figure_Date);  //在新的位置写入新的方块
 	}  
 else
  	X_Coor=X_Coor+1;         //不能移动,坐标停止自减	  	
}
/*--------------------------------------------------
*函数名称:Move_Right
*功    能:图形右移子程序
*参    数:无    
*返    回:无
---------------------------------------------------*/
void Move_Right(void)
{
 //Clr_Figure(X_Coor,Y_Coor,Figure_Date);
  X_Coor++;
 if(!Check_Interfc(X_Coor,Y_Coor,Figure_Date)) //检测是否能够向右移动
    {Clr_Figure(X_Coor-1,Y_Coor,Figure_Date); 
     Write_4x4Ram(X_Coor,Y_Coor,Figure_Date);
 	} 
 else
  	X_Coor=X_Coor-1;	
}
/*--------------------------------------------------
*函数名称:Delay
*功    能:控制加速下落的延时
*参    数:无    
*返    回:无
---------------------------------------------------*/
void Delay(void) 
{ 
  unsigned char i,j,k; 
  for(k=2;k>0;k--) 
  for(i=20;i>0;i--) 
  for(j=248;j>0;j--); 
} 
/*--------------------------------------------------
*函数名称:Key_Manage
*功    能:按键管理子程序
*参    数:无    
*返    回:无
---------------------------------------------------*/
void Delay10ms() 
{ uchar a,b;
    for(a=100;a>0;a--)

      for(b=225;b>0;b--);

}
void Key_Manage(void)
{
 if(!KEY_Left)
 	{Delay10ms();
    if(!KEY_Left)
 	Move_Left();}
 if(!KEY_Right)
 	{Delay10ms();
     if(!KEY_Right)
 	 Move_Right();}
 if(!KEY_Transf)
 	{ Delay10ms();
     if(!KEY_Transf)
 	  Trans(Fig_Type);	  
	}
 if(!KEY_Speedup)
 	{
 while(!KEY_Speedup)
 	{
 	 TR0=0;   //关闭定时器,下落改由延时程序来控制
 	 Move_Down();
	 Delay(); 	 
 	}
 TR0=1;
 	}
}












⌨️ 快捷键说明

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