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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2529|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

3DLED貪吃蛇程序 stc12c5a60s2單片機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:674815 發(fā)表于 2020-11-24 09:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 風(fēng)鈴草f 于 2020-11-26 10:31 編輯
  1. /********************************************/
  2. /*PROJECT:        3DLED
  3. /*MCU:        STC12C5A60S2
  4. /*VERSION:        0.1
  5. /*AUTHOR:        ChongZi
  6. /*DATE:        2013-10
  7. /********************************************/
  8. #include "STC12C5A.h"
  9. #include "3DLED.h"
  10. #include "3DLEDlib.h"
  11. #include "STDLIB.H"


  12. u8 EffectMode;//LED顯示效果類型
  13. u8 DisplayMode;//顯示效果切換模式
  14. #if 0
  15. u8 xdata PWM25HZ[3];// 3路25HZ PWM信號調(diào)節(jié)LED亮度
  16. u8 xdata BRIGHT[3] = {BRIGHTNESS0,BRIGHTNESS0,BRIGHTNESS0};// 3路亮度標(biāo)志,分別改變3路PWM占空比
  17. u8 xdata BrightnessTAB[6] = {0,10,20,30,40,50};//亮度表
  18. #endif
  19. extern u8 pdata ARRAY3DLED[8][8];

  20. /********************************************/
  21. /*功能:系統(tǒng)初始化
  22. /*說明:
  23. /********************************************/
  24. void SystemInit()
  25. {
  26. #if 1
  27.         WDT_CONTR &= 0xdf;//關(guān)看門狗
  28. #ifdef MODE
  29.         AUXR = 0x80;        //timer0 work in 1T mode
  30. #endif
  31.         TMOD = 0x01;        //set timer0 as mode2(16-bit)
  32.         TH0 = 0xa9;
  33.         TL0 = 0x32;        
  34.         TR0 = 1;                //timer0 start running
  35.         ET0 = 1;

  36. #ifdef MODE
  37.         AUXR |= 0x40;        //timer1 work in 1T mode
  38. #endif
  39.         TMOD |= 0x10;        //set timer1 as mode2(16-bit)
  40.         TH1 = 0xf5;
  41.         TL1 = 0x95;
  42.         TR1 = 1;                //timer1 start running
  43.         ET1 = 1;
  44. #endif
  45.         EA = 1;        //開總中斷

  46.         P0M1 = 0x00;
  47.         P0M0 = 0xff;//P0口強(qiáng)推挽輸出
  48. }

  49. /*******************消息池屬性定義*******************/
  50. #define MSG_DEEPNESS 8
  51. u8 MSG_POOL[MSG_DEEPNESS];//16位深度消息池
  52. u8 inptr = 0,outptr = 0;
  53. /*************************************************************/

  54. /*************************************************************/
  55. /*功能:存放消息
  56. /*說明:推送一個消息到消息池
  57. /*************************************************************/
  58. void PutMsg(u8 msg)
  59. {
  60.         EA = 0;//關(guān)總中斷,防止中斷重入
  61.         
  62.         MSG_POOL[inptr] = msg;
  63.         inptr ++;
  64.         if(inptr == MSG_DEEPNESS)
  65.                 inptr = 0;
  66.         
  67.         EA = 1;//開總中斷
  68. }

  69. /*************************************************************/
  70. /*功能:獲取消息
  71. /*說明:從消息池取出一個消息
  72. /*************************************************************/
  73. u8 GetMsg()
  74. {
  75.            u8 msg;
  76.         
  77.         EA = 0;//關(guān)總中斷,防止中斷重入
  78.         
  79.         if (outptr == inptr)
  80.         {
  81.                 EA = 1;//開總中斷
  82.                 return NO_MSG;
  83.         }
  84.         msg = MSG_POOL[outptr];
  85.         outptr++;
  86.         if (outptr == MSG_DEEPNESS)
  87.                 outptr = 0;
  88.         
  89.         EA = 1;//開總中斷
  90.         
  91.         return msg;
  92. }

  93. /*************************************************************/
  94. /*功能:按鍵鍵位獲取
  95. /*說明:只獲取鍵值,在定時器1里消抖
  96. /*************************************************************/
  97. u8 KeyDectect()
  98. {
  99.         u8 keyTmp = NO_KEY;
  100.         
  101.         if(!P32)        keyTmp = KEY_MODE;
  102.         
  103.         return keyTmp;
  104. }


  105. void main()
  106. {
  107.         u8 msg = NO_MSG;

  108.         TurnOnAllLed();
  109.         Delay5ms(200);//開機(jī)全亮1秒

  110.         TurnOffAllLed();
  111.         EffectMode = ALLLEDOFF;//MARQUEE1;//ALLLEDON;//ROTATION;//NUMOrCHARACTER;//RANDOMFLASH;//開機(jī)燈滅
  112.         DisplayMode = NONE;                //開機(jī)關(guān)閉自動切換

  113.         SystemInit();
  114.         DISPLAYInit();
  115.         
  116.         while(1)
  117.         {
  118. #if 0        
  119. #if 1
  120.                 msg = GetMsg();
  121.                 switch(msg)        
  122.                 {
  123.                         case NO_MSG :
  124.                                 switch(DisplayMode)
  125.                                 {
  126.                                         case NONE : break;
  127.                                         case NORMAL : EffectMode ++;break;
  128.                                         case RANDOM : EffectMode = (u8)rand();break;
  129.                                 }
  130.                                 break;
  131.                                 
  132.                         case KEY_MODE | TASK_KEY_SHORT_UP: //短按下一個效果
  133.                                 EffectMode ++;
  134.                                 break;

  135.                         case KEY_MODE | TASK_KEY_LONG://長按打開或關(guān)閉效果自動切換
  136.                                 if(DisplayMode == NONE)
  137.                                         DisplayMode = RANDOM;
  138.                                 if(DisplayMode == RANDOM)
  139.                                         DisplayMode = NONE;
  140.                                 break;         
  141.                 }
  142. #endif               
  143.         
  144.                 LedDisEffects(EffectMode ++);

  145.                 if(EffectMode > RANDOMFLASH)
  146.                         EffectMode = ALLLEDOFF;
  147. #else
  148. #if 1
  149.         clear(0);
  150.         LEDNUMOrCHARACTER();
  151.         LEDMARQUEE1(200,1000*1000);
  152.         LEDMARQUEE1(5000*2,100);
  153.         LEDRANDOM();
  154.         
  155.         clear(0);
  156.         flash_2();
  157.         flash_3();
  158.         flash_4();
  159.         flash_4();
  160.         flash_5();
  161.         flash_5();
  162.         flash_6();
  163.         flash_7();
  164.         flash_8();
  165.         flash_9();
  166.         flash_10();
  167.         clear(0);
  168.         flash_11();
  169.         flash_9();
  170.         flash_5();
  171.         flash_7();
  172.         flash_5();
  173.         flash_6();
  174.         flash_8();
  175.         flash_9();
  176.         flash_10();
  177.         clear(0);
  178.         flash_1();
  179. #endif
  180. #endif
  181.         }        
  182. }

  183. /*************************************************************/
  184. /*功能:timer0 ISR對LED立方體掃描
  185. /*說明:時間待改(中斷源1)
  186. /*************************************************************/
  187. void timer0ISR() interrupt 1
  188. {
  189. #if 0
  190.         u8 i;
  191.         static u8 Count25Hz[3] = {0,0,0};

  192.         for(i = 0;i < 3;i ++)
  193.         {        
  194.                 if(Count25Hz[i] == 0)
  195.                         PWM25HZ[i] = 1;
  196.                 else if(Count25Hz[i] == BrightnessTAB[BRIGHT[i]])
  197.                         PWM25HZ[i] = 0;

  198.                 Count25Hz[i] ++;
  199.                 if(Count25Hz[i] == 50)
  200.                         Count25Hz[i] = 0;
  201.         }
  202. #endif        
  203.         LedScan();
  204.         TH0 = 0x97;
  205.         TL0 = 0xd5;
  206. }

  207. /*************************************************************/
  208. /*功能:timer1 ISR按鍵掃描
  209. /*說明:時間待改(中斷源3)
  210. /*************************************************************/
  211. void KeyScan() interrupt 3
  212. {
  213.         static u8 keyValue,keyValue_1 = NO_KEY;
  214.         static u8 keyCounter,keyCounter_1;
  215.         u8 keyTmp,key_return = NO_KEY;
  216.         static volatile  bool long_key;
  217.         
  218. #if 0
  219. /*
  220.         if(KeyDectect() != NO_KEY)
  221.         {
  222.                 //PutMsg(KEY_MODE | TASK_KEY_SHORT_UP);
  223.                 ARRAY3DLED[7][0] = 0x01;
  224.         }
  225. */

  226.         if(!P32)        ARRAY3DLED[7][0] = 0x01;
  227. #else
  228.         keyTmp = KeyDectect();
  229.         
  230.         if(keyTmp != keyValue_1)   //是否與前次采樣值相等?  keyValue_1:前次采樣值
  231.     {
  232.         keyValue_1 = keyTmp;
  233.         keyCounter_1 = 0;
  234.         return;
  235.     }
  236.     else
  237.     {
  238.         if(keyCounter_1 < KEY_SHAKE_TIMES)
  239.         {
  240.             keyCounter_1++;
  241.             return;
  242.         }
  243.     }

  244.     if(keyTmp == NO_KEY)   //抬鍵或者沒有按鍵
  245.     {
  246.         if(long_key == TRUE)  //長按抬鍵
  247.         {
  248.                         key_return = keyValue | TASK_KEY_LONG_UP;
  249.         }
  250.         else if((keyCounter < KEY_LONG_TIMES) && (keyCounter > KEY_SCAN_TIMES))   //短按抬鍵
  251.         {
  252.                         key_return = keyValue | TASK_KEY_SHORT_UP;
  253.         }
  254.         keyValue = NO_KEY;
  255.         long_key = 0;
  256.         keyCounter = 0;
  257.     }
  258.     else if((keyTmp != keyValue)/* && (keyValue == NO_KEY)*/)
  259.     {
  260.         keyValue = keyTmp;
  261.         keyCounter = 0;
  262.         long_key = 0;
  263.     }
  264.     else
  265.     {
  266.         keyCounter++;
  267.         if(keyCounter == KEY_SCAN_TIMES)                        //去抖
  268.         {
  269.             key_return = keyValue;
  270.         }
  271.         else if(keyCounter == KEY_LONG_TIMES )                                //長按
  272.         {
  273.             if(long_key == FALSE)
  274.             {
  275.                 long_key = TRUE;
  276.                 key_return = keyValue | TASK_KEY_LONG;
  277.             }
  278.         }
  279.         else if(keyCounter == (KEY_LONG_TIMES + KEY_HOLD_TIMES))                        //連按
  280.         {
  281.             key_return = keyValue | TASK_KEY_HOLD;
  282.             keyCounter = KEY_LONG_TIMES;
  283.         }

  284.     }
  285.         if(key_return != NO_KEY)
  286.         {        
  287.                 PutMsg(key_return);
  288.         }

  289.         TH1 = 0xf5;
  290.         TL1 = 0x95;
  291. #endif        
  292. }
