找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2324|回复: 1
打印 上一主题 下一主题
收起左侧

单片机贪吃蛇+俄罗斯方块+万年历仿真与源码 12864显示

[复制链接]
跳转到指定楼层
楼主
贪吃蛇俄罗斯方块万年历的仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //版本:V1.0
  2. //作品:贪吃蛇+万年历+俄罗斯方块
  3. //作者所属院校:南阳理工学院
  4. //作者QQ: 497259320
  5. //申明:转载请标明作品来源 知识产权归作者本人所有!
  6. //工作之余,写下此程序,程序、设计中有很多不足之处,风格、命名也很乱,这是下一个版本要改进的
  7. //在V1.1版本中还会增加矩阵键盘和科学计算器等功能,此程序已成功移植于AVR单片机。硬件上实现要修改底层驱动!
  8. #include <at89x51.h>
  9. #include "18b20.h"
  10. #include "1302.h"
  11. #include "12864.h"
  12. #include "zifu.h"
  13. uchar k,direction;
  14. bit flag;
  15. bit flag5=0;                           //flag5是外部中断1的标志位 flag1是步进标志
  16. uchar p,dengji;               //定时次数
  17. bit flag1=0;
  18. systemtime realtime;
  19. bit first=1;                                   //中断次数控制
  20. void dingshi() interrupt 1  using 1  //定时程序.产生步进时间
  21. {
  22.    if(p--)
  23.    {
  24.     TL0=0;
  25.         TH0=0xa0;
  26.         flag1=0;
  27.    }
  28.    else
  29.    {
  30.      flag1=1;
  31.          TL0=0;
  32.          TH0=0x00;
  33.          p=20-(dengji>>1);
  34.    }
  35. }
  36. /*开始确认暂停键的判断*/
  37. void zhongduan1() interrupt 2 using 2
  38. {
  39.    if(!flag5)
  40.    {
  41.      flag5=1;
  42.    }
  43.    else
  44.    {
  45.      flag5=0;
  46.    }
  47. }
  48. void zhongduan() interrupt 0 using 0
  49.   {
  50.     uchar i=0;
  51.         if(first)               //FIRST=1;打开方向按键判断标志
  52.         {
  53.         first=0;            
  54.         k=(P2>>6);          
  55.         k=k&0x03;                               
  56.         if(flag)
  57.           {
  58.             if(k==1)     direction=3;//左
  59.             if(k==2)         direction=1;//右
  60.              }
  61.           else
  62.           {
  63.             if(k==0)         direction=4;//上
  64.             if(k==3)         direction=2;//下
  65.              }
  66.         }
  67.   }
  68. /*显示四个小格的方块*/
  69. void playbuf(uchar buff,char offsetx,char offsety)          
  70. {
  71.   //i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));
  72.   change1((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))))&0x0f)+offsety);
  73.   change1((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx,((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+1))&0x0f)+offsety);
  74.   change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+2))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
  75.   change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+3))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety);

  76. }
  77. /*判断方块停止向下运动*/
  78. bit tingzhixia(uchar buff,char offsetx,char offsety)
  79. {
  80.    char x0,y0,x1,y1,x2,y2,x3,y3;
  81.    bit tz=0;
  82.    x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  83.    x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  84.    x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  85.    x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  86.    y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  87.    y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  88.    y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  89.    y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  90.    
  91.    if(readfk(x0+1,y0))
  92.    {
  93.       if(!((((x0+1)==x1)&&(y0==y1))|(((x0+1)==x2)&&(y0==y2))|(((x0+1)==x3)&&(y0==y3))))
  94.          {
  95.           tz=1;
  96.           }
  97.    }
  98.     if(readfk(x1+1,y1))
  99.    {
  100.       if(!((((x1+1)==x0)&&(y1==y0))|(((x1+1)==x2)&&(y1==y2))|(((x1+1)==x3)&&(y1==y3))))
  101.          {
  102.           tz=1;
  103.          }
  104.    }
  105.    if(readfk(x2+1,y2))
  106.    {
  107.       if(!((((x2+1)==x0)&&(y2==y0))|(((x2+1)==x1)&&(y2==y1))|(((x2+1)==x3)&&(y2==y3))))
  108.           {
  109.            tz=1;
  110.           }
  111.    }
  112.    if(readfk(x3+1,y3))
  113.    {
  114.       if(!((((x3+1)==x0)&&(y3==y0))|(((x3+1)==x1)&&(y3==y1))|(((x3+1)==x2)&&(y3==y2))))
  115.           {
  116.            tz=1;
  117.           }
  118.    }
  119.    return(tz);
  120. }
  121. /*判断一行是否可以消除*/
  122. bit hangman(uchar x)
  123. {
  124. uchar i;
  125. bit   man=1;
  126. for(i=0;i<15;i++)
  127. {
  128.         man=man&(readfk(x,i));
  129.         if(!man)
  130.         break;
  131. }
  132. return(man);
  133. }
  134. /*消除一行*/
  135. void xiaohang(uchar x)
  136. {
  137.   uchar i,j;
  138.   for(i=0;i<15;i++)
  139.   {
  140.     clear1(x,i);
  141.   }
  142.   for(i=1;i<=x;i++)
  143.   {
  144.    for(j=0;j<15;j++)
  145.    {
  146.      if(readfk(x-i,j))
  147.          {
  148.           change1(x-i+1,j);
  149.           clear1(x-i,j);
  150.          }
  151.    }
  152.   }
  153. }
  154. /*判断是否停止向右*/
  155. bit tingzhiyou(uchar buff,char offsetx,char offsety)
  156. {
  157.    char x0,y0,x1,y1,x2,y2,x3,y3;
  158.    bit tz=0;
  159.    x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  160.    x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  161.    x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  162.    x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  163.    y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  164.    y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  165.    y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  166.    y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  167.    if(readfk(x0,y0-1))
  168.    {
  169.       if(!(((x0==x1)&&((y0-1)==y1))|((x0==x2)&&((y0-1)==y2))|((x0==x3)&&((y0-1)==y3))))
  170.          {
  171.            tz=1;
  172.           }
  173.    }
  174.    if(readfk(x1,y1-1))
  175.      {
  176.       if(!(((x1==x0)&&((y1-1)==y0))|((x1==x2)&&((y1-1)==y2))|((x1==x3)&&((y1-1)==y3))))
  177.          {
  178.           tz=1;          
  179.          }
  180. }
  181.     if(readfk(x2,y2-1))
  182.    {
  183.       if(!(((x2==x0)&&((y2-1)==y0))|((x2==x1)&&((y2-1)==y1))|((x2==x3)&&((y2-1)==y3))))
  184.           {
  185.            tz=1;
  186.           }
  187.    }
  188.       if(readfk(x3,y3-1))
  189.    {
  190.       if(!(((x3==x0)&&((y3-1)==y0))|((x3==x1)&&((y3-1)==y1))|((x3==x2)&&((y3-1)==y2))))
  191.           {
  192.            tz=1;
  193.           }
  194.    }
  195.    return(tz);
  196. }
  197. /*判断是否停止向左*/
  198. bit tingzhizuo(uchar buff,char offsetx,char offsety)
  199. {
  200.    char x0,y0,x1,y1,x2,y2,x3,y3;
  201.    bit tz=0;
  202.    x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  203.    x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  204.    x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  205.    x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  206.    y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  207.    y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  208.    y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  209.    y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  210.    if(readfk(x0,y0+1))
  211.    {
  212.       if(!(((x0==x1)&&((y0+1)==y1))|((x0==x2)&&((y0+1)==y2))|((x0==x3)&&((y0+1)==y3))))
  213.          {
  214.            tz=1;
  215.           }
  216.    }
  217.    if(readfk(x1,y1+1))
  218.      {
  219.       if(!(((x1==x0)&&((y1+1)==y0))|((x1==x2)&&((y1+1)==y2))|((x1==x3)&&((y1+1)==y3))))
  220.          {
  221.           tz=1;          
  222.          }
  223. }
  224.     if(readfk(x2,y2+1))
  225.    {
  226.       if(!(((x2==x0)&&((y2+1)==y0))|((x2==x1)&&((y2+1)==y1))|((x2==x3)&&((y2+1)==y3))))
  227.           {
  228.            tz=1;
  229.           }
  230.    }
  231.       if(readfk(x3,y3+1))
  232.    {
  233.       if(!(((x3==x0)&&((y3+1)==y0))|((x3==x1)&&((y3+1)==y1))|((x3==x2)&&((y3+1)==y2))))
  234.           {
  235.            tz=1;
  236.           }
  237.    }
  238.    return(tz);
  239. }
  240. /*清除一个方块*/
  241. void clearbuf(uchar dat,char setx,char sety)
  242. {
  243.   uchar *i;
  244.   i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));
  245.   clear1(((((*i)&0xf0)>>4)+setx),(((*i)&0x0f)+sety));
  246.   clear1(((((*(i+1))&0xf0)>>4)+setx),(((*(i+1))&0x0f)+sety));
  247.   clear1(((((*(i+2))&0xf0)>>4)+setx),(((*(i+2))&0x0f)+sety));
  248.   clear1(((((*(i+3))&0xf0)>>4)+setx),(((*(i+3))&0x0f)+sety));  
  249. }
  250. /*俄罗斯方块子程序*/
  251. void fangkuai(void)
  252. {
  253.   uchar fenshu=0;
  254.   char offsety,offsetx;
  255.   char offsety_buff,offsetx_buff;
  256.   uchar buff=0x10;                 
  257.   bit ting=0;                                                               
  258.   uchar i;
  259.   //flag5=1;
  260.   TMOD=1;          //定时器工作方式
  261.   IT0=1;          //边延有效
  262.   IT1=1;
  263.   EA=1;                  //开CPU中断
  264.   ET0=1;          //开定时器中断
  265.   EX0=1;          //开外部中断
  266.   EX1=1;
  267.   TL0=0x00;
  268.   TH0=0x00;          //定时器初值
  269.   TR0=1;          //启动定时器
  270.   k=5;
  271.   choose12864(2);
  272.   clear12864();
  273.   play16(0,0,0,els);
  274.   play16(0,0,1,els+32);
  275.   play16(0,0,2,els+64);
  276.   play16(0,2,0,els+96);
  277.   play16(0,2,1,els+128);
  278.   play8(0,0,3,shu0);
  279.   play8(0,1,3,shu0);
  280.   vertical(1,60,30);
  281.   vertical(1,60,127);
  282.   for(i=0;i<98;i++)
  283.   {
  284.     dot(30+i,1);
  285.         dot(30+i,62);
  286.   }
  287.   offsety=7;
  288.   offsetx=-3;
  289.   for(;;)
  290. {
  291.    if(P3&0x04)
  292.    first=1;
  293.    if((k==0x02)&&((P3&0x04)==0x04))
  294.    {
  295.      offsety_buff=offsety;
  296.          ting=tingzhiyou(buff,offsetx,offsety);
  297.         if(!ting)
  298.          {
  299.           if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety)
  300.       offsety--;
  301.           clearbuf(buff,offsetx_buff,offsety_buff);
  302.           playbuf(buff,offsetx,offsety);
  303.           offsety_buff=offsety;
  304.           
  305.     }
  306.           k=5;
  307.    }
  308.    if((k==0x01)&&((P3&0x04)==0x04))
  309.    {

  310.      offsety_buff=offsety;
  311.          ting=tingzhizuo(buff,offsetx,offsety);
  312.          if(!ting)
  313.         {
  314.          if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety<=13)
  315.      offsety++;
  316.          k=5;
  317.          clearbuf(buff,offsetx_buff,offsety_buff);
  318.          playbuf(buff,offsetx,offsety);
  319.          offsety_buff=offsety;
  320.         }
  321.    }
  322.    if((k==0x03)&&((P3&0x04)==0x04))
  323.    {
  324.      dengji=36;/////////////
  325.          k=5;
  326.    }
  327.    if((k==0x00)&&((P3&0x04)==0x04))
  328.    {
  329.       uchar i;
  330.           k=5;
  331.           i=buff;
  332.           buff++;
  333.           if((buff&0x0f)>=4)
  334.           buff=buff&0xf0;
  335.           
  336.           //change1(0,14);
  337.       if(((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14)
  338.        {
  339.              do
  340.                   {
  341.                           offsety--;
  342.                   }while((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14);
  343.                  
  344.            }
  345.           if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety<0)
  346.           {
  347.             do
  348.                 {
  349.                   offsety++;
  350.                 }while(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
  351.           }
  352.           clearbuf(i,offsetx_buff,offsety_buff);
  353.           playbuf(buff,offsetx,offsety);
  354.    }
  355.    ting=tingzhixia(buff,offsetx,offsety);
  356.    while(flag5);
  357.    if(flag1)
  358.    {
  359.      offsetx_buff=offsetx;
  360.          offsety_buff=offsety;
  361.      offsetx++;
  362.          clearbuf(buff,offsetx_buff,offsety_buff);
  363.          playbuf(buff,offsetx,offsety);
  364.      offsetx_buff=offsetx;
  365.          flag1=0;
  366.     }
  367.    if((((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)>22)|ting)
  368.    {
  369.     uchar i=0;
  370.         if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx))
  371.         {xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx);fenshu++;i++;}
  372.    
  373.         if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx>=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)         //x2>=x3
  374.         {
  375.          if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)        //x2<x1
  376.          {
  377.            if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
  378.            {xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  379.          }
  380.          if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)         //x3<x2
  381.           {
  382.            if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
  383.            {xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  384.           }
  385.          if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)         //x0<x3
  386.          {
  387.            if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
  388.            {xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  389.          }
  390.         }
  391.         if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x2<x3
  392.         {
  393.            if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)
  394.            {
  395.              if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
  396.              {xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  397.            }
  398.            if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
  399.            {xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  400.            if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)
  401.            {
  402.              if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
  403.              {xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  404.            }
  405.         }
  406.          
  407.         play8(0,0,3,shu0+((fenshu/10)<<4));
  408.         play8(0,1,3,shu0+((fenshu%10)<<4));
  409.         dengji=fenshu/5;
  410.         if(((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx)<1)
  411.         {

  412.           delay1ms(450);
  413.       delay1ms(450);
  414.       choose12864(2);
  415.       clear12864();
  416.       play16(0,4,1,over);
  417.       play16(0,6,1,over+32);
  418.       play16(1,0,1,over+64);
  419.       play16(1,2,1,over+96);
  420.       delay1ms(450);
  421.       delay1ms(450);
  422.       break;
  423.         }       
  424.         buff=(((TL0%7)<<4)|(TH0%4));
  425.         //buff=0x11;
  426.     offsety=7;
  427.     offsetx=-3;
  428.         offsetx_buff=-9;
  429.         offsety_buff=-9;
  430.         }
  431. }

  432. }                                          


  433. /*万年历子程序*/                                          
  434. void wannianli(void)
  435. {
  436.   uchar i;
  437.   uchar count1=0;
  438.   k=0;
  439.   choose12864(2);
  440.   init12864();
  441.   clear12864();
  442.   play8(0,0,0,shu2);                 //屏,列,页,地址
  443.   play8(0,1,0,shu0);
  444.   
  445. ……………………

  446. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
贪吃蛇 俄罗斯方块 万年历.rar (158.82 KB, 下载次数: 52)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:74784 发表于 2017-11-15 22:04 | 只看该作者
这个早在阿莫论坛里见到过~~~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表