wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 26301|回復: 48
收起左側

51單片機+LCD12864做的貪食蛇和俄羅斯方塊小游戲分享

  [復制鏈接]
ID:128771 發(fā)表于 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. 偽隨機數(shù)發(fā)生器
  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. 為偽隨機數(shù)發(fā)生器播種
  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原創(chuàng)");
  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. 根據(jù)積木圖標左下坐標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數(shù)據(jù)中
  205. 也即把積木圖標固定,無法再下降
  206. *********************************/
  207. FixSign(void)
  208. {
  209.         unsigned char m,n;
  210.         for(m=0;m<4;m++)//行循環(huán)
  211.                 for(n=0;n<4;n++)//列循環(huá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++)//行循環(huán)
  226.                 for(n=0;n<4;n++)//列循環(huá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. 判斷積木圖標是否可以繼續(xù)下降一格
  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++;//每找到一個滿行,則分數(shù)加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. 隨機產生一個積木圖標放到預產生區(qū)域并顯示出來
  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++)//行循環(huán)
  387.                         {
  388.                                 for(n=0;n<4;n++)//列循環(huá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.                         }//將積木圖標出現(xiàn)置頂
  396.                         
  397.                         for(m=0;m<4;m++)//行循環(huán)
  398.                                 for(n=0;n<4;n++)//列循環(huá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())//判斷是否能繼續(xù)下降一格
  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())//判斷是否能繼續(xù)下降一格
  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);//要想重玩,只能重啟,可繼續(xù)完善該游戲
  530. }
