?? lyj.lst
字號(hào):
__start:
__text_start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36EF CPI R30,0x6F
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D07A RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: D:\IccAvr\Pei\LYJ\LYJ.c
(0001) //ICC-AVR application builder : 2006-2-26 21:26:27
(0002) // Target : 電動(dòng)晾衣架 DC電機(jī)+紅外
(0003) // Crystal: 8Mhz
(0004)
(0005) /*紅外解碼的方法 NEC格式 upd6121
(0006) 1、9Ms的高電平啟動(dòng)頭,然后是4.5Ms的低電平,如果2.25Ms時(shí)就有高電平,是持續(xù)信號(hào),不處理
(0007) 2、然后以一個(gè)高電平和一個(gè)低電平為1Bit,高電平時(shí)間是0.5625Ms=562us,
(0008) 高低電平時(shí)間比為1:1時(shí)是Bit1,比為1:3時(shí)是Bit0
(0009) 3、Timer1中斷執(zhí)行100us采樣周期,9Ms=90,4.5Ms=45,高電平=5,低電平最多15
(0010) 4、共讀入4Byte共24bit,第1、2Byte是CustomCode碼和其反碼,第3、4Byte是DataCode和其反碼
(0011) 5、CustomCode正確和DataCode效驗(yàn)正確的話,執(zhí)行
(0012) 6、紅外接收器輸出是反相的
(0013) */
(0014) #include <eeprom.h>
(0015) #include "config.h"
(0016) #include <string.h>
(0017)
(0018) #define VERSION 10
(0019)
(0020) #define CT1H 0x94;//CA01=10ms 最小應(yīng)答間隔
(0021) #define CT1L 0x01;//BF34=12ms AF01=15ms 9401=20ms
(0022)
(0023) #define T0N 10
(0024) #define LEDON CLR(PORTB,LED);
(0025) #define LEDOFF SET(PORTB,LED);
(0026)
(0027) #define CSTOP 1
(0028) #define CUP 2
(0029) #define CDOWN 3
(0030) #define CLAMP 4
(0031) #define CDIS 5
(0032)
(0033) //紅外命令按鍵碼
(0034) #define IRSTOP 10
(0035) #define IRUP 11
(0036) #define IRDOWN 7
(0037) #define IRLAMP 2
(0038) #define IRDIS 14
(0039)
(0040) bit b20ms,bTimer,bCmdOk,bIrCmdOk;
(0041) uchar T0Cnt,iCmd;
(0042) uchar iPreBit,iHight,iLow,iIrMode;
(0043) uchar iBitCount,iIrData[4];
(0044)
(0045) void DelayMs(char);
(0046) void DelayUs(uint);
(0047)
(0048) void PortInit(void)
(0049) {
(0050) PORTB = 0xFD;
_PortInit:
0033 EF8D LDI R24,0xFD
0034 BB88 OUT 0x18,R24
(0051) DDRB = 0x02;
0035 E082 LDI R24,2
0036 BB87 OUT 0x17,R24
(0052) PORTC = 0x00; //m103 output only
0037 2422 CLR R2
0038 BA25 OUT 0x15,R2
(0053) DDRC = 0x7F;
0039 E78F LDI R24,0x7F
003A BB84 OUT 0x14,R24
(0054) PORTD = 0x9F;
003B E98F LDI R24,0x9F
003C BB82 OUT 0x12,R24
(0055) DDRD = 0x60;
003D E680 LDI R24,0x60
003E BB81 OUT 0x11,R24
003F 9508 RET
(0056)
(0057) }
(0058)
(0059) //Watchdog initialize
(0060) // prescale: 2048K
(0061) void WdtInit(void)
(0062) {
(0063) WDR();
_WdtInit:
0040 95A8 WDR
(0064) WDTCR=(1<<WDTOE)|(1<<WDE);//!!注意:M8的WDT修改要先WDTOE,WDE=1 P42
0041 E188 LDI R24,0x18
0042 BD81 OUT 0x21,R24
(0065) WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);//2.2s
0043 E08F LDI R24,0xF
0044 BD81 OUT 0x21,R24
0045 9508 RET
(0066) }
(0067)
(0068) void Timer0Init(void)
(0069) {
(0070) TCCR0 = 0x00; //stop
_Timer0Init:
0046 2422 CLR R2
0047 BE23 OUT 0x33,R2
(0071) TCNT0 = 0x64; //set count
0048 E684 LDI R24,0x64
0049 BF82 OUT 0x32,R24
(0072) TCCR0 = 0x05; //start timer
004A E085 LDI R24,5
004B BF83 OUT 0x33,R24
004C 9508 RET
_Timer0:
004D D279 RCALL push_lset
(0073) }
(0074)
(0075) #pragma interrupt_handler Timer0:10
(0076) void Timer0(void)
(0077) {
(0078) TCNT0 = 0x64; //reload counter value 20ms
004E E684 LDI R24,0x64
004F BF82 OUT 0x32,R24
(0079)
(0080) b20ms=1;
0050 E081 LDI R24,1
0051 9380006E STS b20ms,R24
(0081) if (--T0Cnt==0)
0053 9180006A LDS R24,T0Cnt
0055 5081 SUBI R24,1
0056 2E28 MOV R2,R24
0057 9220006A STS T0Cnt,R2
0059 2388 TST R24
005A F431 BNE 0x0061
(0082) {T0Cnt=T0N;
005B E08A LDI R24,0xA
005C 9380006A STS T0Cnt,R24
(0083) bTimer=1;
005E E081 LDI R24,1
005F 9380006D STS bTimer,R24
(0084) }
(0085)
(0086) CheckStop();//判斷限位開關(guān)
0061 D1C5 RCALL _CheckStop
0062 D27B RCALL pop_lset
0063 9518 RETI
(0087)
(0088) }
(0089) //TIMER1 initialize - prescale:8
(0090) // WGM: 0) Normal, TOP=0xFFFF
(0091) // desired value: 100uSec
(0092) // actual value: 100.000uSec (0.0%)
(0093) void Timer1Init(void)
(0094) {
(0095) TCCR1B = 0x00; //stop
_Timer1Init:
0064 2422 CLR R2
0065 BC2E OUT 0x2E,R2
(0096) TCNT1H = 0xFF; //setup
0066 EF8F LDI R24,0xFF
0067 BD8D OUT 0x2D,R24
(0097) TCNT1L = 0x9C;
0068 E98C LDI R24,0x9C
0069 BD8C OUT 0x2C,R24
(0098) OCR1AH = 0x00;
006A BC2B OUT 0x2B,R2
(0099) OCR1AL = 0x64;
006B E684 LDI R24,0x64
006C BD8A OUT 0x2A,R24
(0100) OCR1BH = 0x00;
006D BC29 OUT 0x29,R2
(0101) OCR1BL = 0x64;
006E BD88 OUT 0x28,R24
(0102) ICR1H = 0x00;
006F BC27 OUT 0x27,R2
(0103) ICR1L = 0x64;
0070 BD86 OUT 0x26,R24
(0104) TCCR1A = 0x00;
0071 BC2F OUT 0x2F,R2
(0105) TCCR1B = 0x02; //start Timer
0072 E082 LDI R24,2
0073 BD8E OUT 0x2E,R24
0074 9508 RET
_Timer1:
0075 D251 RCALL push_lset
(0106) }
(0107)
(0108) #pragma interrupt_handler Timer1:9
(0109) void Timer1(void)
(0110) {
(0111) //TIMER1 has overflowed
(0112) TCNT1H = 0xFF; //reload counter high value
0076 EF8F LDI R24,0xFF
0077 BD8D OUT 0x2D,R24
(0113) TCNT1L = 0x9C; //reload counter low value
0078 E98C LDI R24,0x9C
0079 BD8C OUT 0x2C,R24
(0114)
(0115) CheckIR();//紅外解碼
007A D08B RCALL _CheckIR
007B D262 RCALL pop_lset
007C 9518 RETI
(0116) }
(0117)
(0118) //call this routine to initialize all peripherals
(0119) void IoInit(void)
(0120) {
(0121) //stop errant interrupts until set up
(0122) CLI(); //disable all interrupts
_IoInit:
007D 94F8 BCLR 7
(0123) PortInit();
007E DFB4 RCALL _PortInit
(0124) WdtInit();
007F DFC0 RCALL _WdtInit
(0125) Timer0Init();
0080 DFC5 RCALL _Timer0Init
(0126) Timer1Init();
0081 DFE2 RCALL _Timer1Init
(0127) //ADCSR&=~BIT(ADEN);
(0128)
(0129) MCUCR = 0x00;//int0 low level在掉電模式,低電平觸發(fā)才能喚醒,下跳沿不行
0082 2422 CLR R2
0083 BE25 OUT 0x35,R2
(0130) GICR = 0x00;//Int Mask,Int0 disable
0084 BE2B OUT 0x3B,R2
(0131) TIMSK = 0x05; //timer interrupt Mask: Timer0,1 enable
0085 E085 LDI R24,5
0086 BF89 OUT 0x39,R24
(0132) SEI(); //re-enable interrupts
0087 9478 BSET 7
0088 9508 RET
(0133) //all peripherals are now initialized
(0134) }
(0135)
(0136)
(0137) void WdtOn()
(0138) {
(0139) WDR();
_WdtOn:
0089 95A8 WDR
(0140) WDTCR=0x0f;
008A E08F LDI R24,0xF
008B BD81 OUT 0x21,R24
008C 9508 RET
(0141)
(0142) }
(0143)
(0144) void WdtOff()
(0145) {
(0146) CLI();//!!必須,WDTOE置位后必須4個(gè)時(shí)鐘內(nèi)清 WDE,才能真正關(guān)斷WDT
_WdtOff:
008D 94F8 BCLR 7
(0147) WDR();
008E 95A8 WDR
(0148) WDTCR |=(BIT(WDTOE)|(BIT(WDE)));
008F B581 IN R24,0x21
0090 6188 ORI R24,0x18
0091 BD81 OUT 0x21,R24
(0149) //WDTCR&=~BIT(WDE);//0;//off
(0150) WDTCR=0x07;
0092 E087 LDI R24,7
0093 BD81 OUT 0x21,R24
(0151) SEI();
0094 9478 BSET 7
0095 9508 RET
(0152) }
(0153)
(0154) void PwrIdle()
(0155) {//P30 MCUCR 休眠控制和INT0,1,
(0156) MCUCR&=0x0f;
_PwrIdle:
0096 B785 IN R24,0x35
0097 708F ANDI R24,0xF
0098 BF85 OUT 0x35,R24
(0157) MCUCR |=BIT(SE);
0099 B785 IN R24,0x35
009A 6880 ORI R24,0x80
009B BF85 OUT 0x35,R24
(0158) asm("sleep");
009C 9588 SLEEP
009D 9508 RET
(0159) }
(0160)
(0161) void PwrDown()
(0162) {
(0163) MCUCR&=0x0f;
_PwrDown:
009E B785 IN R24,0x35
009F 708F ANDI R24,0xF
00A0 BF85 OUT 0x35,R24
(0164) MCUCR |=0x60;//0x60掉電 0x70省電
00A1 B785 IN R24,0x35
00A2 6680 ORI R24,0x60
00A3 BF85 OUT 0x35,R24
(0165) asm("sleep");
00A4 9588 SLEEP
00A5 9508 RET
(0166) }
(0167)
(0168) //測(cè)試紅外輸出
(0169) //無(wú)信號(hào)時(shí)有小許干擾輸出,遙控器保持按鍵時(shí)有持續(xù)輸出
(0170) void TestIR()
(0171) {
(0172) if ((PIND&(1<<IR))!=0)
_TestIR:
00A6 9B87 SBIS 0x10,7
00A7 C002 RJMP 0x00AA
(0173) {BeepOff();}
00A8 D1AD RCALL _BeepOff
00A9 C001 RJMP 0x00AB
(0174) else
(0175) {BeepOn();}
00AA D1A9 RCALL _BeepOn
00AB 9508 RET
(0176)
(0177) }
(0178)
(0179) void main(void)
(0180) {
(0181)
(0182) IoInit();
_main:
00AC DFD0 RCALL _IoInit
(0183) SystemIni();
00AD D1D6 RCALL _SystemIni
(0184) Beep();
00AE D1A9 RCALL _Beep
00AF C010 RJMP 0x00C0
(0185) while (1)
(0186) {
(0187) if (bTimer) TimerFunc();
00B0 9020006D LDS R2,bTimer
00B2 2022 TST R2
00B3 F009 BEQ 0x00B5
00B4 D17B RCALL _TimerFunc
(0188) //TestIR();
(0189) if (bIrCmdOk) CheckIrCmd();
00B5 9020006B LDS R2,bIrCmdOk
00B7 2022 TST R2
00B8 F009 BEQ 0x00BA
00B9 D11B RCALL _CheckIrCmd
(0190) if (bCmdOk) ReadCmd();
00BA 9020006C LDS R2,bCmdOk
00BC 2022 TST R2
00BD F009 BEQ 0x00BF
00BE D003 RCALL _ReadCmd
(0191) PwrIdle();
00BF DFD6 RCALL _PwrIdle
00C0 CFEF RJMP 0x00B0
(0192) };
00C1 9508 RET
_ReadCmd:
00C2 D1ED RCALL push_gset1
(0193)
(0194) }
(0195)
(0196) //命令執(zhí)行
(0197) void ReadCmd()
(0198) {
(0199) bCmdOk=0;
00C3 2422 CLR R2
00C4 9220006C STS bCmdOk,R2
(0200) //Beep();
(0201) switch (iCmd)
00C6 91400069 LDS R20,iCmd
00C8 2755 CLR R21
00C9 3041 CPI R20,1
00CA E0E0 LDI R30,0
00CB 075E CPC R21,R30
00CC F089 BEQ 0x00DE
00CD 3042 CPI R20,2
00CE E0E0 LDI R30,0
00CF 075E CPC R21,R30
00D0 F091 BEQ 0x00E3
00D1 3043 CPI R20,3
00D2 E0E0 LDI R30,0
00D3 075E CPC R21,R30
00D4 F099 BEQ 0x00E8
00D5 3044 CPI R20,4
00D6 E0E0 LDI R30,0
00D7 075E CPC R21,R30
00D8 F0A1 BEQ 0x00ED
00D9 3045 CPI R20,5
00DA E0E0 LDI R30,0
00DB 075E CPC R21,R30
00DC F0E1 BEQ 0x00F9
00DD C026 RJMP 0x0104
(0202) {
(0203) case CSTOP:
(0204) MotorStop();
00DE D160 RCALL _MotorStop
(0205) BeepN(2);
00DF E002 LDI R16,2
00E0 E010 LDI R17,0
00E1 D17B RCALL _BeepN
(0206) break;
00E2 C021 RJMP 0x0104
(0207) case CUP:
(0208) MotorUp();
00E3 D155 RCALL _MotorUp
(0209) BeepN(1);
00E4 E001 LDI R16,1
00E5 E010 LDI R17,0
00E6 D176 RCALL _BeepN
(0210) break;
00E7 C01C RJMP 0x0104
(0211) case CDOWN:
(0212) MotorDown();
00E8 D153 RCALL _MotorDown
(0213) BeepN(1);
00E9 E001 LDI R16,1
00EA E010 LDI R17,0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -