找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23215|回复: 48
收起左侧

51单片机+LCD12864做的贪食蛇和俄罗斯方块小游戏分享

  [复制链接]
ID:128771 发表于 2016-7-7 04:52 | 显示全部楼层 |阅读模式
贪食蛇和俄罗斯方块的单片机制作
1932136xk6h7og4ppkc4kf.png
193507tkixwt3wuj3wx3zp.png


  1. //12864并行接口参考程序,控制器st7920  
  2. #include "reg52.h"
  3. #include "Lcd12864.h"
  4. #include "Key.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. static unsigned long Seed = 1;
  8. #define A 48271L
  9. #define M 2147483647L
  10. #define Q (M / A)
  11. #define R (M % A)
  12. /************************************
  13. 伪随机数发生器
  14. *************************************/
  15. double Random(void)
  16. {
  17.         long TmpSeed;
  18.         TmpSeed=A*(Seed%Q)-R*(Seed/Q);
  19.         if(TmpSeed>=0)
  20.                 Seed=TmpSeed;
  21.         else
  22.                 Seed=TmpSeed+M;
  23.         return (double)Seed/M;
  24. }

  25. /**************************************
  26. 为伪随机数发生器播种
  27. ***************************************/
  28. void InitRandom(unsigned long InitVal)
  29. {
  30.         Seed=InitVal;
  31. }

  32. //延时子程序
  33. void Delay(unsigned int t)
  34. {  
  35.         unsigned int i,j;
  36.         for(i=0;i<t;i++)
  37.                 for(j=0;j<10;j++);   
  38. }

  39. #define LGOU 0
  40. #define RGOU 1
  41. #define RZ        2
  42. #define LZ        3
  43. #define T        4
  44. #define GUN 5
  45. #define BOX 6
  46. unsigned int idata num[19+2]={
  47. 0xfff,//第1行,最下面
  48. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,
  49. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行
  50. 0xfff//第21行,最上面

  51. };//定义共21行,其中num[0]为下墙壁行,num[20]为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列
  52. unsigned char code Block[28][2]={
  53. /*
  54. *   口     口口口   口口
  55. *   口     口         口      口
  56. *   口口              口  口口口      
  57. */
  58. {0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},
  59. /*
  60. *   口        口口 口口口
  61. *   口 口     口       口
  62. * 口口 口口口 口   
  63. */
  64. {0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},  
  65. /*
  66. *   口
  67. *   口口         口口
  68. *     口       口口
  69. */
  70. {0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},
  71. /*
  72. *   口        口口
  73. * 口口          口口
  74. * 口
  75. */
  76. {0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},  
  77. /*
  78. *          口                口
  79. *   口     口口   口口口   口口
  80. * 口口口   口       口       口
  81. */
  82. {0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},
  83. /*口
  84. * 口
  85. * 口       口口口口
  86. * 口
  87. */
  88. {0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},  
  89. /*
  90. * 口口
  91. * 口口
  92. */  
  93. {0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}
  94. };

  95. #define PASSSCORE 20
  96. struct Jimu
  97. {
  98.         unsigned int dat;
  99.          char x;
  100.         unsigned char y;
  101.         unsigned char type;
  102.         unsigned char change;
  103. }Sign[3];//积木结构体

  104. unsigned char SysFlag=0;
  105. #define NEWSIGNFLAG 0
  106. #define DEADFLAG 1
  107. #define PAUSEFLAG 2

  108. unsigned char Score=0;
  109. unsigned char Level=1;
  110. unsigned char DelayCnt=5;
  111. unsigned char KeyBuffer=0;
  112. #define RESEVER 1
  113. #define CHANGE 2
  114. #define DOWN 3
  115. #define LEFT 4
  116. #define RIGHT 5
  117. #define PAUSE 6

  118. /*********************************
  119. 初始化MPU
  120. **********************************/
  121. void InitCpu(void)
  122. {
  123.         TMOD=0x0;
  124.         TH0=0;
  125.         TL0=0;
  126.         TR0=1;
  127.         ET0=1;
  128.         EA=1;
  129. }

  130. /*****************************
  131. 定时中断服务子程序
  132. ******************************/
  133. void Timer0Int(void) interrupt 1
  134. {
  135.         switch(OSReadKey())
  136.         {
  137.                 case 9:
  138.                                 KeyBuffer=PAUSE;
  139.                                 break;
  140.                 case 13:
  141.                                 KeyBuffer=CHANGE;
  142.                                 break;
  143.                 case 17:
  144.                                 KeyBuffer=DOWN;
  145.                                 break;
  146.                 case 21:
  147.                                 KeyBuffer=RIGHT;
  148.                                 break;
  149.                    case 25:
  150.                                 KeyBuffer=LEFT;
  151.                                 break;
  152.                 default:
  153.                                 break;
  154.         }
  155. }

  156. /******************************
  157. 画墙壁,初始化界面
  158. *******************************/
  159. void DrawBoard(void)
  160. {
  161.         unsigned char n;
  162.         for(n=0;n<12;n++)
  163.         {
  164.                 Lcd_Rectangle(3*n,0,3*n+2,2,1);
  165.                 Lcd_Rectangle(3*n,60,3*n+2,62,1);
  166.         }
  167.         for(n=0;n<20;n++)
  168.         {
  169.                 Lcd_Rectangle(0,3*n,2,3*n+2,1);
  170.                 Lcd_Rectangle(33,3*n,35,3*n+2,1);               
  171.         }
  172.         Lcd_WriteStr(4,0,"TOTO原创");
  173.         Lcd_WriteStr(3,2,"Score:");
  174.         Lcd_WriteStr(3,3,"Level:");
  175. }

  176. /***********************************
  177. 游戏结束处理
  178. ************************************/
  179. void GameOver(void)
  180. {
  181.         if((SysFlag&(1<<deadflag))!=0)
  182.                 Lcd_WriteStr(3,1,"You Fail");
  183.         else
  184.                 Lcd_WriteStr(3,1,"You Pass");
  185. }

  186. unsigned int code MaskTab[16]={
  187. 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
  188. 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
  189. };

  190. /**********************************
  191. 根据积木图标左下坐标X,Y来画出积木图标
  192. ***********************************/
  193. void DrawSign(struct Jimu Temp,unsigned char DrawMode)
  194. {
  195.         unsigned char m,n;
  196.         for(m=0;m<4;m++)
  197.                 for(n=0;n<4;n++)
  198.                 {
  199.                         if((Temp.dat&MaskTab[4*m+n])!=0)
  200.                                 Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);
  201.                 }
  202. }

  203. /********************************
  204. 将积木图标值融入num数据中
  205. 也即把积木图标固定,无法再下降
  206. *********************************/
  207. FixSign(void)
  208. {
  209.         unsigned char m,n;
  210.         for(m=0;m<4;m++)//行循环
  211.                 for(n=0;n<4;n++)//列循环
  212.                 {
  213.                         if((Sign[0].dat&MaskTab[4*m+n])!=0)
  214.                         {
  215.                                 num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];
  216.                         }
  217.                 }
  218. }

  219. /********************************
  220. 判断积木图标中方块是否与障碍方块重合
  221. *********************************/
  222. unsigned char CheckIf(void)
  223. {
  224.         unsigned char m,n;
  225.         for(m=0;m<4;m++)//行循环
  226.                 for(n=0;n<4;n++)//列循环
  227.                 {
  228.                         if((Sign[1].dat&MaskTab[4*m+n])!=0)
  229.                         {
  230.                                 if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)
  231.                                         return 0;
  232.                         }
  233.                 }
  234.         return 1;
  235. }

  236. /********************************
  237. 判断积木图标是否可以继续下降一格
  238. ********************************/
  239. unsigned char CheckIfDown(void)
  240. {
  241.         Sign[1]=Sign[0];//
  242.         Sign[1].y+=3;//假设下降一格        
  243.         return CheckIf();
  244.         
  245. }

  246. /********************************
  247. 判断积木图标是否可以向左移动
  248. *********************************/
  249. unsigned char CheckIfLeft(void)
  250. {
  251.         Sign[1]=Sign[0];
  252.         Sign[1].x-=3;        
  253.         return CheckIf();
  254. }

  255. /********************************
  256. 判断积木图标是否可以向右移动
  257. *********************************/
  258. unsigned char CheckIfRight(void)
  259. {
  260.         Sign[1]=Sign[0];
  261.         Sign[1].x+=3;        
  262.         return CheckIf();
  263. }

  264. /********************************
  265. 判断是否可以旋转
  266. *********************************/
  267. unsigned char CheckIfRoll(void)
  268. {
  269.         unsigned char i;
  270.         unsigned int Temp;
  271.         Sign[1]=Sign[0];
  272.         if(++Sign[1].change>3)
  273.                 Sign[1].change=0;
  274.            i=Sign[1].type*4+Sign[1].change;
  275.         Temp=(unsigned int)Block[i][0]<<8;
  276.         Temp=Temp|Block[i][1];
  277.         Sign[1].dat=Temp;
  278.         
  279.         return CheckIf();
  280. }

  281. /********************************
  282. 寻找满格的行并做消除处理
  283. 最多寻找4个满行并做消除
  284. *********************************/
  285. void DelFull(void)
  286. {
  287.         unsigned char m,n;
  288.         unsigned char Temp;
  289.         unsigned char Flag=0;
  290.         Temp=(Sign[0].y-2)/3;
  291.         if(Temp>=20)//防止越过了下边界
  292.                 Temp=1;
  293.         else
  294.                 Temp=20-Temp;
  295.         for(n=Temp+3;n>=Temp;n--)//积木图标的最顶行开始寻找满行比较有利于运算
  296.         {
  297.                 if(num[n]==0xfff)
  298.                 {
  299.                         Flag=1;
  300.                         for(m=n+1;m<=19;m++)
  301.                         {
  302.                                 num[m-1]=num[m];
  303.                         }
  304.                         num[m]=0x801;
  305.                         Score++;//每找到一个满行,则分数加1
  306.                 }
  307.         }
  308.         if(Flag)//为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面
  309.         {
  310.                 for(m=Temp;m<=19;m++)//为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画
  311.                         for(n=1;n<=10;n++)
  312.                         {
  313.                                 if((num[m]&MaskTab[n])==0)
  314.                                 {        
  315.                                         if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//为加速而做的读象素操作
  316.                                         {
  317.                                                 Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);
  318.                                         }
  319.                                 }
  320.                                    else
  321.                                 {
  322.                                         if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//为加速而做的读象素操作
  323.                                         {
  324.                                                 Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);
  325.                                         }
  326.                                 }
  327.                         }
  328.         }
  329. }


  330. /*******************************
  331. 随机产生一个积木图标放到预产生区域并显示出来
  332. ********************************/
  333. void CreatSign(void)
  334. {
  335.         unsigned char n;
  336.         unsigned int Temp;

  337.         DrawSign(Sign[2],0);//先清除

  338.         n=Random()*28;
  339.         Temp=(unsigned int)Block[n][0]<<8;
  340.         Temp=Temp|Block[n][1];
  341.         Sign[2].dat=Temp;
  342.         Sign[2].x=45;
  343.         Sign[2].y=4*3+2;
  344.         Sign[2].type=n/4;
  345.         Sign[2].change=n%4;
  346.         DrawSign(Sign[2],1);//后画出
  347. }

  348. void PrintScore(void)
  349. {
  350.         unsigned char Str[3];
  351.         Str[0]=(Score/10)|0x30;
  352.         Str[1]=(Score%10)|0x30;
  353.         Str[2]=0;
  354.         Lcd_WriteStr(6,2,Str);
  355. }

  356. void PrintLevel(void)
  357. {
  358.         unsigned char Str[3];
  359.         Str[0]=(Level/10)|0x30;
  360.         Str[1]=(Level%10)|0x30;
  361.         Str[2]=0;
  362.         Lcd_WriteStr(6,3,Str);
  363. }

  364. /********************************
  365. 游戏的具体过程,也是贪吃蛇算法的关键部分
  366. *********************************/
  367. void GamePlay(void)
  368. {
  369.         unsigned char m,n;
  370.         unsigned int Temp;
  371.         SysFlag|=1<<newsignflag; 刚开始初始化为需要产生新的积木图标
  372.         InitRandom(TL0);
  373.         Lcd_WriteStr(3,1,"Playing");
  374.         PrintScore();
  375.         PrintLevel();
  376.         CreatSign();
  377.         while(1)
  378.         {        
  379.                 if((SysFlag&(1<<newsignflag))==1) 判是否需要产生新的积木图标
  380.                 {
  381.                         SysFlag&=~(1<<newsignflag);
  382.                         Sign[0]=Sign[2];
  383.                         CreatSign();
  384.                         Sign[0].x=12;
  385.                         Sign[0].y=14;

  386.                         for(m=0;m<4;m++)//行循环
  387.                         {
  388.                                 for(n=0;n<4;n++)//列循环
  389.                                 {
  390.                                         if((Sign[0].dat&MaskTab[15-m*4-n])==0)
  391.                                                 break;
  392.                                 }
  393.                                 if(n==4)
  394.                                         Sign[0].y-=3;
  395.                         }//将积木图标出现置顶
  396.                         
  397.                         for(m=0;m<4;m++)//行循环
  398.                                 for(n=0;n<4;n++)//列循环
  399.                                 {
  400.                                         if((Sign[0].dat&MaskTab[4*m+n])!=0)
  401.                                         {
  402.                                                 if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0)
  403.                                                         SysFlag|=1<<deadflag;
  404.                                         }
  405.                                 }
  406.                         if((SysFlag&(1<<deadflag))!=0)
  407.                                 break;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。游戏结束
  408.                         DrawSign(Sign[0],1);        
  409.                 }
  410.                 switch(KeyBuffer)
  411.                 {
  412.                         case LEFT:
  413.                                         KeyBuffer=0;
  414.                                         if((SysFlag&(1<<pauseflag))==0)
  415.                                         {
  416.                                                 if(CheckIfLeft())
  417.                                                 {
  418.                                                         DrawSign(Sign[0],0);
  419.                                                         Sign[0].x-=3;
  420.                                                         DrawSign(Sign[0],1);
  421.                                                 }
  422.                                         }
  423.                                         else
  424.                                         {
  425.                                                 if(++Level>=10)
  426.                                                         Level=1;
  427.                                                 PrintLevel();
  428.                                         }
  429.                                         break;
  430.                         case RIGHT:
  431.                                         KeyBuffer=0;
  432.                                         if((SysFlag&(1<<pauseflag))==0)
  433.                                         {
  434.                                                 if(CheckIfRight())
  435.                                                 {
  436.                                                         DrawSign(Sign[0],0);
  437.                                                         Sign[0].x+=3;
  438.                                                         DrawSign(Sign[0],1);        
  439.                                                 }
  440.                                         }
  441.                                         else
  442.                                         {
  443.                                                 if(++Level>=10)
  444.                                                         Level=1;
  445.                                                 PrintLevel();
  446.                                         }
  447.                                         break;
  448.                         case DOWN:
  449.                                         KeyBuffer=0;
  450.                                         if((SysFlag&(1<<pauseflag))==0)
  451.                                         {
  452.                                                 if(CheckIfDown())//判断是否能继续下降一格
  453.                                                 {
  454.                                                         DrawSign(Sign[0],0);
  455.                                                         Sign[0].y+=3;
  456.                                                         DrawSign(Sign[0],1);        
  457.                                                 }
  458.                                         }
  459.                                         break;
  460.                         case CHANGE:
  461.                                         KeyBuffer=0;
  462.                                         if((SysFlag&(1<<pauseflag))==0)
  463.                                         {
  464.                                                 if(CheckIfRoll())
  465.                                                 {
  466.                                                         DrawSign(Sign[0],0);
  467.                                                         if(++Sign[0].change>3)
  468.                                                                 Sign[0].change=0;
  469.                                                            m=Sign[0].type*4+Sign[0].change;
  470.                                                         Temp=(unsigned int)Block[m][0]<<8;
  471.                                                         Temp=Temp|Block[m][1];
  472.                                                         Sign[0].dat=Temp;
  473.                                                         DrawSign(Sign[0],1);
  474.                                                 }
  475.                                         }
  476.                                         break;
  477.                            case PAUSE:
  478.                                         KeyBuffer=0;
  479.                                         SysFlag^=1<<pauseflag;
  480.                                         if((SysFlag&(1<<pauseflag))==0)
  481.                                         {
  482.                                                 Lcd_WriteStr(3,1,"          ");
  483.                                                 Lcd_WriteStr(3,1,"Playing");
  484.                                         }
  485.                                         else
  486.                                         {
  487.                                                 Lcd_WriteStr(3,1,"          ");
  488.                                                 Lcd_WriteStr(3,1,"Pause");        
  489.                                         }
  490.                                         break;
  491.                     default:
  492.                                         break;
  493.                 }
  494.                 if((SysFlag&(1<<pauseflag))!=0)
  495.                         continue;
  496.                 Delay(500);
  497.                 if(++DelayCnt>=2*(11-Level))
  498.                 {
  499.                         DelayCnt=0;
  500.                         if(CheckIfDown())//判断是否能继续下降一格
  501.                         {
  502.                                 DrawSign(Sign[0],0);
  503.                                 Sign[0].y+=3;
  504.                                 DrawSign(Sign[0],1);
  505.                         }
  506.                         else
  507.                         {
  508.                                 FixSign();
  509.                                 DelFull();
  510.                                 PrintScore();
  511.                                 if(Score>=PASSSCORE)
  512.                                 {
  513.                                         SysFlag&=~(1<<deadflag);
  514.                                         break;//跳出玩游戏过程
  515.                                 }
  516.                                 SysFlag|=1<<newsignflag; 新的积木图标产生标志置1
  517.                         }
  518.                 }
  519.         }
  520. }

  521. void Main()
  522. {  
  523.         InitCpu();//初始化CPU
  524.         Lcd_Reset(); //初始化LCD屏
  525.         Lcd_Clear(0);//清屏
  526.         DrawBoard();//画界面
  527.         GamePlay();//玩游戏
  528.         GameOver();//游戏结束
  529.         while(1);//要想重玩,只能重启,可继续完善该游戏
  530. }
