|
本帖最后由 风铃草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信号调节LED亮度
- u8 xdata BRIGHT[3] = {BRIGHTNESS0,BRIGHTNESS0,BRIGHTNESS0};// 3路亮度标志,分别改变3路PWM占空比
- u8 xdata BrightnessTAB[6] = {0,10,20,30,40,50};//亮度表
- #endif
- extern u8 pdata ARRAY3DLED[8][8];
- /********************************************/
- /*功能:系统初始化
- /*说明:
- /********************************************/
- void SystemInit()
- {
- #if 1
- WDT_CONTR &= 0xdf;//关看门狗
- #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口强推挽输出
- }
- /*******************消息池属性定义*******************/
- #define MSG_DEEPNESS 8
- u8 MSG_POOL[MSG_DEEPNESS];//16位深度消息池
- u8 inptr = 0,outptr = 0;
- /*************************************************************/
- /*************************************************************/
- /*功能:存放消息
- /*说明:推送一个消息到消息池
- /*************************************************************/
- void PutMsg(u8 msg)
- {
- EA = 0;//关总中断,防止中断重入
-
- MSG_POOL[inptr] = msg;
- inptr ++;
- if(inptr == MSG_DEEPNESS)
- inptr = 0;
-
- EA = 1;//开总中断
- }
- /*************************************************************/
- /*功能:获取消息
- /*说明:从消息池取出一个消息
- /*************************************************************/
- u8 GetMsg()
- {
- u8 msg;
-
- EA = 0;//关总中断,防止中断重入
-
- 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);//开机全亮1秒
- TurnOffAllLed();
- EffectMode = ALLLEDOFF;//MARQUEE1;//ALLLEDON;//ROTATION;//NUMOrCHARACTER;//RANDOMFLASH;//开机灯灭
- DisplayMode = NONE; //开机关闭自动切换
- 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://长按打开或关闭效果自动切换
- 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
- }
复制代码
程序:
3DLED贪吃蛇程序stc12c5a60s2.zip
(207.19 KB, 下载次数: 11)
|
|