📄 lcd_disp.c
字号:
*函数名称: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 + -