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

📄 test.c

📁 ucosii的源代码希望能给予学习嵌入式系统的朋友一定的帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
	Ending();
    OSTimeDlyHMSM(0, 0, 1, 0);                          /* Wait one second                          */#endif
		}

}

void Ending(void)
{
    GLCDString(0,9,"        ");
    GLCDString(0,8,"        ");
    GLCDString(0,7,"        ");
    GLCDString(0,8,"THE END!");
    
    KeyLevel = 0;
    OSTaskDel(OS_PRIO_SELF);
}

/*				Tetris Function					*/
void IdentLine(void)
{ 
 
 int i, j, k;
 int del_line = 0; 
 int how_line[5]; 
 
 for(i = 1; i < HEIGHT+1; i++) 
 { 

  for(j = 1; j < WIDTH+1; j++)    
   if(Fild[i][j] == 0)
    goto loop3; 
    
   for(j = 1; j < WIDTH+1; j++) 
   { 
    Fild[i][j] = 0; 
    DelBlock(j, i); 
    
    for(k = 0; k < MaxFallTime; k++) 
    OSTimeDlyHMSM(0,0,0,60);							//Delete Line.
   } 
   
   del_line++;
   how_line[del_line] = i; 
  
loop3:;  
 } 
 
 for(; del_line > 0; del_line--) 
  for(i = how_line[del_line]; i < HEIGHT+1; i++) 
   for(j = 1; j < WIDTH + 1; j++) 
   { 
    Fild[i][j] = Fild[i+1][j]; 
    
    if(Fild[i][j]) 
    	DrawBlock(j, i); 
    	DelBlock(j, i + 1);
   } 
} 

void BlockTurn(void)
{ 
 
 int temp, i, j; 
 
 if(BlockType) 
 { 

  for(i = 0; i< 4; i++)   
  { 
   temp = BlockCode[i][0]; 
   BlockCode[i][0] = BlockCode[i][1]; 
   BlockCode[i][1] = -temp; 
  } 
  
  for(i = 0; i< 2; i++)
   for(j = 1; j < 4; j++)
    NewBlock[j][i] = NewBlock[0][i] + BlockCode[j][i]; 
   
   for(i = 0; i <4; i++)
   {
    for(j = 0; j < 2 && !(LookBlock(i + 1, 0, 0)); j++) 
    {
     BlockMove(0, GtBlock(i, 0)); 
     BlockMove(1, GtBlock(i, 1)); 
    } 
   }
 } 
 
 if(!(LookBlock(4, 0, 0))) 
 { 
  for(i = 0; i < 4; i++) 
  { 
   for(j = 0; j < 2; j++)
   NewBlock[i][j] = OldBlock[i][j]; 
   temp = BlockCode[i][0]; 
   BlockCode[i][0] = -BlockCode[i][1]; 
   BlockCode[i][1] = temp; 
  } 
 }
} 


int GtBlock(int a, int b)
{ 
 
 if(BlockCode[a][b] < 0)
  return 1;
 else if(BlockCode[a][b] > 0) 
  return -1; 
 else 
  return 0; 
 
} 

void DelBlock(INT8S a, INT8S b)
{ 
	INT8U err;

	if(b > HEIGHT - 1) return;
	
	OSSemPend(DrawBlockSem, 0, &err);
		if((a > 0)&&(a < WIDTH +1)){
	 		if((b > 0)&&(b <HEIGHT +1)){
	 			a -= 1;
	 			b -=1;
			if(b < 8){
		 		DispBlock(a, b,'0', DELBLOCK); 
			}else{
		 		b -= 8;
		 		DispBlock(a, b,'1', DELBLOCK); 
			}
		}
	}
	OSSemPost(DrawBlockSem);
}

void DrawBlock(INT8S a, INT8S b)
{
	INT8U err;
	
 	if(b > HEIGHT - 1) return;
 
 	OSSemPend(DrawBlockSem, 0, &err);					//Prevent to overlap
 	if((a > 0)&&(a < WIDTH +1)){
	 	if((b > 0)&&(b <HEIGHT +1)){
	 			a -= 1;
	 			b -=1;
		 	if(b < 8){
		 		DispBlock(a, b,'0', DISBLOCK); 
			}else{
		 		b -= 8;
		 		DispBlock(a, b,'1', DISBLOCK); 
	 		}
		}
	}
	OSSemPost(DrawBlockSem);
}


void BlockCopy(void)
{ 
 
 int i, j; 
 
 for(i = 0; i < 4; i++) 									//Block Loop
  for(j = 0; j < 2; j++) 
   OldBlock[i][j] = NewBlock[i][j]; 						//
  
}

int LookBlock(int a, int b, int c)							//4,0,-1 block view
{ 
 
 int i; 
 
 for(i = 0; i < a; i++) 								
	if(Fild[NewBlock[i][1]+c][NewBlock[i][0]+b])			//store block of position to fild
   		return FALSE;  
  return TRUE; 
}

void BlockMove(int a, int b)
{ 
 
 int i; 
 NewBlock[0][a] = NewBlock[0][a] + b ; 

 for(i = 1; i < 4; i++)  
  NewBlock[i][a] = NewBlock[0][a] + BlockCode[i][a]; 
 
}
void FirstDraw(void)
{ 
 
 INT8U i, j; 
 NewBlock[0][0] = WIDTH / 2; 								//Center
 NewBlock[0][1] = HEIGHT + 1 - 2; 								//Top Position.
 	
// if(NewBlock[i][1]DrawBlock(i,0);	
 for(i = 0; i < 2; i++) 									//Block Loop
  for(j = 1; j < 4; j++)
   NewBlock[j][i] = NewBlock[0][i] + BlockCode[j][i];	//Next Block.				
	
  BlockCopy();
  for(i = 0; i < 4; i++){
   if(NewBlock[i][1] < HEIGHT) DrawBlock(NewBlock[i][0], NewBlock[i][1]);
//   else DrawBlock(i,0);
	}
}

