📄 test.c
字号:
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 + -