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

📄 e.c

📁 这是用一个52单片机实现的俄罗斯方块游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
Write_Box_ditu();
}

void mov_right()
{
Clr_Box_ditu();
this.y++;

if((Check_Box_ditu())||(Check_Box_gameline()))//crack
this.y--;

Write_Box_ditu();
}


void mov_ratation()
{
   Clr_Box_ditu();

 if(Check_Box_ditu_ratation()==0) ///////////////////////////////////////
	 {
    //状态转变
    this.Status ++;
    if(this.Status >= TtrsBlckStsNum[this.BlckIndex])  this.Status = 0;

    this.pPIC   = TtrsBlck
                + TtrsBlckPoint[this.BlckIndex] 
                + (this.Status) * 4;
	}
Write_Box_ditu();

}

//////////////////////////////////
//crack_state=0;can move down
//crack_state=1;can not  move down check is have full lines then  delete it
//////////////////////////////////

void  mov_down()
{
down_time=0;
Clr_Box_ditu();
this.x++;
if((Check_Box_ditu())||(Check_Box_gameline()))//crack
{this.x--;	     crack_state=1;}
else             crack_state=0;
Write_Box_ditu();
if(crack_state==1)check_ditu();
}


////////////////////////////////////////////////////延时
void delay_us(unsigned  int a)
{
while(a>0)a--;
}

void delay_ms(unsigned  int a)
{
while(a>0)
{a--;delay_us(250);}
}
//////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////
////////////////////////////////////////////////////液晶基本函数
char RdStateLcd( )
 {
  unsigned char state;

  Rs_Lcd=0;
  Rw_Lcd=1;
  En_Lcd=1;

  state=DataBuss;
  En_Lcd=0;
  
  return(state);
 }


char WrCommandIc(unsigned char Command)
 { 
  unsigned char state,tmp;

  state=0;
  for(tmp=0xFF;(RdStateLcd( )&0x80)&&(tmp>0x00);tmp--)
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
    Rs_Lcd=0;
    Rw_Lcd=0; 
	DataBuss=Command;
	En_Lcd=1;
	En_Lcd=0;
   }
  return(state);   
 }

char WrCommandLcd(unsigned char Command)
 {
	unsigned char state;

	Cs1_Lcd=1;
	Cs2_Lcd=0;
	state=WrCommandIc(Command);
	if(state==0)
	 {
	  Cs1_Lcd=0;
	  Cs2_Lcd=1;
	  state=WrCommandIc(Command);
	 }
	return(state);
 }

char WrDataLcd(unsigned char dat)
 {
  unsigned char state,tmp;

  state=0;
  for(tmp=0xFF;(RdStateLcd( )&0x80)&&(tmp>0x00);tmp--)//ban mang ?
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
 	Rw_Lcd=0;
    Rs_Lcd=1;
	DataBuss=dat;
	En_Lcd=1;
	En_Lcd=0;
   }
  return(state);        
 }

   //***********************************************
   //* Name: 	       SetStarLine
   //* Function:       设置显示开始行
   //*********************************/
	 char SetStarLine(char line)
  {	 
  	char state;
  	line=(line&0x3F)|0xC0;
	state=WrCommandLcd(line);
	return(state);
  }



 void InitDis(void)
 {
   SetStarLine(0x00);
   WrCommandLcd(0x3F);//kai xian shi 
 }


  char SysInit(void)
  {
  	unsigned char i, state;

  //  Rst_Lcd=0;						//复位lcd
    for(i=0xFF;i>0;i--) 			//延时1ms
     { ; }
    //Rst_Lcd=1;
    SetStarLine(0x00);
	InitDis( );
 
	return(state);
  }
   //********************************/
   //* Name: 	       SetStarLine
   //* Function:       设置当前页地址       
   //* Input:		   page=页地址	            
   //***************************************/
char SetPageAddr(char page)
  {
  	char state;
	page=(page&0x07)|0xB8;
	state=WrCommandLcd(page);
	return(state);
  }
   //*******************/
   //* Name: 	       SetStarLine
   //* Function:       设置当Y地址      
   //* Input:		   line=开始显示的行数?	           
 ///////////  **********/
char SetYAddr(char y)
  {
  	char state;
	y=(y&0x3F)|0x40;
	state=WrCommandLcd(y);
	return(state);    
  }