复制代码




  1. #include "REG52.H"
  2. #include "Key.h"
  3. #define OS_LONG_KEY_EN 1//如果应用中需要处理长按键动作,则定义为1,否则定义为0(如果应用中不需要处理长按动作,则建议定义为0,以节省代码空间)

  4. /***********************************************
  5. 功能说明:按键驱动扫描
  6. 入口参数:无
  7. 出口参数:扫描一次键盘以获得按键句柄
  8. 注:交OSReadKey()函数调用
  9. 需要根据实际硬件的键盘接口修改
  10. ***********************************************/
  11. unsigned char OSScanKey(void)
  12. {
  13.         unsigned char Temp;
  14.         unsigned char i;
  15.         P2=0xff;
  16.         Temp=P1;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 if((Temp&(1<<i))==0)
  20.                         break;
  21.         }
  22.         if(i<8)
  23.                 return i+1;
  24.         else
  25.                 return        0;
  26. }

  27. /**********************************************
  28. 功能说明:读取按键动作
  29. 入口参数:无
  30. 出口参数:返回按键动作
  31. 注:没有按键动作,则返回0,1号按键动作,返回1-4
  32. 2号按键动作,返回5-8,如此类推
  33. 返回1、5、..:确认短按按下
  34. 返回2、6、..:确认长按按下
  35. 返回3、7、..:确认短按松开
  36. 返回4、8、..:确认长按松开
  37. ***********************************************/
  38. unsigned char OSReadKey(void)
  39. {
  40.         static unsigned char KeyEventCnt=0;
  41.         static unsigned char KeySampleCnt=0;
  42.         static unsigned char KeyBuffer=0;
  43. #define SHORT_ON_DITHERING_COUNTER 3//定义短按按下去抖时间
  44. #define SHORT_OFF_DITHERING_COUNTER 3//定义短按松开去抖时间,一般与短按按下去抖时间相同

  45. #if OS_LONG_KEY_EN>0
  46.         static unsigned int LongKeySampleCnt=0;
  47.         #define LONG_ON_DITHERING_COUNTER 250//定义长按按下确认需要的时间,如果是每1MS调用一次OSReadKey(),则1000意味着这个时间为1S
  48.         #define LONG_OFF_DITHERING_COUNTER 3//定义长按松开去抖时间,一般和短按去抖时间相同
  49. #endif
  50.         unsigned char KeyTemp;
  51.         KeyTemp=OSScanKey();
  52.         switch(KeyEventCnt)
  53.         {
  54.                 case 0:
  55.                         if(KeyTemp!=0)
  56.                         {
  57.                                 KeySampleCnt=0;
  58.                                 KeyBuffer=KeyTemp;
  59.                                 KeyEventCnt=1;     
  60.                         }
  61.                         return 0;//no key on,return 0
  62.                         break;
  63.                
  64.                 #if OS_LONG_KEY_EN>0        
  65.                 case 1:
  66.                         if(KeyTemp!=KeyBuffer)
  67.                         {
  68.                                 KeyEventCnt=0;
  69.                                 return 0;//is dithering,return 0
  70.                         }
  71.                         else
  72.                         {
  73.                                 if(++KeySampleCnt>SHORT_ON_DITHERING_COUNTER)
  74.                                 {
  75.                                         KeySampleCnt=0;
  76.                                         KeyEventCnt=2;
  77.                                         LongKeySampleCnt=0;
  78.                                         return ((KeyBuffer-1)<<2)+1;//sure that key on,return (KeyBuffer-1)<<2+1
  79.                                 }
  80.                                 else
  81.                                         return 0;//not sure that key on,return 0                 
  82.                         }
  83.                         break;
  84.                                 
  85.                 case 2:
  86.                         if(++LongKeySampleCnt>LONG_ON_DITHERING_COUNTER)
  87.                         {
  88.                                 KeySampleCnt=0;
  89.                                 KeyEventCnt=3;
  90.                                 return ((KeyBuffer-1)<<2)+2; //sure that key long on,return (KeyBuffer-1)<<2+2
  91.                         }
  92.                         else
  93.                         {
  94.                                 if(KeyTemp!=KeyBuffer)
  95.                                 {
  96.                                         if(++KeySampleCnt>SHORT_OFF_DITHERING_COUNTER)
  97.                                         {
  98.                                                 KeyEventCnt=0;
  99.                                                 return ((KeyBuffer-1)<<2)+3;//after short on to off,(KeyBuffer-1)<<2+3
  100.                                         }
  101.                                         else
  102.                                                 return 0;
  103.                                 }
  104.                                 else
  105.                                 {
  106.                                         KeySampleCnt=0;
  107.                                         return 0;
  108.                                 }
  109.                         }
  110.                         break;
  111.                
  112.                 case 3:
  113.                         if(KeyTemp!=KeyBuffer)
  114.                         {
  115.                                 if(++KeySampleCnt>LONG_OFF_DITHERING_COUNTER)
  116.                                 {
  117.                                         KeyEventCnt=0;
  118.                                         return ((KeyBuffer-1)<<2)+4;  //after long key on turn to off,(KeyBuffer-1)<<2+4
  119.                                 }
  120.                                 else
  121.                                         return 0;
  122.                         }
  123.                         else
  124.                         {
  125.                                 KeySampleCnt=0;
  126.                                 return 0;
  127.                         }
  128.                         break;
  129.                
  130.                 #else
  131.                 case 1:
  132.                         if(KeyTemp!=KeyBuffer)
  133.                         {
  134.                                 KeyEventCnt=0;
  135.                                 return 0;//is dithering,return 0
  136.                         }
  137.                         else
  138.                         {
  139.                                 if(++KeySampleCnt>=SHORT_ON_DITHERING_COUNTER)
  140.                                 {
  141.                                         KeySampleCnt=0;
  142.                                         KeyEventCnt=2;
  143.                                         return ((KeyBuffer-1)<<2)+1;//sure that key on,return (KeyBuffer-1)<<2+1
  144.                                 }
  145.                                 else
  146.                                         return 0;//not sure that key on,return 0                 
  147.                         }
  148.                         break;
  149.                                 
  150.                 case 2:
  151.                         if(KeyTemp!=KeyBuffer)
  152.                         {
  153.                                 if(++KeySampleCnt>=SHORT_OFF_DITHERING_COUNTER)
  154.                                 {
  155.                                         KeyEventCnt=0;
  156.                                         return ((KeyBuffer-1)<<2)+3;//after short on to off,(KeyBuffer-1)<<2+3
  157.                                 }
  158.                                 else
  159.                                         return 0;
  160.                         }
  161.                         else
  162.                         {
  163.                                 KeySampleCnt=0;
  164.                                 return 0;
  165.                         }
  166.                         break;
  167.                 #endif

  168.                 default:break;
  169.         }
  170.         return 0;
  171. }
  172. /***************************************************************/
