📄 lcd5110.c
字号:
// if(led==0)
//{led=1;}
//else led=0;
}
else if(keyval==2&&down==0)
{
down=1;
// beep();
if(beep2==0) {beep2=1;write_string(0,5," beep on ");}
else {beep2=0;write_string(0,5," beep off ");}
}
else if(keyval==3&&down==0)
{
down=1;
//beep();
LCD_clear();
ping();
disguan();
disscore();
disstep();
//TR0=1;
LCD_set_XY(75,1);
for(i=0;i<8;i++)
{LCD_write_byte(fangkuai[i],1);}
renew();
break;
}
}
}
#endif
//////////////////////////////////////////////////////
//刷新游戏区屏幕
//////////////////////////////////////////////////////
void renew()
{
unsigned char i, j;
//////new=background then front合并进new///////
for(j=0;j<3;j++)
{
for(i=0;i<58;i++)
{new[j][i]=background[j][i];}
}
for(j=0;j<3;j++)
{
for(i=0;i<8;i++)
{
new[j][front_x+i-16]|=front[j][i];
}
}
/////////////显示new////////////
for(j=3;j>0;j--)
{
LCD_set_XY(16,j);
for(i=0;i<58;i++)
{LCD_write_byte(new[j-1][i],1);}
}
}
/////////////////////////////////////////////////
//显示过关画面
/////////////////////////////////////////////////
void disguoguan()
{
unsigned int i;
unsigned char j;
LCD_clear();
write_string(15,1,"GOOD GAME");
write_string(18,3,"HAVE FUN");
write_string(15,5,"GOOD LUCK");
for(i=0;i<50000;i++)
{
delay(2);
}
LCD_clear();
ping();
disguan();
disscore();
disstep();
LCD_set_XY(75,1);
for(j=0;j<8;j++)
{
LCD_write_byte(fangkuai[j],1);
}
renew();
}
/////////////////////////////////////////////////
//欢迎屏幕
/////////////////////////////////////////////////
void welcome(void)
{
// dishead();
// while(scakey()==0);
LCD_clear();
write(0,0,0);
write(1,0,1);
write(2,0,2);
write(3,0,3);
write(4,0,4);
write_string(0,2,"Designed by...");delay(3);
write_string(7,3,"Duhongxu");delay(2);
write_string(0,4,"press any key to start...");
// while(scakey()==0);
LCD_clear();
}
/************************************************
t0控制下降速度 t1产生随机数
*************************************************/
/////////////////////////////////////////////////////
//生成方块
/////////////////////////////////////////////////////
void create()
{
unsigned char i;
fknow=suijishu;
for(i=0;i<8;i++)
{fangkuai[i]=fk[4*fknow][i];}
fknext=fknow;
}
/*****************************************************
方块初始化
******************************************************/
void fangkuai_init()
{
unsigned char i;
load();
fknow=fknext;
fknext=suijishu;
for(i=0;i<8;i++)
{fangkuai[i]=fk[4*fknext][i];}
LCD_set_XY(75,1);
for(i=0;i<8;i++)
{LCD_write_byte(fangkuai[i],1);}
}
//////////////////////////////////////////////////////
//背景 new 赋初值
//////////////////////////////////////////////////////
void bg_init()
{
unsigned char i,j;
for(j=0;j<3;j++)
{
for(i=0;i<58;i++)
{background[j][i]=0;}
}
for(j=0;j<3;j++)
{background[j][1]=0xff;}
}
/******************************************************
方块装入涂层
******************************************************/
void load(void)
{
unsigned char i,j;
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=0;//front init
}
}
for(i=0;i<8;i++)
{front[1][i]=fangkuai[i];}
}
//////////////////////////////////////////////////////
//刷新游戏区屏幕
//////////////////////////////////////////////////////
/////////////////////////////////////////////////////
//front和background作与运算 //
//参数x为background的参与运算位置 //
//返回值 1允许移动 0到边界 //
/////////////////////////////////////////////////////
unsigned char allow(unsigned char x)
{
unsigned char i,j,k;
for(j=0;j<3;j++)
{
for(i=0;i<8;i++)
{
k=fronttemp[j][i]&background[j][x+i-16];
if(k!=0) return 0;
}
}
return 1;
}
////////////////////////直接用front
unsigned char allow2(unsigned char x)
{
unsigned char i,j,k;
for(j=0;j<3;j++)
{
for(i=0;i<8;i++)
{
k=front[j][i]&background[j][x+i-16];
if(k!=0) return 0;
}
}
return 1;
}
/////////////////////////////////////////////////////
//上移
/////////////////////////////////////////////////////
void up()
{
unsigned char i,j;
unsigned char k;
for(i=0;i<8;i++)
{
if(front[0][i]&1)
{
k=0;break;
}
k=1;
}
if(k==1)
{
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
fronttemp[i][j]=(front[i][j]>>2)|(front[i+1][j]<<6);
}
}
for(j=0;j<8;j++)
{fronttemp[2][j]=front[2][j]>>2;}
if(allow(front_x))
{
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=fronttemp[i][j];
}
}
moved-=1;
disstep();
}
}
// TR0=1;
}
////////////////////////////////////////////////////
//下移
////////////////////////////////////////////////////
void godown()
{
unsigned char i,j;
unsigned char k;
// TR0=0;
for(i=0;i<8;i++)
{
if(front[2][i]&0x80)
{
k=0;break;
}
k=1;
}
if(k==1)
{
for(i=2;i>0;i--)
{
for(j=0;j<8;j++)
{
fronttemp[i][j]=(front[i][j]<<2)|(front[i-1][j]>>6);
}
}
for(j=0;j<8;j++)
{fronttemp[0][j]=front[0][j]<<2;}
if(allow(front_x))
{
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=fronttemp[i][j];
}
}
moved+=1;
disstep();
}
}
// TR0=1;
}
//////////////////////////////////////////////////
//move up 和上移一样 只少了 moved-=1;
///////////////////////////////////////////////////
void move_up()
{
unsigned char i,j;
unsigned char k;
for(i=0;i<8;i++)
{
if(front[0][i]&1)
{
k=0;break;
}
k=1;
}
if(k==1)
{
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
fronttemp[i][j]=(front[i][j]>>2)|(front[i+1][j]<<6);
}
}
for(j=0;j<8;j++)
{fronttemp[2][j]=front[2][j]>>2;}
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=fronttemp[i][j];
}
}
}
}
///////////////////////////////////////////////////
//move down 和下移一样 只少了 moved+=1;
///////////////////////////////////////////////////
void move_down()
{
unsigned char i,j;
unsigned char k;
for(i=0;i<8;i++)
{
if(front[2][i]&0x80)
{
k=0;break;
}
k=1;
}
if(k==1)
{
for(i=2;i>0;i--)
{
for(j=0;j<8;j++)
{
fronttemp[i][j]=(front[i][j]<<2)|(front[i-1][j]>>6);
}
}
for(j=0;j<8;j++)
{fronttemp[0][j]=front[0][j]<<2;}
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=fronttemp[i][j];
}
}
}
}
///////////////////////////////////////////////////
//换向
///////////////////////////////////////////////////
void change(void)
{
unsigned char i,j,temp[8];
// TR0=0;
for(i=0;i<8;i++)
{temp[i]=fk[4*fknow+bianhuan][i];}
bianhuan++;
if(bianhuan==4){bianhuan=0;}
//load temp as fangkuai
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
front[i][j]=0;
}
}
for(i=0;i<8;i++)
{front[1][i]=temp[i];}
//move to where it is before
if(moved<10)
{
for(i=0;i<(10-moved);i++)
{
move_up();
}
}
else if (moved>10)
{
for(i=0;i<(moved-10);i++)
{
move_down();
}
}
renew();
// TR0=1;
}
///////////////////////////////////////////////////
//由定时器控制涂层下降
///////////////////////////////////////////////////
void move()
{
if(allow2(front_x-2))
{
front_x-=2;
disstep();
renew();
}
else
{
win();
}
}
///////////////////////////////////////////////////
//消层
///////////////////////////////////////////////////
void cut1(unsigned char i,unsigned char j)
{
unsigned char k;
for(k=j;k<(56-j);k++)
{
background[i][k]=background[i][k+2];
}
}
void cut(unsigned char j)
{
unsigned char i;
// TR0=0;
for(i=0;i<3;i++)
{
cut1(i,j);
}
for(i=0;i<3;i++)
{
background[i][56]=0;
background[i][57]=0;
}
// TR0=1;
}
///////////////////////////////////////////////////
//GAME OVER
///////////////////////////////////////////////////
void game_over()
{
// TR0=0;
disover();
LCD_clear();
ping();
bg_init();
create();
fangkuai_init();
renew();
score=0;
guan=1;
step=0;
speed=6;
disscore();
disguan();
// TR0=1;
}
///////////////////////////////////////////////////
//得分判断
///////////////////////////////////////////////////
//////////消层/////////////
void xiao()
{
unsigned char i,j,k,l;
for(i=2;i<58;i++)
{
l=0;
for(j=0;j<3;j++)
{
k=background[j][i]&0xff;
if(k==0xff) l+=1;
}
if(l==3)
{
cut(i);
score+=20;
disscore();
if(score%100==0)
{
guan+=1;
disguoguan();
if((speed-2)>1)
{
speed-=2;
}
disguan();
}
}
}
}
void win(void)
{
//////////front合并进background///////////
unsigned char i,j;
// TR0=0;
for(j=0;j<3;j++)
{
for(i=0;i<8;i++)
{
background[j][front_x+i-16]|=front[j][i];
}
}
xiao();
xiao();
if(front_x==66)
{
game_over();
}
front_x=66;
ping();
fangkuai_init();
moved=10;
// TR0=1;
renew();
}
#if 0
/**************************************************
中断处理
***************************************************/
void timer1(void) interrupt 3 //suijishu0 to 6
{
if(suijishu<6)
suijishu++;
else
suijishu=0;
}
void timer0(void) interrupt 1 //dawn speed
{
if(speedtemp<speed)
{speedtemp++;}
else//front dawn
{
move();
speedtemp=0;
}
}
#endif
void key(void)
{
unsigned char keyval;
keyval=scakey();
if(keyval==0)
{
down=0;
other=0;
}
else if(keyval==1&&down==0)
{
down=1;
// beep();
up();
renew();
}
else if(keyval==2&&down==0)
{
down=1;
// beep();
change();
}
else if(keyval==3&&down==0)
{
down=1;
// beep();
godown();
renew();
}
else if(keyval==12&&other==0)
{
down=1;other=1;
// beep();
pause();
}
}
unsigned char speedtemp=0;
void TIM2_IR(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
if(speedtemp<speed)
{
speedtemp++;
}
else//front dawn
{
move();
speedtemp=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -