原文:http://www.jh-tec.cn/archives/8283
#include
#include "18b20.h"
#include "1302.h"
#include "12864.h"
#include "zifu.h"
uchar k,direction;
bit flag;
bit flag5=0; //flag5是外部中断1的标志位 flag1是步进标志
uchar p,dengji; //定时次数
bit flag1=0;
systemtime realtime;
bit first=1; //中断次数控制
void dingshi() interrupt 1 using 1 //定时程序.产生步进时间
{
if(p--)
{
TL0=0;
TH0=0xa0;
flag1=0;
}
else
{
flag1=1;
TL0=0;
TH0=0x00;
p=20-(dengji>>1);
}
}
/*开始确认暂停键的判断*/
void zhongduan1() interrupt 2 using 2
{
if(!flag5)
{
flag5=1;
}
else
{
flag5=0;
}
}
void zhongduan() interrupt 0 using 0
{
uchar i=0;
if(first) //FIRST=1;打开方向按键判断标志
{
first=0;
k=(P2>>6);
k=k&0x03;
if(flag)
{
if(k==1) direction=3;//左
if(k==2) direction=1;//右
}
else
{
if(k==0) direction=4;//上
if(k==3) direction=2;//下
}
}
}
/*显示四个小格的方块*/
void playbuf(uchar buff,char offsetx,char offsety)
{
//i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));
change1((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))))&0x0f)+offsety);
change1((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx,((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+1))&0x0f)+offsety);
change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+2))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+3))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety);
}
/*判断方块停止向下运动*/
bit tingzhixia(uchar buff,char offsetx,char offsety)
{
char x0,y0,x1,y1,x2,y2,x3,y3;
bit tz=0;
x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
if(readfk(x0+1,y0))
{
if(!((((x0+1)==x1)&&(y0==y1))|(((x0+1)==x2)&&(y0==y2))|(((x0+1)==x3)&&(y0==y3))))
{
tz=1;
}
}
if(readfk(x1+1,y1))
{
if(!((((x1+1)==x0)&&(y1==y0))|(((x1+1)==x2)&&(y1==y2))|(((x1+1)==x3)&&(y1==y3))))
{
tz=1;
}
}
if(readfk(x2+1,y2))
{
if(!((((x2+1)==x0)&&(y2==y0))|(((x2+1)==x1)&&(y2==y1))|(((x2+1)==x3)&&(y2==y3))))
{
tz=1;
}
}
if(readfk(x3+1,y3))
{
if(!((((x3+1)==x0)&&(y3==y0))|(((x3+1)==x1)&&(y3==y1))|(((x3+1)==x2)&&(y3==y2))))
{
tz=1;
}
}
return(tz);
}
/*判断一行是否可以消除*/
bit hangman(uchar x)
{
uchar i;
bit man=1;
for(i=0;i<15;i++)
{
man=man&(readfk(x,i));
if(!man)
break;
}
return(man);
}
/*消除一行*/
void xiaohang(uchar x)
{
uchar i,j;
for(i=0;i<15;i++)
{
clear1(x,i);
}
for(i=1;i<=x;i++)
{
for(j=0;j<15;j++)
{
if(readfk(x-i,j))
{
change1(x-i+1,j);
clear1(x-i,j);
}
}
}
}
/*判断是否停止向右*/
bit tingzhiyou(uchar buff,char offsetx,char offsety)
{
char x0,y0,x1,y1,x2,y2,x3,y3;
bit tz=0;
x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
if(readfk(x0,y0-1))
{
if(!(((x0==x1)&&((y0-1)==y1))|((x0==x2)&&((y0-1)==y2))|((x0==x3)&&((y0-1)==y3))))
{
tz=1;
}
}
if(readfk(x1,y1-1))
{
if(!(((x1==x0)&&((y1-1)==y0))|((x1==x2)&&((y1-1)==y2))|((x1==x3)&&((y1-1)==y3))))
{
tz=1;
}
}
if(readfk(x2,y2-1))
{
if(!(((x2==x0)&&((y2-1)==y0))|((x2==x1)&&((y2-1)==y1))|((x2==x3)&&((y2-1)==y3))))
{
tz=1;
}
}
if(readfk(x3,y3-1))
{
if(!(((x3==x0)&&((y3-1)==y0))|((x3==x1)&&((y3-1)==y1))|((x3==x2)&&((y3-1)==y2))))
{
tz=1;
}
}
return(tz);
}
/*判断是否停止向左*/
bit tingzhizuo(uchar buff,char offsetx,char offsety)
{
char x0,y0,x1,y1,x2,y2,x3,y3;
bit tz=0;
x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
if(readfk(x0,y0+1))
{
if(!(((x0==x1)&&((y0+1)==y1))|((x0==x2)&&((y0+1)==y2))|((x0==x3)&&((y0+1)==y3))))
{
tz=1;
}
}
if(readfk(x1,y1+1))
{
if(!(((x1==x0)&&((y1+1)==y0))|((x1==x2)&&((y1+1)==y2))|((x1==x3)&&((y1+1)==y3))))
{
tz=1;
}
}
if(readfk(x2,y2+1))
{
if(!(((x2==x0)&&((y2+1)==y0))|((x2==x1)&&((y2+1)==y1))|((x2==x3)&&((y2+1)==y3))))
{
tz=1;
}
}
if(readfk(x3,y3+1))
{
if(!(((x3==x0)&&((y3+1)==y0))|((x3==x1)&&((y3+1)==y1))|((x3==x2)&&((y3+1)==y2))))
{
tz=1;
}
}
return(tz);
}
/*清除一个方块*/
void clearbuf(uchar dat,char setx,char sety)
{
uchar *i;
i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));
clear1(((((*i)&0xf0)>>4)+setx),(((*i)&0x0f)+sety));
clear1(((((*(i+1))&0xf0)>>4)+setx),(((*(i+1))&0x0f)+sety));
clear1(((((*(i+2))&0xf0)>>4)+setx),(((*(i+2))&0x0f)+sety));
clear1(((((*(i+3))&0xf0)>>4)+setx),(((*(i+3))&0x0f)+sety));
}
/*俄罗斯方块子程序*/
void fangkuai(void)
{
uchar fenshu=0;
char offsety,offsetx;
char offsety_buff,offsetx_buff;
uchar buff=0x10;
bit ting=0;
uchar i;
//flag5=1;
TMOD=1; //定时器工作方式
IT0=1; //边延有效
IT1=1;
EA=1; //开CPU中断
ET0=1; //开定时器中断
EX0=1; //开外部中断
EX1=1;
TL0=0x00;
TH0=0x00; //定时器初值
TR0=1; //启动定时器
k=5;
choose12864(2);
clear12864();
play16(0,0,0,els);
play16(0,0,1,els+32);
play16(0,0,2,els+64);
play16(0,2,0,els+96);
play16(0,2,1,els+128);
play8(0,0,3,shu0);
play8(0,1,3,shu0);
vertical(1,60,30);
vertical(1,60,127);
for(i=0;i<98;i++)
{
dot(30+i,1);
dot(30+i,62);
}
offsety=7;
offsetx=-3;
for(;;)
{
if(P3&0x04)
first=1;
if((k==0x02)&&((P3&0x04)==0x04))
{
offsety_buff=offsety;
ting=tingzhiyou(buff,offsetx,offsety);
if(!ting)
{
if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety)
offsety--;
clearbuf(buff,offsetx_buff,offsety_buff);
playbuf(buff,offsetx,offsety);
offsety_buff=offsety;
}
k=5;
}
if((k==0x01)&&((P3&0x04)==0x04))
{
offsety_buff=offsety;
ting=tingzhizuo(buff,offsetx,offsety);
if(!ting)
{
if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety<=13)
offsety++;
k=5;
clearbuf(buff,offsetx_buff,offsety_buff);
playbuf(buff,offsetx,offsety);
offsety_buff=offsety;
}
}
if((k==0x03)&&((P3&0x04)==0x04))
{
dengji=36;/
k=5;
}
if((k==0x00)&&((P3&0x04)==0x04))
{
uchar i;
k=5;
i=buff;
buff++;
if((buff&0x0f)>=4)
buff=buff&0xf0;
//change1(0,14);
if(((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14)
{
do
{
offsety--;
}while((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14);
}
if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety<0)
{
do
{
offsety++;
}while(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
}
clearbuf(i,offsetx_buff,offsety_buff);
playbuf(buff,offsetx,offsety);
}
ting=tingzhixia(buff,offsetx,offsety);
while(flag5);
if(flag1)
{
offsetx_buff=offsetx;
offsety_buff=offsety;
offsetx++;
clearbuf(buff,offsetx_buff,offsety_buff);
playbuf(buff,offsetx,offsety);
offsetx_buff=offsetx;
flag1=0;
}
if((((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)>22)|ting)
{
uchar i=0;
if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx))
{xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx);fenshu++;i++;}
if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx>=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x2>=x3
{
if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx) //x2<x1
{
if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
{xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
}
if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx) //x3<x2
{
if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
{xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
}
if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x0<x3
{
if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
{xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
}
}
if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x2<x3
{
if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)
{
if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
{xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
}
if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
{xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)
{
if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
{xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
}
}
play8(0,0,3,shu0+((fenshu/10)<<4));
play8(0,1,3,shu0+((fenshu%10)<<4));
dengji=fenshu/5;
if(((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx)<1)
{
delay1ms(450);
delay1ms(450);
choose12864(2);
clear12864();
play16(0,4,1,over);
play16(0,6,1,over+32);
play16(1,0,1,over+64);
play16(1,2,1,over+96);
delay1ms(450);
delay1ms(450);
break;
}
buff=(((TL0%7)<<4)|(TH0%4));
//buff=0x11;
offsety=7;
offsetx=-3;
offsetx_buff=-9;
offsety_buff=-9;
}
}
}
/*万年历子程序*/
void wannianli(void)
{
uchar i;
uchar count1=0;
k=0;
choose12864(2);
init12864();
clear12864();
play8(0,0,0,shu2); //屏,列,页,地址
play8(0,1,0,shu0);
play16(0,4,0,nian);
play16(1,0,0,yue);
play16(1,4,0,ri);
play16(0,2,1,shi);
play16(0,6,1,fen);
play16(1,2,1,miao);
play16(1,0,2,xing);
play16(1,2,2,qi);
vertical(3,63,127);
vertical(3,63,126);
vertical(3,63,122);
vertical(3,63,121);
for(i=0;i<7;i++)
{
dot(121+i,3);
dot(121+i,63);
}
for(i=0;i<12;i++)
{
dot(123,8+5*i);
}
for(i=0;i<7;i++)
{
if(i<4)
{
play16(0,i<<1,3,yanyu+(i<<5));
}
if(i>=4)
{
play16(1,(i-4)<<1,3,yanyu+(i<<5));
}
}
.