我自己用icc+M16寫的一個led顯示+紅外線解碼程序
一個特別功能 也是他們常用的功能 按鍵處理程序 按一下只變一個數 按住1s左右(自己設置)快速變化 進一步的功能正開發中 下一步 就是3771+39610 步進電機驅動程序 希望大家多多支持哦! 哦對了 里面的圖片是用flash8做的 原理圖是用protues6.9 畫的 仿真上有點問題 實際電路中 是正常的
單片機源碼:
- /*
- 01-05 22:30 2007-1-6 23:04
- infrared
- //ICC-AVR application builder : 2006-12-16 0:17:05 2006-12-18 20:04 IR_CDOE
- // Target : M16
- // Crystal: 16.000Mhz //注冊大小寫識別 開始必須為字母 紅外線
- */
- #include <iom16v.h>
- #include <macros.h>
- #include "led.h"
- #include "IR_DATA.H"
- #define IR 6
- //#include "delay.h"
- //用戶碼
- #define CUSTOMCODE 9
- //按鍵碼
- #define POWER_ON 221
- #define STAND_BY 220
- #define DMX 216
- #define AUTO 212
- #define AUDIO 208
- #define FADETIME_UP 217
- #define FADETIME_DOWN 209
- #define PATTERN_UP 218
- #define PATTERN_DOWN 210
- // 值 0 1 10 11 12 13 14 15
- // 0 1 2 3 4 5 6 7 8 9 d f
- char LED_DATA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xa1,0X0e,0x00,0xff,0xef,0x3f}; //11 FOR "d"
- char iPos,iPreBit,iNowBit,iHight,iLow,iIrMode,iBitCount,bIrCmdOk,bCmdOk,iCmd,iIrData[6];
- char JS_001=0,JS_002=0;
- long JS_003=0;
- char JS_004=0;
- char JS_005=0;
- char JS_006=0;
- char JS_007=0;
- char JS_008=0;
- long TIMER1_ICP_T,TIMER1_ICP_T1,TIMER1_ICP_T2;
- char LED_DISPLAY_V1=10; // 初始值 顯示 為 d001
- char LED_DISPLAY_V2=0;
- char LED_DISPLAY_V3=0;
- char LED_DISPLAY_V4=1;
- char LED_DISPLAY_V5=14;
- long JS_PRESS_ON_UP=0;
- long JS_PRESS_ON_DOWN=0;
- char JS_TIMER1_ICP_INPUT=0;
- char OUT_22_LOW;
- char JS_PRESS_ON_UP_1=0;
- char JS_PRESS_ON_UP_10000=0;
- char JS_PRESS_DWON_ON_1=0;
- char JS_PRESS_ON_DOWN_10000=0;
- int JS_PRESS_ON_UP_FAST=0;
- int JS_PRESS_OFF_UP=0;
- char JS_MODE_MODE=0;
- char JS_MENU_MODE=0;
- char JS_UP_MODE=0;
- char JS_DOWN_MODE=0;
- int JS_PRESS_OFF_DOWN;
- int JS_PRESS_ON_DOWN_FAST;
- char JS_PRESS_DOWN_ON_1;
- char ICP_TIME=0,ICP_TIME_T1=0;
- char START_ICP_JS_TLOW=0;
- char ICP_INT_SN=0; //ICP 產生中斷標志位
- char KEY_BANK=0;
- char KEY_PAN_MODE_1=0;
- char KEY_PAN_MODE_2=0;
- char KEY_PAN_MODE_3=0;
- char KEY_PAN_3=0;
- char KEY_PAN_4=0;
- char KEY_PAN_5=0;
- char KEY_PAN_6=0;
- char KEY_PAN_7=0;
- char KEY_PAN_8=0;
- char PAN_ICP_INPUT_CHECK=0,JS_ICP_INT=0;
- char N_001=1,SUM=0;
- char IR_CUSTOM_CODE=0;IR_DATA_CODE=0;
- // 共陽極用
- void port_init(void)
- {
- PORTA = 0xFF;
- DDRA = 0xFF;
- PORTB = 0x1F;
- DDRB = 0x1F;
- PORTC = 0x1F; //m103 output only
- DDRC = 0x10;
- PORTD = 0x00;
- DDRD = 0x00;
- }
- //Watchdog initialize
- // prescale: 16K
- //void watchdog_init(void)
- //{
- //WDR(); //this prevents a timout on enabling
- //WDTCR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
- //}
- //Watchdog initialize
- // prescale: 2048K
- void watchdog_init(void)
- {
- WDR(); //this prevents a timout on enabling
- WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
- }
- #pragma interrupt_handler eeprom_ready_isr:16
- void eeprom_ready_isr(void)
- {
- //eeprom ready event
- }
- /////////////////////////TIMER0/////////////////////////////////////////////////////////////
- //TIMER0 initialize - prescale:8
- // WGM: Normal
- // desired value: 100uSec
- // actual value: 100.000uSec (0.0%)
- void timer0_init(void)
- {
- TCCR0 = 0x00; //stop
- TCNT0 = 0xCE; //set count
- OCR0 = 0x32; //set compare
- TCCR0 = 0x02; //start timer
- }
- #pragma interrupt_handler timer0_ovf_isr:10
- void timer0_ovf_isr(void)
- {
- TCNT0 = 0xCE; //reload counter value 100us
- LED_SCAN();
- KEY_CHK();
- CheckIR();
- JS_003=++JS_003; //KEY_CHECK
- TEST();
- //display_times(); //TEST USE
-
-
-
- }
- /////////////////test/////////////////////////////////////
- void TEST()
- {
- //LED_DISPLAY_V4=8; //TEST
- if (JS_003==10000)
- {
- LED_DISPLAY_V5=14;
-
- }
- else if (JS_003==20000)
- {
- JS_003=0;
- LED_DISPLAY_V5=13;
- }
- }
- /////////////////////////timer2///////////////////////////////////////////////////////////////////
- //TIMER2 initialize - prescale:32
- // WGM: Normal
- // desired value: 10uSec
- // actual value: 10.000uSec (0.0%)
- void timer2_init(void)
- {
- TCCR2 = 0x00; //stop
- ASSR = 0x00; //set async mode
- TCNT2 = 0xFB; //setup
- OCR2 = 0x05;
- TCCR2 = 0x03; //start
- }
- #pragma interrupt_handler timer2_ovf_isr:5
- void timer2_ovf_isr(void) //10us
- {
- TCNT2 = 0xFB; //reload counter value
- //ICP_INT_JS();
- //ICP_INT_CLR_JS();
- }
- /////////////////////////KEY_CHK/////////////////////////////////////////////////////////////
- void KEY_CHK()
- {
-
- KEY_CHK_MODE(); // 調用 KEY_CHK_MODE
- KEY_CHK_MENU(); // 調用 KEY_CHK_MENU
- KEY_CHK_UP(); // 調用 KEY_CHK_UP
- KEY_CHK_DOWN(); // 調用 KEY_CHK_DOWN
- }
- //////////////////////////MODE///////////////////////////////////////////////////////////
- void KEY_CHK_MODE() //100us /times
- {
- KEY_BANK=KEY_INPUT; // 取PINC值
- KEY_BANK&=0X01; // 取mode 值
- if (KEY_BANK==0) //有按下 執行
- { //TEST--------OK------------->>>>
- KEY_BANK=1;
- JS_004=++JS_004;
- if (JS_004==1)
- {
- //LED_DISPLAY_V1=11;
- LED_DISPLAY_V2=0;
- LED_DISPLAY_V3=0;
- LED_DISPLAY_V4=1;
- }
- else if (JS_004==2)
- {
- JS_004&=0;
- //LED_DISPLAY_V1=10;
- LED_DISPLAY_V2=0;
- LED_DISPLAY_V3=0;
- LED_DISPLAY_V4=1;
- }
- }
- else
- KEY_BANK=0;
-
- }
- void KEY_PRESS_CHECK_OFF()
- {
- KEY_BANK=KEY_INPUT; // 取PINC值
- KEY_BANK&=0X01;
- if (KEY_BANK==0) // V1有按下
- KEY_PAN_MODE_3=1;
- else // V1沒有按下
- KEY_PAN_MODE_3=0;
- }
- ///////////////////////////////MENU/////////////////////////////////////////////////////////////////
- void KEY_CHK_MENU()
- {
- }
- ///////////////////////////////UP///////////////////////////////////////////////////////////////////////
- void KEY_CHK_UP()
- {
- KEY_BANK=KEY_INPUT; // 取PINC值
- KEY_BANK=KEY_BANK>>2;
- KEY_BANK&=0X01; // 取DOWN 值
- if (KEY_BANK==0) //press on do it
- {
-
- JS_PRESS_OFF_UP==0;
-
- if (JS_PRESS_ON_UP_1==0) //press on yes first times
- {
- JS_PRESS_ON_UP_1=1;
- JS_PRESS_ON_UP=0;
- JS_PRESS_ON_UP_FAST=0;
- JS_PRESS_ON_UP_10000=0;
- LED_DISPLAY_UP_DMX512();
-
- // JS_UP_MODE=++JS_UP_MODE;
- // if (JS_UP_MODE==4)
- // JS_UP_MODE=0;
- }
- else
- {
- if (JS_PRESS_ON_UP_10000==1)
- {
- if (JS_PRESS_ON_UP_FAST==2000)
- {
- JS_PRESS_ON_UP_FAST=0;
- LED_DISPLAY_UP_DMX512();
- }
- else
- JS_PRESS_ON_UP_FAST=++JS_PRESS_ON_UP_FAST;
- }
-
- if (JS_PRESS_ON_UP==30000)
- {
- JS_PRESS_ON_UP=0;
- JS_PRESS_ON_UP_10000=1;
- }
- else
- JS_PRESS_ON_UP=++JS_PRESS_ON_UP;
- }
- }
- else //unpress
- {
- JS_PRESS_ON_UP=0;
- JS_PRESS_ON_UP_10000=0;
- JS_PRESS_ON_UP_FAST=0;
- JS_PRESS_OFF_UP=++JS_PRESS_OFF_UP;
- if (JS_PRESS_OFF_UP==2000)
- {
- JS_PRESS_ON_UP_1=0;
- JS_PRESS_OFF_UP=0;
- }
- }
-
- }
-
復制代碼
|