分享一个用51单片机制作的贪吃蛇+俄罗斯方块+万年历
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- //版本:V1.0
- //作品:贪吃蛇+万年历+俄罗斯方块
- //作者所属院校:南阳理工学院
- //申明:转载请标明作品来源 知识产权归作者本人所有!
- //工作之余,写下此程序,程序、设计中有很多不足之处,风格、命名也很乱,这是下一个版本要改进的
- //在V1.1版本中还会增加矩阵键盘和科学计算器等功能,此程序已成功移植于AVR单片机。硬件上实现要修改底层驱动!
- #include <at89x51.h>
- #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;
-
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
贪吃蛇 俄罗斯方块 万年历.zip
(176.69 KB, 下载次数: 265)
|