复制代码

er.rar

63.09 KB, 下载次数: 421, 下载积分: 黑币 -5

蛇.rar

86 KB, 下载次数: 440, 下载积分: 黑币 -5

评分

参与人数 6黑币 +25 收起 理由
小怪兽zqa + 4 很给力!
ahhhh + 5 共享资料的黑币奖励!
qkhill + 5 绝世好帖!
sky_ + 1 很给力!
还好我机智 + 5 赞一个!
15576118519 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:138839 发表于 2016-9-10 13:39 | 显示全部楼层
有电路图吗
回复

使用道具 举报

ID:102679 发表于 2017-2-4 11:47 | 显示全部楼层
存了,慢慢研究
回复

使用道具 举报

ID:65680 发表于 2017-5-1 15:41 | 显示全部楼层
额额,没有电路图啊,有些地方表示不知道怎么回事啊
回复

使用道具 举报

ID:217401 发表于 2017-7-5 20:15 | 显示全部楼层
有电路图吗,楼主
回复

使用道具 举报

ID:234190 发表于 2017-10-20 10:37 | 显示全部楼层
按键怎么定义啊?接口怎么修改?
回复

使用道具 举报

ID:250045 发表于 2017-11-16 15:00 | 显示全部楼层
很好的程序,刚好有用!
回复