void CreBlock(void)
{ 												//NEXT BLOCK DRAW & DELETE
 
 INT8U i, j;
 for(i = 0; i < 4; i++) 
  for(j = 0; j < 2; j++) 
   BlockCode[i][j] = NextBlock[i][j];
  
  BlockType = NextType;

  switch(NextType = (rand() % 7))
  { 
  case 0: NextBlock[0][0] = 0; NextBlock[1][0] = 1; NextBlock[2][0] = 1; NextBlock[3][0] = 0; 
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 1; NextBlock[3][1] = 1; break; 
  case 1: NextBlock[0][0] = 0; NextBlock[1][0] = -1; NextBlock[2][0] = 1; NextBlock[3][0] = 0; 
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 0; NextBlock[3][1] = 1; break; 
  case 2: NextBlock[0][0] = 0; NextBlock[1][0] = 0; NextBlock[2][0] = -1; NextBlock[3][0] = 1; 
          NextBlock[0][1] = 0; NextBlock[1][1] = 1; NextBlock[2][1] = 1; NextBlock[3][1] = 0; break; 
  case 3: NextBlock[0][0] = 0; NextBlock[1][0] = -1; NextBlock[2][0] = 0; NextBlock[3][0] = 1;   
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 1; NextBlock[3][1] = 1; break; 
  case 4: NextBlock[0][0] = 0; NextBlock[1][0] = -1; NextBlock[2][0] = -1; NextBlock[3][0] = 1;    
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 1; NextBlock[3][1] = 0; break; 
  case 5: NextBlock[0][0] = 0; NextBlock[1][0] = -1; NextBlock[2][0] = 1; NextBlock[3][0] = 1;    
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 0; NextBlock[3][1] = 1; break; 
  case 6: NextBlock[0][0] = 0; NextBlock[1][0] = -1; NextBlock[2][0] = -2; NextBlock[3][0] = 1; 
          NextBlock[0][1] = 0; NextBlock[1][1] = 0; NextBlock[2][1] = 0; NextBlock[3][1] = 0; break; 
  } 
  
}

void StartFild(void)
{ 												//fild[Height][Width] : Game fild array
	INT8U i, j;
	for(i = 0; i < WIDTH + 2; i++)				//Lowest Line Masking
		Fild[0][i] = 1; 
	for(i = 1; i < HEIGHT + 2; i++){ 			//Side Line Masking
  	Fild[i][0] = 1; 
  	Fild[i][WIDTH+1] = 1; 
	}
	for(i = 1; i < WIDTH + 1; i++) 				//Center Fild array
	for(j = 1; j < HEIGHT + 2; j++)
	Fild[j][i] = 0;
}

/*************************************  LCD Control Function  ********************************/
void DispBlock(INT8S x, INT8S y, INT8U LcdCS, INT8U Flag)
{
	INT8U Block[8];
	INT8U i;

		if(Flag == DISBLOCK){
			Block[0]=Block[7]=0xff;
			Block[1]=Block[6]=0x81;
			Block[2]=Block[5]=0x81;
			Block[3]=Block[4]=0x99;
		}else{
			Block[0]=Block[7]=0x0;
			Block[1]=Block[6]=0x0;
			Block[2]=Block[5]=0x0;
			Block[3]=Block[4]=0x0;
		}
		y*=8; 
		WriteInstruct(LcdCS, GLCD_PAGE_ADDR+x);
		WriteInstruct(LcdCS, GLCD_SET_ADDR+y);	
		Flag = 0;	

		for(i=0;i<8;i++){
			WriteData(LcdCS, Block[i]);  
		}
}

/*
**************************************************************************************************************
*                                                  SUPPORT ROUTINES
**************************************************************************************************************
*/

/*
 * UART Data Register Empty Interrupt
 *
 * Uses the structure of J.J Labrosse: Embedded Systems Building Blocks, p. 360
 *
 * See the file README for the description of the general ISR format.
 *
 */
void AvrInit (void)
{
	MCUCR = 0x80;		// enable external memory and I/O
	XMCRA = 0x42;		// 0x1100-0x7FFF=0 wait, 0x8000-0xFFFF=1 wait
	XMCRB = 0x80;		// enable bus keeper, use PC0-PC7 as address
		

  OS_ENTER_CRITICAL();
/*   TCCR0=0x05;                                 /\* on some processors other than mega128 *\/ */
  TCCR0=0x07;                                         /* Set TIMER0 prescaler to CLK/1024                 */
  TIMSK=_BV(TOIE0);                                   /* Enable TIMER0 overflow interrupt                 */
  TCNT0=256-(CPU_CLOCK_HZ/OS_TICKS_PER_SEC/1024);     /* Set the counter initial value                    */
  OS_EXIT_CRITICAL();


	SetPort('F',0xff,0x00);
	SetPort('A',0xff,0x0);
	SetPort('C',0xff,0x01);
	SetPort('D',0xff,0x0);
	SetPort('B',0xff,0x55);
	SetPort('E',~KEY_TETRIS,0x0);
//	EICRA= 0x05;							//LOW STATE ACTIVE
//	EIMSK = 0x03;							//4~7 Interrupt Enable.	
}

⌨️ 快捷键说明

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