復(fù)制代碼

程序: 3DLED貪吃蛇程序stc12c5a60s2.zip (207.19 KB, 下載次數(shù): 11)

光立方原理圖.pdf

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

原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2020-11-24 17:11 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報

板凳
ID:88256 發(fā)表于 2020-11-24 17:34 | 只看該作者
8*8的3D嗎?三個視頻看看效果
回復(fù)

使用道具 舉報

地板
ID:674815 發(fā)表于 2020-11-26 09:50 | 只看該作者
hhdsdy 發(fā)表于 2020-11-24 17:34
8*8的3D嗎?三個視頻看看效果

8x8x8的光立方
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 7777久久 | 你懂的免费在线 | 国产视频久久 | 不卡视频在线 | 黄免费观看视频 | 秋霞影院一区二区 | 国产日韩一区二区 | 亚洲黄色国产 | 久久亚洲一区二区三区四区 | 久草中文在线观看 | 福利精品在线观看 | wwwsihu| 九九国产在线观看 | 一区亚洲 | 国产ts人妖一区二区三区 | 中文字幕亚洲视频 | 亚洲国产精品久久久 | 久久免费大片 | 精品成人一区二区 | 暖暖日本在线视频 | 一级毛片在线播放 | 成人精品一区二区三区中文字幕 | 蜜桃视频在线观看免费视频网站www | av在线影院 | 亚洲美女天堂网 | 国产视频导航 | 作爱视频免费看 | 黄色大片免费网站 | 精品国产一区久久 | 婷婷综合久久 | 欧美精品在线播放 | 福利一区二区 | 成人乱人乱一区二区三区软件 | 人人爽日日躁夜夜躁尤物 | 日韩视频一区二区在线 | 成人午夜精品一区二区三区 | 国产91在线精品 | 亚洲国产精品福利 | 欧美一区二区三区在线 | 九九久视频 | www.精品国产 |