|
本帖最后由 風(fēng)鈴草f 于 2020-11-26 10:31 編輯
- /********************************************/
- /*PROJECT: 3DLED
- /*MCU: STC12C5A60S2
- /*VERSION: 0.1
- /*AUTHOR: ChongZi
- /*DATE: 2013-10
- /********************************************/
- #include "STC12C5A.h"
- #include "3DLED.h"
- #include "3DLEDlib.h"
- #include "STDLIB.H"
- u8 EffectMode;//LED顯示效果類型
- u8 DisplayMode;//顯示效果切換模式
- #if 0
- u8 xdata PWM25HZ[3];// 3路25HZ PWM信號調(diào)節(jié)LED亮度
- u8 xdata BRIGHT[3] = {BRIGHTNESS0,BRIGHTNESS0,BRIGHTNESS0};// 3路亮度標(biāo)志,分別改變3路PWM占空比
- u8 xdata BrightnessTAB[6] = {0,10,20,30,40,50};//亮度表
- #endif
- extern u8 pdata ARRAY3DLED[8][8];
- /********************************************/
- /*功能:系統(tǒng)初始化
- /*說明:
- /********************************************/
- void SystemInit()
- {
- #if 1
- WDT_CONTR &= 0xdf;//關(guān)看門狗
- #ifdef MODE
- AUXR = 0x80; //timer0 work in 1T mode
- #endif
- TMOD = 0x01; //set timer0 as mode2(16-bit)
- TH0 = 0xa9;
- TL0 = 0x32;
- TR0 = 1; //timer0 start running
- ET0 = 1;
- #ifdef MODE
- AUXR |= 0x40; //timer1 work in 1T mode
- #endif
- TMOD |= 0x10; //set timer1 as mode2(16-bit)
- TH1 = 0xf5;
- TL1 = 0x95;
- TR1 = 1; //timer1 start running
- ET1 = 1;
- #endif
- EA = 1; //開總中斷
- P0M1 = 0x00;
- P0M0 = 0xff;//P0口強(qiáng)推挽輸出
- }
- /*******************消息池屬性定義*******************/
- #define MSG_DEEPNESS 8
- u8 MSG_POOL[MSG_DEEPNESS];//16位深度消息池
- u8 inptr = 0,outptr = 0;
- /*************************************************************/
- /*************************************************************/
- /*功能:存放消息
- /*說明:推送一個消息到消息池
- /*************************************************************/
- void PutMsg(u8 msg)
- {
- EA = 0;//關(guān)總中斷,防止中斷重入
-
- MSG_POOL[inptr] = msg;
- inptr ++;
- if(inptr == MSG_DEEPNESS)
- inptr = 0;
-
- EA = 1;//開總中斷
- }
- /*************************************************************/
- /*功能:獲取消息
- /*說明:從消息池取出一個消息
- /*************************************************************/
- u8 GetMsg()
- {
- u8 msg;
-
- EA = 0;//關(guān)總中斷,防止中斷重入
-
- if (outptr == inptr)
- {
- EA = 1;//開總中斷
- return NO_MSG;
- }
- msg = MSG_POOL[outptr];
- outptr++;
- if (outptr == MSG_DEEPNESS)
- outptr = 0;
-
- EA = 1;//開總中斷
-
- return msg;
- }
- /*************************************************************/
- /*功能:按鍵鍵位獲取
- /*說明:只獲取鍵值,在定時器1里消抖
- /*************************************************************/
- u8 KeyDectect()
- {
- u8 keyTmp = NO_KEY;
-
- if(!P32) keyTmp = KEY_MODE;
-
- return keyTmp;
- }
- void main()
- {
- u8 msg = NO_MSG;
- TurnOnAllLed();
- Delay5ms(200);//開機(jī)全亮1秒
- TurnOffAllLed();
- EffectMode = ALLLEDOFF;//MARQUEE1;//ALLLEDON;//ROTATION;//NUMOrCHARACTER;//RANDOMFLASH;//開機(jī)燈滅
- DisplayMode = NONE; //開機(jī)關(guān)閉自動切換
- SystemInit();
- DISPLAYInit();
-
- while(1)
- {
- #if 0
- #if 1
- msg = GetMsg();
- switch(msg)
- {
- case NO_MSG :
- switch(DisplayMode)
- {
- case NONE : break;
- case NORMAL : EffectMode ++;break;
- case RANDOM : EffectMode = (u8)rand();break;
- }
- break;
-
- case KEY_MODE | TASK_KEY_SHORT_UP: //短按下一個效果
- EffectMode ++;
- break;
- case KEY_MODE | TASK_KEY_LONG://長按打開或關(guān)閉效果自動切換
- if(DisplayMode == NONE)
- DisplayMode = RANDOM;
- if(DisplayMode == RANDOM)
- DisplayMode = NONE;
- break;
- }
- #endif
-
- LedDisEffects(EffectMode ++);
- if(EffectMode > RANDOMFLASH)
- EffectMode = ALLLEDOFF;
- #else
- #if 1
- clear(0);
- LEDNUMOrCHARACTER();
- LEDMARQUEE1(200,1000*1000);
- LEDMARQUEE1(5000*2,100);
- LEDRANDOM();
-
- clear(0);
- flash_2();
- flash_3();
- flash_4();
- flash_4();
- flash_5();
- flash_5();
- flash_6();
- flash_7();
- flash_8();
- flash_9();
- flash_10();
- clear(0);
- flash_11();
- flash_9();
- flash_5();
- flash_7();
- flash_5();
- flash_6();
- flash_8();
- flash_9();
- flash_10();
- clear(0);
- flash_1();
- #endif
- #endif
- }
- }
- /*************************************************************/
- /*功能:timer0 ISR對LED立方體掃描
- /*說明:時間待改(中斷源1)
- /*************************************************************/
- void timer0ISR() interrupt 1
- {
- #if 0
- u8 i;
- static u8 Count25Hz[3] = {0,0,0};
- for(i = 0;i < 3;i ++)
- {
- if(Count25Hz[i] == 0)
- PWM25HZ[i] = 1;
- else if(Count25Hz[i] == BrightnessTAB[BRIGHT[i]])
- PWM25HZ[i] = 0;
- Count25Hz[i] ++;
- if(Count25Hz[i] == 50)
- Count25Hz[i] = 0;
- }
- #endif
- LedScan();
- TH0 = 0x97;
- TL0 = 0xd5;
- }
- /*************************************************************/
- /*功能:timer1 ISR按鍵掃描
- /*說明:時間待改(中斷源3)
- /*************************************************************/
- void KeyScan() interrupt 3
- {
- static u8 keyValue,keyValue_1 = NO_KEY;
- static u8 keyCounter,keyCounter_1;
- u8 keyTmp,key_return = NO_KEY;
- static volatile bool long_key;
-
- #if 0
- /*
- if(KeyDectect() != NO_KEY)
- {
- //PutMsg(KEY_MODE | TASK_KEY_SHORT_UP);
- ARRAY3DLED[7][0] = 0x01;
- }
- */
- if(!P32) ARRAY3DLED[7][0] = 0x01;
- #else
- keyTmp = KeyDectect();
-
- if(keyTmp != keyValue_1) //是否與前次采樣值相等? keyValue_1:前次采樣值
- {
- keyValue_1 = keyTmp;
- keyCounter_1 = 0;
- return;
- }
- else
- {
- if(keyCounter_1 < KEY_SHAKE_TIMES)
- {
- keyCounter_1++;
- return;
- }
- }
- if(keyTmp == NO_KEY) //抬鍵或者沒有按鍵
- {
- if(long_key == TRUE) //長按抬鍵
- {
- key_return = keyValue | TASK_KEY_LONG_UP;
- }
- else if((keyCounter < KEY_LONG_TIMES) && (keyCounter > KEY_SCAN_TIMES)) //短按抬鍵
- {
- key_return = keyValue | TASK_KEY_SHORT_UP;
- }
- keyValue = NO_KEY;
- long_key = 0;
- keyCounter = 0;
- }
- else if((keyTmp != keyValue)/* && (keyValue == NO_KEY)*/)
- {
- keyValue = keyTmp;
- keyCounter = 0;
- long_key = 0;
- }
- else
- {
- keyCounter++;
- if(keyCounter == KEY_SCAN_TIMES) //去抖
- {
- key_return = keyValue;
- }
- else if(keyCounter == KEY_LONG_TIMES ) //長按
- {
- if(long_key == FALSE)
- {
- long_key = TRUE;
- key_return = keyValue | TASK_KEY_LONG;
- }
- }
- else if(keyCounter == (KEY_LONG_TIMES + KEY_HOLD_TIMES)) //連按
- {
- key_return = keyValue | TASK_KEY_HOLD;
- keyCounter = KEY_LONG_TIMES;
- }
- }
- if(key_return != NO_KEY)
- {
- PutMsg(key_return);
- }
- TH1 = 0xf5;
- TL1 = 0x95;
- #endif
- }
復(fù)制代碼
程序:
3DLED貪吃蛇程序stc12c5a60s2.zip
(207.19 KB, 下載次數(shù): 11)
2020-11-24 09:02 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|
-
-
光立方原理圖.pdf
2020-11-26 10:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
97.12 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5
原理圖
|