復制代碼




  1. #include "REG52.H"
  2. #include "Key.h"
  3. #define OS_LONG_KEY_EN 1//如果應用中需要處理長按鍵動作,則定義為1,否則定義為0(如果應用中不需要處理長按動作,則建議定義為0,以節(jié)省代碼空間)

  4. /***********************************************
  5. 功能說明:按鍵驅動掃描
  6. 入口參數(shù):無
  7. 出口參數(shù):掃描一次鍵盤以獲得按鍵句柄
  8. 注:交OSReadKey()函數(shù)調用
  9. 需要根據(jù)實際硬件的鍵盤接口修改
  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. 入口參數(shù):無
  30. 出口參數(shù):返回按鍵動作
  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, 下載次數(shù): 421, 下載積分: 黑幣 -5

蛇.rar

86 KB, 下載次數(shù): 440, 下載積分: 黑幣 -5

評分

參與人數(shù) 6黑幣 +25 收起 理由
小怪獸zqa + 4 很給力!
ahhhh + 5 共享資料的黑幣獎勵!
qkhill + 5 絕世好帖!
sky_ + 1 很給力!
還好我機智 + 5 贊一個!
15576118519 + 5 很給力!

查看全部評分

回復

使用道具 舉報

ID:138839 發(fā)表于 2016-9-10 13:39 | 顯示全部樓層
有電路圖嗎
回復

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
ID:102679 發(fā)表于 2017-2-4 11:47 | 顯示全部樓層
存了,慢慢研究
回復

使用道具 舉報

ID:65680 發(fā)表于 2017-5-1 15:41 | 顯示全部樓層
額額,沒有電路圖啊,有些地方表示不知道怎么回事啊
回復

使用道具 舉報

ID:217401 發(fā)表于 2017-7-5 20:15 | 顯示全部樓層
有電路圖嗎,樓主
回復

使用道具 舉報

ID:234190 發(fā)表于 2017-10-20 10:37 | 顯示全部樓層
按鍵怎么定義?接口怎么修改?
回復

使用道具 舉報

8#
無效樓層,該帖已經(jīng)被刪除
ID:250045 發(fā)表于 2017-11-16 15:00 | 顯示全部樓層
很好的程序,剛好有用!
回復

使用道具 舉報

ID:59202 發(fā)表于 2017-11-30 18:08 | 顯示全部樓層
不錯的程序,學習一下啊
回復

使用道具 舉報

ID:227030 發(fā)表于 2017-12-3 17:16 | 顯示全部樓層
按鍵電路怎么接啊   按鍵用不了
回復

使用道具 舉報

ID:241686 發(fā)表于 2017-12-8 20:06 | 顯示全部樓層
感謝樓主,還在學習當中,
回復

使用道具 舉報

ID:241686 發(fā)表于 2017-12-8 20:07 | 顯示全部樓層
很好,有啟發(fā)作用
回復

使用道具 舉報

ID:268512 發(fā)表于 2017-12-28 18:53 | 顯示全部樓層
下載下來看看
回復

使用道具 舉報

ID:249703 發(fā)表于 2017-12-29 09:59 | 顯示全部樓層
按鍵定義了咩啊?跪求大哥告訴
回復

使用道具 舉報

ID:253549 發(fā)表于 2018-1-29 14:54 | 顯示全部樓層
很厲害
回復

使用道具 舉報

ID:253549 發(fā)表于 2018-1-29 14:55 | 顯示全部樓層
樓主很厲害
回復

使用道具 舉報

ID:276348 發(fā)表于 2018-2-6 20:31 | 顯示全部樓層
很優(yōu)秀的學習資料。
回復

使用道具 舉報

ID:226427 發(fā)表于 2018-3-1 11:15 | 顯示全部樓層
可以可以
回復

使用道具 舉報

ID:223788 發(fā)表于 2018-4-17 20:18 | 顯示全部樓層
加上電路圖的話就更完美了
回復

使用道具 舉報

ID:235332 發(fā)表于 2018-6-20 23:51 | 顯示全部樓層
很好的資料
回復

使用道具 舉報

ID:366705 發(fā)表于 2018-7-7 10:41 | 顯示全部樓層
好東西啊,感謝樓主
回復

使用道具 舉報

ID:365450 發(fā)表于 2018-7-7 16:14 | 顯示全部樓層
貪吃蛇游戲鍵盤定義
上下左右分別為P1^5 1^6 1^4 1^3  級別鍵為P1^2對應1-9,1為最快速,9為最慢速
回復

使用道具 舉報

ID:205182 發(fā)表于 2018-7-9 00:12 | 顯示全部樓層
收下,慢慢看
回復

使用道具 舉報

ID:343130 發(fā)表于 2018-7-9 22:05 | 顯示全部樓層
真厲害,給力!
回復

使用道具 舉報

ID:363785 發(fā)表于 2018-7-11 14:51 | 顯示全部樓層
樓主大大的程序很nice,感謝
回復

使用道具 舉報

ID:363785 發(fā)表于 2018-7-12 08:51 | 顯示全部樓層
我想問一下er的文件不是俄羅斯方塊嗎,為什么我下載下來是貪吃蛇的
回復

使用道具 舉報

ID:327527 發(fā)表于 2018-7-19 17:38 | 顯示全部樓層
求電路圖
回復

使用道具 舉報

ID:394548 發(fā)表于 2018-9-6 14:40 | 顯示全部樓層
真的厲害
回復

使用道具 舉報

ID:336195 發(fā)表于 2018-11-28 14:10 | 顯示全部樓層
俄羅斯方塊有bug、有的圖形不能最左
回復

使用道具 舉報

ID:426241 發(fā)表于 2018-11-29 09:37 來自觸屏版 | 顯示全部樓層
非常感謝樓主
回復

使用道具 舉報

ID:433244 發(fā)表于 2018-12-3 15:14 | 顯示全部樓層
謝謝,剛好在找怎么單獨顯示點陣圖的方法,贊一個·
回復

使用道具 舉報

ID:434736 發(fā)表于 2018-12-5 09:35 來自觸屏版 | 顯示全部樓層
求電路圖樓主
回復

使用道具 舉報

ID:398813 發(fā)表于 2018-12-12 15:52 | 顯示全部樓層
很給力,感謝樓主的分享,謝謝
回復

使用道具 舉報

ID:276385 發(fā)表于 2018-12-12 16:51 | 顯示全部樓層
很好的東西
回復

使用道具 舉報

ID:441878 發(fā)表于 2019-1-7 22:25 | 顯示全部樓層
希望可以得到學習
回復

使用道具 舉報

ID:317383 發(fā)表于 2019-1-8 08:18 | 顯示全部樓層
弄的挺好的的,以前用匯編寫過,C顯得簡單多了
回復

使用道具 舉報

ID:267702 發(fā)表于 2019-3-14 20:43 | 顯示全部樓層
感謝大佬,裝逼必備
回復

使用道具 舉報

39#
無效樓層,該帖已經(jīng)被刪除
ID:491172 發(fā)表于 2019-3-15 06:52 | 顯示全部樓層
先看看,等幣夠了來下!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
日本中文字幕久久看| 久久99精品久久久久久久青青日本 | 日韩精品久久久| 欧美激情视频在线| 7777精品伊人久久久大香线蕉的 | 国内精彩免费自拍视频在线观看网址 | 日韩一区二区三区在线免费观看| 91av入口| 亚洲精品一区二区三区网址| 影音先锋亚洲天堂| 初高中福利视频网站| 伊人久久在线观看| 懂色中文一区二区三区在线视频| 日韩在线欧美在线国产在线| 欧美伦理视频网站| 中文字幕一区二区三区精华液| 日韩专区在线视频| 成人毛片在线| 亚洲国产aⅴ精品一区二区三区| 91电影在线播放| 精品人妻一区二区三区四区| 黄色免费视频大全| 欧美动漫一区二区| 国产精品亚洲一区二区三区| 久久亚洲私人国产精品va| 欧美另类高清zo欧美| 亚洲图片欧美综合| 99视频精品免费视频| 久久久999| 91精品国产麻豆国产在线观看 | 在线观看av中文| 黄页在线免费观看| 中文资源在线官网| 国产男男gay体育生白袜| 日本熟妇一区二区| 中文字幕乱码av| 又黄又爽的网站| www.色欧美| 国产a级一级片| 老司机激情视频| 新呦u视频一区二区| 成人精品在线视频| 欧美亚洲第一页| 欧美激情成人在线视频| 一本色道久久88精品综合| 精品久久国产97色综合| 欧美日韩国产免费一区二区 | 7777精品久久久大香线蕉小说| 国产最新精品视频| 久久成人这里只有精品| 日韩一级裸体免费视频| 亚洲亚裔videos黑人hd| 亚洲午夜久久久影院| 日韩h在线观看| 日韩高清人体午夜| 精品国产一区二区三区不卡| 丁香激情综合国产| 麻豆国产精品视频| 麻豆精品视频在线观看免费| 久久国产精品第一页| 日韩中文字幕亚洲一区二区va在线| 欧美日一区二区三区在线观看国产免| 日韩一区亚洲二区| 婷婷色综合网| 欧美视频成人| 一级成人国产| 日韩高清在线观看| 秋霞av亚洲一区二区三| 久久国产精品色| 国产精品自拍av| 懂色一区二区三区免费观看| 99精品久久免费看蜜臀剧情介绍 | 国内自拍欧美激情| 4388成人网| 国产成人精品av在线| 最新热久久免费视频| 91丝袜呻吟高潮美腿白嫩在线观看| 成人av网址在线| 久久精品一级爱片| 亚洲欧美日韩在线| 欧美日韩一区二区精品| 欧美亚洲丝袜传媒另类| 欧美第一区第二区| 亚洲欧美在线免费| 欧美黑人性猛交| 国产91久久婷婷一区二区| 国产精品久久久久久久app| 国产在线观看91精品一区| 成人精品水蜜桃| 日本成人三级| 成人午夜视频免费观看| 日本精品一区二区三区四区| 天天看片天天操| 中文字幕在线免费看线人| 久久亚洲AV无码专区成人国产| 亚洲一区电影在线观看| 国产又爽又黄的视频| 亚洲一线在线观看| sihu影院永久在线影院| 免费自拍视频| 最新国产在线| a天堂中文在线官网在线| 亚洲天堂av在线| 国产精品2023| 国产在线成人| 六月丁香综合在线视频| 久久久久久久久一| 亚洲成人高清在线| 日韩一区二区精品| 色婷婷综合久久久久| 日本久久久久亚洲中字幕| 古典武侠综合av第一页| 久久久久久久久影视| 亚洲精品久久久中文字幕| 国产黄片一区二区三区| 日本视频免费在线| 亚洲三级黄色片| 日韩av大片在线观看| 色窝窝无码一区二区三区| 免费看黄资源大全高清| 日本电影一区二区在线观看| 超碰国产一区| 日韩精品一区二区三区免费观影| 久久免费国产| 国产亚洲欧美激情| 欧美日本在线看| 欧美成人精品一区二区三区| 国产 高清 精品 在线 a| 人人妻人人做人人爽| 无码人妻精品一区二区三应用大全| 国产成人精品网| 久久久9999久久精品小说| 最近2018年手机中文在线| 久九九久频精品短视频| 久久大综合网| 91麻豆swag| 6080午夜不卡| 亲子乱一区二区三区电影| 精品国产伦一区二区三区免费 | 日韩午夜影院| 九七影院97影院理论片久久| 91免费精品| av激情综合网| 欧美日韩一区不卡| 久久久久久国产精品美女| 欧美人与性禽动交精品| 丁香婷婷激情网| 日韩三级免费看| 国产一二三四| 九七久久人人| 精品视频日韩| 26uuu欧美日本| 欧美大片日本大片免费观看| 国产精品久久久久影院日本| 亚洲美免无码中文字幕在线| 中国一级片在线观看| 亚洲精品国产一区二区在线| 川上优的av在线一区二区| 精品亚洲免a| 国产成人av影院| 91精品国产综合久久精品图片 | 69堂免费精品视频在线播放| 狠狠噜噜久久| 中文字幕在线不卡视频| 日韩电影视频免费| 国产精品传媒毛片三区| 一级淫片在线观看| 中文字幕第99页| 天天干 天天插| 日韩毛片在线| 肉肉av福利一精品导航| 精品国产福利视频| 97国产精品视频人人做人人爱| 超碰10000| 久久久久久久久久久网| 日本xxxwww免费视频| 天堂av在线网| 日韩不卡一二三区| 色综合久久综合中文综合网| 欧美亚洲国产怡红院影院| 国产99久久精品一区二区| 国产成人黄色片| 国产精品免费无遮挡无码永久视频| 国内自拍视频在线观看| 中文不卡1区2区3区| 石原莉奈在线亚洲二区| 在线中文字幕一区二区| 国产精品久久久久福利| 中文字幕一区久久| 精品国产免费无码久久久| 久青草国产在线| 99久久99久久精品国产片桃花| 国产精品久久三| 欧美精品一二区| 国产精品网站免费| 亚洲熟妇无码久久精品| 亚洲第一区视频| 第一会所亚洲原创| 亚洲精品久久久蜜桃| 97在线看福利| 日韩av自拍偷拍| 五月天婷婷在线播放| 日本免费观看视| 亚洲精华国产| 欧美精品乱码| 亚洲综合色区另类av| 国产亚洲欧美日韩精品| 九色视频在线观看| 国产精品第12页| 免费男同深夜夜行网站| 国产精品自产拍在线观看中文| 欧美国产三区| 亚洲美女综合网| 欧洲美女7788成人免费视频| 欧美丝袜激情| 国产91精品在线观看| 毛片精品免费在线观看| 中文字幕无人区二| 成人18网址在线观看| 综合天堂av久久久久久久| 亚洲精品videossex少妇| 五月天av在线播放| freehdxxxx| 欧美日韩一区二区国产| 亚洲美女性视频| 色诱av手机版| 在线看片免费人成视久网| 美女mm1313爽爽久久久蜜臀| 国模视频一区二区| 2025国产精品自拍| 欧美日本高清| 国产精品网站在线观看| 精品视频导航| 亚洲精品国产av| 日韩电影不卡一区| 91精品国产欧美一区二区成人| 亚洲爆乳无码专区| 成年女人在线视频| 亚洲一区自拍| 91av在线看| 国产香蕉视频在线| 亚洲一区资源| 午夜精品影院在线观看| 777久久精品一区二区三区无码| 欧美黑人xxxx猛牲大交| 亚洲第一天堂| 亚洲高清在线精品| 亚洲精品天堂成人片av在线播放| 国产免费高清| 国产精品magnet| 久草视频免费播放| av女片在线| 天天做天天爱天天综合网| 欧美美女喷水视频| 国内少妇毛片视频| 一区二区在线观看视频在线| 欧美一区二区三区| 国内精品久久久久久久影视麻豆 | 五月激情四射婷婷| 26uuu亚洲电影在线观看| 亚洲欧洲制服丝袜| 国产精品视频网站在线观看| 嫩草www视频在线观看高清| 蜜乳av另类精品一区二区| 日韩免费精品视频| 中文字幕一区二区人妻视频| 免费观看的黄色网址| 99热精品在线| 国产精品扒开腿做爽爽爽的视频| 澳门黄色一级片| 成人激情视屏| 精品久久久三级丝袜| 超碰97在线资源站| 青春草免费在线视频| 欧美性xxxx极品高清hd直播| 中文字幕一区二区三区四区在线视频 | 99精品国产99久久久久久97| 亚洲精品456| 91激情五月电影| 亚洲网中文字幕| 国产大学生校花援交在线播放| 综合久久给合久久狠狠狠97色| 欧美二区在线视频| 四色成人av永久网址| 国产色综合一区| 日本一区午夜艳熟免费| 欧美久草视频| 日本视频免费一区| 国产精品美女黄网| 国产美女极度色诱视频www| 久久亚洲影院| 国产福利久久| 国产不卡一卡2卡三卡4卡5卡在线| 麻豆91精品| 国内视频一区| 91电影在线| 国产精品18久久久久久vr| 日韩视频专区| 亚洲an天堂an在线观看| 欧美污视频久久久| 99热这里只有精品66| 蜜桃久久久久| 亚洲人成人99网站| 天天舔天天操天天干| 国产精品久久久久久福利| 亚洲人成在线播放网站岛国| 亚洲自拍偷拍一区二区三区| 自拍小视频在线观看| 性一交一乱一区二区洋洋av| 午夜av免费观看| 综合久久综合| 999热视频| 暖暖影院日本高清...免费| 成人黄色777网| 中文字幕人妻熟女人妻洋洋| 四色成人av永久网址| 午夜亚洲国产au精品一区二区| 星空大象在线观看免费播放| 国产成人精品亚洲日本在线观看| 亚洲美女中文字幕| 7799精品视频天天看| 首页国产精品| 91精品中国老女人| 丝袜脚交免费网站xx| 国产三级精品在线| 在线观看免费的av| 岛国av在线网站| 亚洲欧美国产制服动漫| 国产一区二区视频网站| 亚洲精品a级片| 国产手机精品在线| 亚洲aⅴ乱码精品成人区| 久久99精品视频| 黄色片免费在线观看视频| 国产视频三级在线观看播放| 欧美日韩一区二区在线视频| 日韩成人短视频| 精品久久综合| 亚洲一区二区久久久久久久| 免费vip影院| 亚洲欧美日韩在线播放| 亚洲一区二区三区黄色| 日韩成人综合网站| 久久全国免费视频| 日韩色级片先锋影音| 91视频免费观看| 97超碰免费在线观看| 欧美天堂一区| 欧美与欧洲交xxxx免费观看| 国产精品69一区二区三区| 国产视频在线观看一区二区三区| 亚洲黄色片免费| 3d动漫一区二区三区在线观看| 51午夜精品视频| 日本大片在线看黄a∨免费| 亚洲欧美另类久久久精品2019| 91国产精品视频在线观看| 搜成人激情视频| 97国产真实伦对白精彩视频8| 国产日韩欧美第一页| 国产精品久久二区二区| 免费看污黄网站在线观看| 欧美男人操女人视频| 欧美激情视频免费观看| 国产精品日日爱| 一区二区三区精密机械公司| 成人做爰69片免网站| 国产精品毛片一区二区在线看| 国产精品人人爱一区二区白浆| 久久精品中文| 国产av不卡一区二区| 蜜桃视频在线观看视频| 欧美日韩国产电影| 欧美成人黄色网| 欧美呦呦网站| 91九色在线观看| 1069视频| 国产91在线观看丝袜| 极品美女扒开粉嫩小泬| 男人的天堂在线视频免费观看 | 亚洲va欧美va在线观看| 乳奴隷乳フ辱julia在线观看| 中文字幕久久午夜不卡| 折磨小男生性器羞耻的故事| 婷婷久久免费视频| 久久免费视频在线| 欧美色图色就是色| 国产色一区二区| 特级西西人体4444xxxx| 97色成人综合网站| 亚洲色图狂野欧美| av官网在线观看| 精品一区二区三区香蕉蜜桃| 欧美成人xxxxx| 国产在线看片免费视频在线观看| 日韩在线观看网站| 欧美video巨大粗暴18| 国产精品电影院| 亚洲高潮女人毛茸茸| 久久精品国产99久久|