找回密码
 立即注册

QQ登录

只需一步,快速开始

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

贪吃蛇+俄罗斯方块+万年历 Proteus仿真单片机程序

[复制链接]
跳转到指定楼层
楼主
原理图

  1. #include <at89x51.h>
  2. #include "18b20.h"
  3. #include "1302.h"
  4. #include "12864.h"
  5. #include "zifu.h"
  6. uchar k,direction;
  7. bit flag;
  8. bit flag5=0;                           //flag5是外部中断1的标志位 flag1是步进标志
  9. uchar p,dengji;               //定时次数
  10. bit flag1=0;
  11. systemtime realtime;
  12. bit first=1;                                   //中断次数控制
  13. void dingshi() interrupt 1  using 1  //定时程序.产生步进时间
  14. {
  15.    if(p--)
  16.    {
  17.     TL0=0;
  18.         TH0=0xa0;
  19.         flag1=0;
  20.    }
  21.    else
  22.    {
  23.      flag1=1;
  24.          TL0=0;
  25.          TH0=0x00;
  26.          p=20-(dengji>>1);
  27.    }
  28. }
  29. /*开始确认暂停键的判断*/
  30. void zhongduan1() interrupt 2 using 2
  31. {
  32.    if(!flag5)
  33.    {
  34.      flag5=1;
  35.    }
  36.    else
  37.    {
  38.      flag5=0;
  39.    }
  40. }
  41. void zhongduan() interrupt 0 using 0
  42.   {
  43.     uchar i=0;
  44.         if(first)               //FIRST=1;打开方向按键判断标志
  45.         {
  46.         first=0;            
  47.         k=(P2>>6);           
  48.         k=k&0x03;                                
  49.         if(flag)
  50.           {
  51.             if(k==1)     direction=3;//左
  52.             if(k==2)         direction=1;//右
  53.              }
  54.           else
  55.            {
  56.             if(k==0)         direction=4;//上
  57.             if(k==3)         direction=2;//下
  58.              }
  59.         }
  60.   }
  61. /*显示四个小格的方块*/
  62. void playbuf(uchar buff,char offsetx,char offsety)         
  63. {
  64.   //i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));
  65.   change1((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))))&0x0f)+offsety);
  66.   change1((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx,((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+1))&0x0f)+offsety);
  67.   change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+2))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
  68.   change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+3))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety);

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

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

  405.           delay1ms(450);
  406.       delay1ms(450);
  407.       choose12864(2);
  408.       clear12864();
  409.       play16(0,4,1,over);
  410.       play16(0,6,1,over+32);
  411.       play16(1,0,1,over+64);
  412.       play16(1,2,1,over+96);
  413.       delay1ms(450);
  414.       delay1ms(450);
  415.       break;
  416.         }        
  417.         buff=(((TL0%7)<<4)|(TH0%4));
  418.         //buff=0x11;
  419.     offsety=7;
  420.     offsetx=-3;
  421.         offsetx_buff=-9;
  422.         offsety_buff=-9;
  423.         }
  424. }

  425. }                                          


  426. /*万年历子程序*/                                          
  427. void wannianli(void)
  428. {
  429.   uchar i;
  430.   uchar count1=0;
  431.   k=0;
  432.   choose12864(2);
  433.   init12864();
  434.   clear12864();
  435.   play8(0,0,0,shu2);                 //屏,列,页,地址
  436.   play8(0,1,0,shu0);
  437.   play16(0,4,0,nian);
  438.   play16(1,0,0,yue);
  439.   play16(1,4,0,ri);
  440.   play16(0,2,1,shi);
  441.   play16(0,6,1,fen);
  442.   play16(1,2,1,miao);
  443.   
  444.   play16(1,0,2,xing);
  445.   play16(1,2,2,qi);
  446.   vertical(3,63,127);
  447.   vertical(3,63,126);
  448.   vertical(3,63,122);
  449.   vertical(3,63,121);
  450.    for(i=0;i<7;i++)
  451.   {
  452.     dot(121+i,3);
  453.         dot(121+i,63);
  454.   }
  455.   for(i=0;i<12;i++)
  456.   {
  457.     dot(123,8+5*i);
  458.   }
  459.   for(i=0;i<7;i++)
  460.   {
  461.     if(i<4)
  462.         {
  463.           play16(0,i<<1,3,yanyu+(i<<5));
  464.         }
  465.         if(i>=4)
  466.         {
  467.           play16(1,(i-4)<<1,3,yanyu+(i<<5));
  468.         }
  469.   }
  470.   init_ds1302();
  471.   init_time();
  472.   flag5=0;
  473.   do
  474.   {
  475.      if(P3&0x04)
  476.      first=1;
  477.      init_ds1302();
  478.      gettime(&realtime);
  479.          play8(0,2,0,(shu0+(datastring[0]<<4)));
  480.          play8(0,3,0,(shu0+(datastring[1]<<4)));
  481.          play8(0,6,0,(shu0+(datastring[2]<<4)));
  482.          play8(0,7,0,(shu0+(datastring[3]<<4)));
  483.          play8(1,2,0,(shu0+(datastring[4]<<4)));
  484.          play8(1,3,0,(shu0+(datastring[5]<<4)));
  485.          play8(0,0,1,(shu0+(datastring[6]<<4)));
  486.          play8(0,1,1,(shu0+(datastring[7]<<4)));
  487.          play8(0,4,1,(shu0+(datastring[8]<<4)));
  488.          play8(0,5,1,(shu0+(datastring[9]<<4)));
  489.          play8(1,0,1,(shu0+(datastring[10]<<4)));
  490.          play8(1,1,1,(shu0+(datastring[11]<<4)));
  491.          play16(1,4,2,(yi+((datastring[12]-2)<<5)));
  492.          gettemperature();
  493.          if(flagg)
  494.          {
  495.            play8(0,0,2,fu);
  496.            play8(1,6,3,fu);
  497.          }
  498.          else
  499.           {
  500.             clear8(6,4,0);
  501.                 play8(1,6,3,zheng);
  502.           }
  503.          play8(0,4+flagg,2,dian);
  504.      play8(0,5+flagg,2,C);
  505.          play8(0,0+flagg,2,(shu0+(temp[0]<<4)));
  506.          play8(0,1+flagg,2,(shu0+(temp[1]<<4)));
  507.          play8(0,2+flagg,2,xiao);
  508.          play8(0,3+flagg,2,(shu0+(temp[2]<<4)));
  509.          play();
  510.          dot(124,3);
  511.          if((k==0x02)&&((P3&0x04)==0x04))
  512.          {
  513.            count1++;
  514.            if(count1==7)
  515.            count1=0;
  516.            switch (count1)
  517.            {
  518.              case 0:
  519.                         {
  520.                   play16(1,0,2,xing);
  521.                   play16(1,2,2,qi);
  522.                                   k=0;break;
  523.                                 }
  524.          
  525.              case 1:
  526.                         {
  527.                                   play16_fb(0,4,0);                        
  528.                                   k=0; break;
  529.                                 }
  530.                 case 2:
  531.                         {
  532.                   play16(0,4,0,nian);
  533.                   play16_fb(1,0,0);
  534.                                   k=0;break;                                 
  535.                                 }
  536.             case 3:
  537.                         {
  538.                                   play16(1,0,0,yue);
  539.                   play16_fb(1,4,0);
  540.                                   k=0;break;
  541.                                 }  
  542.                 case 4:
  543.                         {
  544.                                   play16(1,4,0,ri);
  545.                   play16_fb(0,2,1);
  546.                                   k=0;break;
  547.                                 }
  548.                 case 5:
  549.                         {
  550.                                   play16(0,2,1,shi);
  551.                   play16_fb(0,6,1);
  552.                                   k=0;break;
  553.                                 }
  554.                 case 6:
  555.                         {
  556.                                    play16(0,6,1,fen);
  557.                                    play16_fb(1,0,2);
  558.                    play16_fb(1,2,2);
  559.                                    k=0;break;
  560.                                 }
  561.                 default:k=0;break;
  562.            }
  563.          }
  564.          if((k==0x03)&&((P3&0x04)==0x04))
  565.          {
  566.            switch(count1)
  567.            {
  568.              case 1:
  569.                          {
  570.                                    setjia(ds1302_year);k=0;break;
  571.                                  }
  572.                  case 2:
  573.                                  {
  574.                                    setjia(ds1302_month);k=0;break;
  575.                                  }
  576.                  case 3:
  577.                                  {
  578.                                    setjia(ds1302_day);k=0;break;
  579.                                  }
  580.                     case 4:
  581.                                  {
  582.                                    setjia(ds1302_hour);k=0;break;
  583.                                  }
  584.                  case 5:
  585.                                  {
  586.                                    setjia(ds1302_minute);k=0;break;
  587.                                  }
  588.                  case 6:
  589.                                  {
  590.                                   setjia(ds1302_week);k=0;break;
  591.                                  }
  592.            }
  593.          }
  594.          if((k==0x01)&&((P3&0x04)==0x04))
  595.          {
  596.            switch(count1)
  597.            {
  598.              case 1:
  599.                          {
  600.                                    setjian(ds1302_year);k=0;break;
  601.                                  }
  602.                  case 2:
  603.                                  {
  604.                                    setjian(ds1302_month);k=0;break;
  605.                                  }
  606.                  case 3:
  607.                                  {
  608.                                    setjian(ds1302_day);k=0;break;
  609.                                  }
  610.                     case 4:
  611.                                  {
  612.                                    setjian(ds1302_hour);k=0;break;
  613.                                  }
  614.                  case 5:
  615.                                  {
  616.                                    setjian(ds1302_minute);k=0;break;
  617.                                  }
  618.                  case 6:
  619.                                  {
  620.                                    setjian(ds1302_week);k=0;break;
  621.                                  }
  622.            }
  623.         }
  624.   }        while(!flag5);
  625. }
  626. /*贪吃蛇子程序*/
  627. void tanchishe(void)                                                                                                           
  628. {           
  629.   uchar xdata length[102]={0,8,1,8};         //存放蛇身的数组;
  630.   uchar food[2]={12,8};
  631.   uchar i,x,y;
  632.   bit flag2,flag3,flag4;
  633.   TMOD=1;          //定时器工作方式
  634.   IT0=1;          //边延有效
  635.   IT1=1;
  636.   EA=1;                  //开CPU中断
  637.   ET0=1;          //开定时器中断
  638.   EX0=1;          //开外部中断
  639.   EX1=1;
  640.   TL0=0x00;
  641.   TH0=0x00;          //定时器初值
  642.   TR0=1;          //启动定时器

  643.   dengji=2;
  644.   p=20;
  645.   direction=1;
  646.   flag5=0;
  647.   
  648.   choose12864(2);
  649.   clear12864();        
  650.   vertical(1,61,30);
  651.   vertical(1,61,127);
  652.   for(i=0;i<98;i++)
  653.   {
  654.     dot(30+i,1);
  655.         dot(30+i,62);
  656.   }
  657.   play16(0,0,0,tan);
  658.   play16(0,0,1,chi);
  659.   play16(0,0,2,she);
  660.   change(length,(length+1));
  661.   change((length+2),(length+3));
  662.   change(food,food+1);
  663.   for(;;)
  664.   {
  665.     do
  666.    {
  667.     first=1;
  668.     while(flag5|!flag1);
  669.     x=*(length);                              
  670.     y=*(length+1);
  671.     switch(direction)                           //右
  672.         {
  673.           case 1:
  674.             {
  675.               for(i=0;i<dengji-1;i++)
  676.                {
  677.                  *(length+(i<<1))=*(length+(i<<1)+2);
  678.                      *(length+(i<<1)+1)=*(length+(i<<1)+3);
  679.                }
  680.                (*(length+(dengji<<1)-2))++;
  681.                    flag=0;
  682.                    break;
  683.               }
  684.                    case 2:                                          //下
  685.                  {
  686.               for(i=0;i<dengji-1;i++)
  687.                {
  688.                  *(length+(i<<1))=*(length+(i<<1)+2);
  689.                      *(length+(i<<1)+1)=*(length+(i<<1)+3);
  690.                }
  691.                     (*(length+(dengji<<1)-1))++;
  692.                         flag=1;
  693.                         break;
  694.                   }
  695.                 case 3:                                        //左
  696.                  {
  697.                for(i=0;i<dengji-1;i++)
  698.                {
  699.                  *(length+(i<<1))=*(length+(i<<1)+2);
  700.                      *(length+(i<<1)+1)=*(length+(i<<1)+3);
  701.                }
  702.                (*(length+(dengji<<1)-2))--;
  703.                    flag=0;
  704.                    break;
  705.                  }
  706.                 case 4:
  707.                  {                        //上
  708.                  for(i=0;i<dengji-1;i++)
  709.                {
  710.                  *(length+(i<<1))=*(length+(i<<1)+2);
  711.                      *(length+(i<<1)+1)=*(length+(i<<1)+3);
  712.                }
  713.                     (*(length+(dengji<<1)-1))--;
  714.                         flag=1;
  715.                         break;
  716.                  }
  717.          }
  718.          flag4=((*(length+(dengji<<1)-2))==food[0])&&((*(length+(dengji<<1)-1))==food[1]);
  719.          if(flag4)        //
  720.          {
  721.                 for(i=dengji;i>0;i--)
  722.                 {
  723.                   *(length+(i<<1))=*(length+(i<<1)-2);
  724.                   *(length+(i<<1)+1)=*(length+(i<<1)-1);
  725.                 }
  726.                 *length=x;
  727.                 *(length+1)=y;
  728.                 dengji++;
  729.                 do
  730.                 {
  731.                   flag3=0;
  732.                   food[0]=TL0%24;
  733.               food[1]=TL0%15;
  734.                   for(i=0;i<dengji-1;i++)         //食物是否在蛇身身上
  735.                   {
  736.                     if((*(length+(i<<1)))==food[0]&&((*(length+(i<<1)+1))==food[1]))
  737.                         {
  738.                           flag3=1;
  739.                           break;
  740.                          }
  741.                   }
  742.                 }while(flag3);
  743.                 change(food,food+1);
  744.          }
  745.      flag2=1;          //蛇头没有遇到蛇身
  746.          for(i=0;i<dengji-1;i++)
  747.         {
  748.                    if(*(length+(i<<1))==*(length+(dengji<<1)-2)&&(*(length+(i<<1)+1)==*(length+(dengji<<1)-1)))
  749.                    {
  750.                      flag2=0;
  751.                          break;
  752.                         }
  753.                 }
  754.           flag2=flag2&&*(length+(dengji<<1)-2)>=0&&*(length+(dengji<<1)-2)<24;//蛇头是否出边界
  755.           flag2=flag2&&*(length+(dengji<<1)-1)>=0&&*(length+(dengji<<1)-1)<15;
  756.           if(flag2)
  757.            {
  758.             clear(&x,&y);
  759.                
  760.             
  761.              {
  762.                change(length+(dengji<<1)-2,length+(dengji<<1)-1);
  763.              }
  764.                  if(flag4)
  765.                  {
  766.                    change(&x,&y);
  767.                   }
  768.             flag1=0;
  769.             play8(0,0,3,shu0+((dengji/10)<<4));
  770.             play8(0,1,3,shu0+(((dengji)%10)<<4));
  771.            }
  772.    }
  773.    while(flag2);
  774.    delay1ms(450);
  775.    delay1ms(450);
  776.    choose12864(2);
  777.    clear12864();
  778.    play16(0,4,1,over);
  779.    play16(0,6,1,over+32);
  780.    play16(1,0,1,over+64);
  781.    play16(1,2,1,over+96);
  782.    delay1ms(450);
  783.    delay1ms(450);
  784.    break;
  785.   }
  786. }
  787. //////////////////////////////
  788. main(void)
  789. {
  790. uchar i;
  791. uchar count=0;
  792. P2=0xff;
  793.   EA=1;                  //开CPU中断
  794.   //ET0=1;          //开定时器中断
  795.   EX0=1;          //开外部中断
  796.   EX1=1;
  797. choose12864(2);
  798. init12864();
  799. clear12864();
  800. ////////////////////
  801. play16(0,4,0,tan);
  802. play16(0,6,0,chi);
  803. play16(1,0,0,she);
  804. ///////////////////
  805. play16(0,4,1,els);
  806. play16(0,6,1,els+32);
  807. for(i=0;i<3;i++)
  808. {
  809.    play16(1,i<<1,1,(els+64+(i<<5)));
  810. }
  811. //////////////////

  812. play16(0,4,2,wnl);
  813. play16(0,6,2,wnl+32);
  814. play16(1,0,2,wnl+64);

  815. //////////////////
  816. for(;;)
  817.   {
  818.     if((k==0x03)&&((P3&0x04)==0x04))
  819.    {
  820.         count++;
  821.         k=0;
  822.         if(count==4)
  823.         count=1;
  824.         switch(count)
  825.         {
  826.           case 1:
  827.                  {
  828.                             play16(0,4,2,wnl);
  829.                 play16(0,6,2,wnl+32);
  830.                 play16(1,0,2,wnl+64);
  831.                                 play16_fb(0,4,0);
  832.                 play16_fb(0,6,0);
  833.                 play16_fb(1,0,0);
  834.                          };break;
  835.           case 2: {
  836.                                       play16(0,4,0,tan);
  837.                  play16(0,6,0,chi);
  838.                  play16(1,0,0,she);
  839.                                  play16_fb(0,4,1);
  840.                  play16_fb(0,6,1);
  841.                  for(i=0;i<3;i++)
  842.                  {
  843.                    play16_fb(1,i<<1,1);
  844.                   }
  845.                     };break;
  846.           case 3:
  847.                   {
  848.                     
  849.                                  play16(0,4,1,els);
  850.                  play16(0,6,1,els+32);
  851.                  for(i=0;i<3;i++)
  852.                  {
  853.                    play16(1,i<<1,1,(els+64+(i<<5)));
  854.                  }
  855.                                  play16_fb(0,4,2);
  856.                  play16_fb(0,6,2);
  857.                  play16_fb(1,0,2);
  858.                   };break;
  859.         default:break;
  860.         }
  861.   }
  862.   if(P3&0x04)
  863.   first=1;
  864.   if(flag5)
  865.   {
  866.     switch(count)
  867.         {
  868.           case 1:flag5=0;tanchishe();count=0;flag5=0;k=0;break;
  869.           case 2:flag5=0;fangkuai();count=0;flag5=0; k=0;break;
  870.           case 3:flag5=0;wannianli();count=0;flag5=0;k=0;break;
  871.           default:count=0;k=3;flag5=0;break;
  872.         }
  873.          choose12864(2);
  874.      init12864();
  875.      clear12864();
  876. ////////////////////
  877.      play16(0,4,0,tan);
  878.      play16(0,6,0,chi);
  879.      play16(1,0,0,she);
  880. ///////////////////
  881.      play16(0,4,1,els);
  882.      play16(0,6,1,els+32);
  883.      for(i=0;i<3;i++)
  884.      {
  885.        play16(1,i<<1,1,(els+64+(i<<5)));
  886.      }
  887. //////////////////

  888.      play16(0,4,2,wnl);
  889.      play16(0,6,2,wnl+32);
  890.      play16(1,0,2,wnl+64);
  891. //////////////////
复制代码


51黑论坛_贪吃蛇 俄罗斯方块 万年历.zip

176.69 KB, 下载次数: 83, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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