久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24865|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99综合| 一区二区三区亚洲 | 亚洲国产精品区 | 黄网站涩免费蜜桃网站 | 成人av电影网 | 不卡的av在线 | 久久久久国产精品一区二区 | 国产精品视频在线观看 | 国产综合av | 国产视频中文字幕在线观看 | 国产精品视频一区二区三区, | 精品一区二区在线视频 | 中文字幕国产精品 | 免费99视频 | 99热视| 久久久精品网 | 国产日韩免费视频 | 午夜在线小视频 | 亚洲精品久久久久久国产精华液 | 日韩精品一区二区三区中文在线 | 亚洲国产精品激情在线观看 | 亚洲欧美一区二区三区1000 | 99成人| 中文字幕一区二区三 | 国产农村妇女精品一区 | 噜噜噜噜狠狠狠7777视频 | 精品1区2区 | 日韩av在线一区 | 亚洲欧美日本国产 | 精品国产青草久久久久福利 | 视频一区二区国产 | 国产精品美女在线观看 | 亚洲夜夜爽 | 国产在线二区 | 久久精品色欧美aⅴ一区二区 | 亚洲欧美日韩精品 | 国产精品a一区二区三区网址 | av在线天堂 | 亚洲美女视频 | 国产精品自产av一区二区三区 | 欧美日韩亚洲国产综合 |