找回密码
 立即注册

QQ登录

只需一步,快速开始

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

3DLED贪吃蛇程序 stc12c5a60s2单片机

[复制链接]
跳转到指定楼层
楼主
ID:674815 发表于 2020-11-24 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 风铃草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信号调节LED亮度
  16. u8 xdata BRIGHT[3] = {BRIGHTNESS0,BRIGHTNESS0,BRIGHTNESS0};// 3路亮度标志,分别改变3路PWM占空比
  17. u8 xdata BrightnessTAB[6] = {0,10,20,30,40,50};//亮度表
  18. #endif
  19. extern u8 pdata ARRAY3DLED[8][8];

  20. /********************************************/
  21. /*功能:系统初始化
  22. /*说明:
  23. /********************************************/
  24. void SystemInit()
  25. {
  26. #if 1
  27.         WDT_CONTR &= 0xdf;//关看门狗
  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口强推挽输出
  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;//关总中断,防止中断重入
  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;//关总中断,防止中断重入
  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);//开机全亮1秒

  110.         TurnOffAllLed();
  111.         EffectMode = ALLLEDOFF;//MARQUEE1;//ALLLEDON;//ROTATION;//NUMOrCHARACTER;//RANDOMFLASH;//开机灯灭
  112.         DisplayMode = NONE;                //开机关闭自动切换

  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://长按打开或关闭效果自动切换
  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. }
复制代码

程序: 3DLED贪吃蛇程序stc12c5a60s2.zip (207.19 KB, 下载次数: 11)

光立方原理图.pdf

97.12 KB, 下载次数: 12, 下载积分: 黑币 -5

原理图

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

使用道具 举报

沙发
ID:1 发表于 2020-11-24 17:11 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:88256 发表于 2020-11-24 17:34 | 只看该作者
8*8的3D吗?三个视频看看效果
回复

使用道具 举报

地板
ID:674815 发表于 2020-11-26 09:50 | 只看该作者
hhdsdy 发表于 2020-11-24 17:34
8*8的3D吗?三个视频看看效果

8x8x8的光立方
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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