使用道具 举报

ID:59202 发表于 2017-11-30 18:08 | 显示全部楼层
不错的程序,学习一下啊
回复

使用道具 举报

ID:227030 发表于 2017-12-3 17:16 | 显示全部楼层
按键电路怎么接啊   按键用不了
回复

使用道具 举报

ID:241686 发表于 2017-12-8 20:06 | 显示全部楼层
感谢楼主,还在学习当中,
回复

使用道具 举报

ID:241686 发表于 2017-12-8 20:07 | 显示全部楼层
很好,有启发作用
回复

使用道具 举报

ID:268512 发表于 2017-12-28 18:53 | 显示全部楼层
下载下来看看
回复

使用道具 举报

ID:249703 发表于 2017-12-29 09:59 | 显示全部楼层
按键定义了咩啊?跪求大哥告诉
回复

使用道具 举报

ID:253549 发表于 2018-1-29 14:54 | 显示全部楼层
很厉害
回复

使用道具 举报

ID:253549 发表于 2018-1-29 14:55 | 显示全部楼层
楼主很厉害
回复

使用道具 举报

ID:276348 发表于 2018-2-6 20:31 | 显示全部楼层
很优秀的学习资料。
回复

使用道具 举报

ID:226427 发表于 2018-3-1 11:15 | 显示全部楼层
可以可以
回复