//////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////
////////////////////////////////////////////////////显示某点
void Dispoint(unsigned char page,unsigned char y)
{
unsigned  char  tmp=0;
unsigned  char  state=0;

SetPageAddr(page/8);
SetYAddr(y);
if(y<64) {Cs1_Lcd=1;Cs2_Lcd=0;}
else     {Cs1_Lcd=0;Cs2_Lcd=1;}

   	En_Lcd=0;
  for(tmp=0xFF;(RdStateLcd()&0x80)&&(tmp>0x00);tmp--)
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
    Rs_Lcd=1;
    Rw_Lcd=1; 

	En_Lcd=1;   delay_us(2);
		dat=DataBuss;
	En_Lcd=0;	 delay_us(2);
	   
		En_Lcd=1;   delay_us(2);
		dat=DataBuss;
    	En_Lcd=0;   delay_us(2);

   }

dat|=(1<<(page%8));
SetPageAddr(page/8);
SetYAddr(y);
if(y<64) {Cs1_Lcd=1;Cs2_Lcd=0;}
else     {Cs1_Lcd=0;Cs2_Lcd=1;}
  for(tmp=0xFF;(RdStateLcd( )&0x80)&&(tmp>0x00);tmp--)//ban mang ?
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
 	Rw_Lcd=0;
    Rs_Lcd=1;

   DataBuss=dat;

	En_Lcd=1;
	En_Lcd=0;
   }

}

////////////////////////////////////////////////////清除某点
void Clrpoint(unsigned char page,unsigned char y)
{
unsigned  char  tmp=0;
unsigned  char  state=0;

SetPageAddr(page/8);
SetYAddr(y);
if(y<64) {Cs1_Lcd=1;Cs2_Lcd=0;}
else     {Cs1_Lcd=0;Cs2_Lcd=1;}

   	En_Lcd=0;
  for(tmp=0xFF;(RdStateLcd( )&0x80)&&(tmp>0x00);tmp--)
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
    Rs_Lcd=1;
    Rw_Lcd=1; 

	En_Lcd=1;   delay_us(10);
		dat=DataBuss;
	En_Lcd=0;	 delay_us(10);
	   
		En_Lcd=1;   delay_us(10);
		dat=DataBuss;
    	En_Lcd=0;   delay_us(10);

   }
dat&=~(1<<(page%8));
SetPageAddr(page/8);
SetYAddr(y);
if(y<64) {Cs1_Lcd=1;Cs2_Lcd=0;}
else     {Cs1_Lcd=0;Cs2_Lcd=1;}
  for(tmp=0xFF;(RdStateLcd( )&0x80)&&(tmp>0x00);tmp--)//ban mang ?
   { ; }
  if(tmp==0)
   { state=0xFF; }
  else
   {
 	Rw_Lcd=0;
    Rs_Lcd=1;

   DataBuss=dat;

	En_Lcd=1;
	En_Lcd=0;
   }

}

////////////////////////////////////////////////////请屏幕
  void ClrScreen(void)
 {
   char i,j,state;

   for(j=0;j<8;j++)
    {
      state=SetPageAddr(j);
      state=SetYAddr(0x00);

      Cs1_Lcd=1;
      Cs2_Lcd=0;
      for(i=0;i<64;i++)	//清
       {
	     state=WrDataLcd(0);
	    }
      Cs1_Lcd=0;
      Cs2_Lcd=1;
      for(i=0;i<64;i++)	//清
       {
	     state=WrDataLcd(0);
	   }
    }
  }

  void DisChar(unsigned char *p,unsigned char page,unsigned char y,char state)
  {
    unsigned char i,j,tmp;

	for(j=0;j<2;j++)
	 {
	   SetPageAddr(page+j);
	   if(y<64)
	    { i=y; }
	   else
	    { i=y-64; }
       SetYAddr(i);
	   //SetStarLine(i);

	   if(y<64)
	    {
	      Cs1_Lcd=1;	
          Cs2_Lcd=0;
	    }
	   else
	    {
	      Cs1_Lcd=0;
          Cs2_Lcd=1;
	    }
	
       for(i=8;i<16;i++)
        {
		  tmp=p[i-8*j];                         
		  if(state==0x01)
		   { tmp=~tmp; }
          WrDataLcd(tmp);					
        }
	 }
  }

////////////////////////////////////////////////////状态机按键
unsigned  char read_key(unsigned char a,unsigned char key)
{
char key_press, key_return = 0;

key_press = key;// 读按键I/O电平

switch (key_state[a])
 {
case key_state_0:// 按键初始态
                if (!key_press) key_state[a] = key_state_1;// 键被按下,状态转换到键确认态
                break;

case key_state_1:// 按键确认态
		if (!key_press)
		{
		key_return = 1;			// 按键仍按下,按键确认输出为“1”
		key_state[a] = key_state_2;	// 状态转换到键释放态
		}
		else
		key_state[a] = key_state_0;	// 按键已抬起,转换到按键初始态
		break;

case key_state_2:
		if (key_press) key_state[a] = key_state_0;	//按键已释放,转换到按键初始态
		break;
}

	
    	return key_return;
}

⌨️ 快捷键说明

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