使用道具 举报

ID:223788 发表于 2018-4-17 20:18 | 显示全部楼层
加上电路图的话就更完美了
回复

使用道具 举报

ID:235332 发表于 2018-6-20 23:51 | 显示全部楼层
很好的资料
回复

使用道具 举报

ID:366705 发表于 2018-7-7 10:41 | 显示全部楼层
好东西啊,感谢楼主
回复

使用道具 举报

ID:365450 发表于 2018-7-7 16:14 | 显示全部楼层
贪吃蛇游戏键盘定义
上下左右分别为P1^5 1^6 1^4 1^3  级别键为P1^2对应1-9,1为最快速,9为最慢速
回复

使用道具 举报

ID:205182 发表于 2018-7-9 00:12 | 显示全部楼层
收下,慢慢看
回复

使用道具 举报

ID:343130 发表于 2018-7-9 22:05 | 显示全部楼层
真厉害,给力!
回复

使用道具 举报

ID:363785 发表于 2018-7-11 14:51 | 显示全部楼层
楼主大大的程序很nice,感谢
回复

使用道具 举报

ID:363785 发表于 2018-7-12 08:51 | 显示全部楼层
我想问一下er的文件不是俄罗斯方块吗,为什么我下载下来是贪吃蛇的
回复

使用道具 举报

ID:327527 发表于 2018-7-19 17:38 | 显示全部楼层
求电路图
回复

使用道具 举报

ID:394548 发表于 2018-9-6 14:40 | 显示全部楼层
真的厉害
回复

使用道具 举报

ID:336195 发表于 2018-11-28 14:10 | 显示全部楼层
俄罗斯方块有bug、有的图形不能最左
回复

使用道具 举报

ID:426241 发表于 2018-11-29 09:37 来自手机 | 显示全部楼层
非常感谢楼主
回复

使用道具 举报

ID:433244 发表于 2018-12-3 15:14 | 显示全部楼层
谢谢,刚好在找怎么单独显示点阵图的方法,赞一个·
回复

使用道具 举报

ID:434736 发表于 2018-12-5 09:35 来自手机 | 显示全部楼层
求电路图楼主
回复

使用道具 举报

ID:398813 发表于 2018-12-12 15:52 | 显示全部楼层
很给力,感谢楼主的分享,谢谢
回复

使用道具 举报

ID:276385 发表于 2018-12-12 16:51 | 显示全部楼层
很好的东西
回复

使用道具 举报

ID:441878 发表于 2019-1-7 22:25 | 显示全部楼层
希望可以得到学习
回复

使用道具 举报

ID:317383 发表于 2019-1-8 08:18 | 显示全部楼层
弄的挺好的的,以前用汇编写过,C显得简单多了
回复

使用道具 举报

ID:267702 发表于 2019-3-14 20:43 | 显示全部楼层
感谢大佬,装逼必备
回复

使用道具 举报

ID:491172 发表于 2019-3-15 06:52 | 显示全部楼层
先看看,等币够了来下!
回复

使用道具 举报

ID:329135 发表于 2019-4-19 20:52 | 显示全部楼层
求电路图!!!!
回复

使用道具 举报

ID:423869 发表于 2019-5-1 23:21 | 显示全部楼层
收下程序  慢慢消化
回复

使用道具 举报

ID:369306 发表于 2019-7-27 08:53 | 显示全部楼层
亲测 很棒  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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