📄 lyj.lis
字号:
.module LYJ.c
.area text(rom, con, rel)
0000 .dbfile D:\IccAvr\Pei\LYJ\LYJ.c
0000 .dbfunc e PortInit _PortInit fV
.even
0000 _PortInit::
0000 .dbline -1
0000 .dbline 49
0000 ; //ICC-AVR application builder : 2006-2-26 21:26:27
0000 ; // Target : 电动晾衣架 DC电机+红外
0000 ; // Crystal: 8Mhz
0000 ;
0000 ; /*红外解码的方法 NEC格式 upd6121
0000 ; 1、9Ms的高电平启动头,然后是4.5Ms的低电平,如果2.25Ms时就有高电平,是持续信号,不处理
0000 ; 2、然后以一个高电平和一个低电平为1Bit,高电平时间是0.5625Ms=562us,
0000 ; 高低电平时间比为1:1时是Bit1,比为1:3时是Bit0
0000 ; 3、Timer1中断执行100us采样周期,9Ms=90,4.5Ms=45,高电平=5,低电平最多15
0000 ; 4、共读入4Byte共24bit,第1、2Byte是CustomCode码和其反码,第3、4Byte是DataCode和其反码
0000 ; 5、CustomCode正确和DataCode效验正确的话,执行
0000 ; 6、红外接收器输出是反相的
0000 ; */
0000 ; #include <eeprom.h>
0000 ; #include "config.h"
0000 ; #include <string.h>
0000 ;
0000 ; #define VERSION 10
0000 ;
0000 ; #define CT1H 0x94;//CA01=10ms 最小应答间隔
0000 ; #define CT1L 0x01;//BF34=12ms AF01=15ms 9401=20ms
0000 ;
0000 ; #define T0N 10
0000 ; #define LEDON CLR(PORTB,LED);
0000 ; #define LEDOFF SET(PORTB,LED);
0000 ;
0000 ; #define CSTOP 1
0000 ; #define CUP 2
0000 ; #define CDOWN 3
0000 ; #define CLAMP 4
0000 ; #define CDIS 5
0000 ;
0000 ; //红外命令按键码
0000 ; #define IRSTOP 10
0000 ; #define IRUP 11
0000 ; #define IRDOWN 7
0000 ; #define IRLAMP 2
0000 ; #define IRDIS 14
0000 ;
0000 ; bit b20ms,bTimer,bCmdOk,bIrCmdOk;
0000 ; uchar T0Cnt,iCmd;
0000 ; uchar iPreBit,iHight,iLow,iIrMode;
0000 ; uchar iBitCount,iIrData[4];
0000 ;
0000 ; void DelayMs(char);
0000 ; void DelayUs(uint);
0000 ;
0000 ; void PortInit(void)
0000 ; {
0000 .dbline 50
0000 ; PORTB = 0xFD;
0000 8DEF ldi R24,253
0002 88BB out 0x18,R24
0004 .dbline 51
0004 ; DDRB = 0x02;
0004 82E0 ldi R24,2
0006 87BB out 0x17,R24
0008 .dbline 52
0008 ; PORTC = 0x00; //m103 output only
0008 2224 clr R2
000A 25BA out 0x15,R2
000C .dbline 53
000C ; DDRC = 0x7F;
000C 8FE7 ldi R24,127
000E 84BB out 0x14,R24
0010 .dbline 54
0010 ; PORTD = 0x9F;
0010 8FE9 ldi R24,159
0012 82BB out 0x12,R24
0014 .dbline 55
0014 ; DDRD = 0x60;
0014 80E6 ldi R24,96
0016 81BB out 0x11,R24
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbend
001A .dbfunc e WdtInit _WdtInit fV
.even
001A _WdtInit::
001A .dbline -1
001A .dbline 62
001A ;
001A ; }
001A ;
001A ; //Watchdog initialize
001A ; // prescale: 2048K
001A ; void WdtInit(void)
001A ; {
001A .dbline 63
001A ; WDR();
001A A895 wdr
001C .dbline 64
001C ; WDTCR=(1<<WDTOE)|(1<<WDE);//!!注意:M8的WDT修改要先WDTOE,WDE=1 P42
001C 88E1 ldi R24,24
001E 81BD out 0x21,R24
0020 .dbline 65
0020 ; WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);//2.2s
0020 8FE0 ldi R24,15
0022 81BD out 0x21,R24
0024 .dbline -2
0024 L2:
0024 .dbline 0 ; func end
0024 0895 ret
0026 .dbend
0026 .dbfunc e Timer0Init _Timer0Init fV
.even
0026 _Timer0Init::
0026 .dbline -1
0026 .dbline 69
0026 ; }
0026 ;
0026 ; void Timer0Init(void)
0026 ; {
0026 .dbline 70
0026 ; TCCR0 = 0x00; //stop
0026 2224 clr R2
0028 23BE out 0x33,R2
002A .dbline 71
002A ; TCNT0 = 0x64; //set count
002A 84E6 ldi R24,100
002C 82BF out 0x32,R24
002E .dbline 72
002E ; TCCR0 = 0x05; //start timer
002E 85E0 ldi R24,5
0030 83BF out 0x33,R24
0032 .dbline -2
0032 L3:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
.area vector(rom, abs)
.org 18
0012 1AC0 rjmp _Timer0
.area text(rom, con, rel)
0034 .dbfile D:\IccAvr\Pei\LYJ\LYJ.c
0034 .dbfunc e Timer0 _Timer0 fV
.even
0034 _Timer0::
0034 00D0 rcall push_lset
0036 .dbline -1
0036 .dbline 77
0036 ; }
0036 ;
0036 ; #pragma interrupt_handler Timer0:10
0036 ; void Timer0(void)
0036 ; {
0036 .dbline 78
0036 ; TCNT0 = 0x64; //reload counter value 20ms
0036 84E6 ldi R24,100
0038 82BF out 0x32,R24
003A .dbline 80
003A ;
003A ; b20ms=1;
003A 81E0 ldi R24,1
003C 80930E00 sts _b20ms,R24
0040 .dbline 81
0040 ; if (--T0Cnt==0)
0040 80910A00 lds R24,_T0Cnt
0044 8150 subi R24,1
0046 282E mov R2,R24
0048 20920A00 sts _T0Cnt,R2
004C 8823 tst R24
004E 31F4 brne L5
0050 .dbline 82
0050 ; {T0Cnt=T0N;
0050 .dbline 82
0050 8AE0 ldi R24,10
0052 80930A00 sts _T0Cnt,R24
0056 .dbline 83
0056 ; bTimer=1;
0056 81E0 ldi R24,1
0058 80930D00 sts _bTimer,R24
005C .dbline 84
005C ; }
005C L5:
005C .dbline 86
005C ;
005C ; CheckStop();//判断限位开关
005C C5D1 rcall _CheckStop
005E .dbline -2
005E L4:
005E 00D0 rcall pop_lset
0060 .dbline 0 ; func end
0060 1895 reti
0062 .dbend
0062 .dbfunc e Timer1Init _Timer1Init fV
.even
0062 _Timer1Init::
0062 .dbline -1
0062 .dbline 94
0062 ;
0062 ; }
0062 ; //TIMER1 initialize - prescale:8
0062 ; // WGM: 0) Normal, TOP=0xFFFF
0062 ; // desired value: 100uSec
0062 ; // actual value: 100.000uSec (0.0%)
0062 ; void Timer1Init(void)
0062 ; {
0062 .dbline 95
0062 ; TCCR1B = 0x00; //stop
0062 2224 clr R2
0064 2EBC out 0x2e,R2
0066 .dbline 96
0066 ; TCNT1H = 0xFF; //setup
0066 8FEF ldi R24,255
0068 8DBD out 0x2d,R24
006A .dbline 97
006A ; TCNT1L = 0x9C;
006A 8CE9 ldi R24,156
006C 8CBD out 0x2c,R24
006E .dbline 98
006E ; OCR1AH = 0x00;
006E 2BBC out 0x2b,R2
0070 .dbline 99
0070 ; OCR1AL = 0x64;
0070 84E6 ldi R24,100
0072 8ABD out 0x2a,R24
0074 .dbline 100
0074 ; OCR1BH = 0x00;
0074 29BC out 0x29,R2
0076 .dbline 101
0076 ; OCR1BL = 0x64;
0076 88BD out 0x28,R24
0078 .dbline 102
0078 ; ICR1H = 0x00;
0078 27BC out 0x27,R2
007A .dbline 103
007A ; ICR1L = 0x64;
007A 86BD out 0x26,R24
007C .dbline 104
007C ; TCCR1A = 0x00;
007C 2FBC out 0x2f,R2
007E .dbline 105
007E ; TCCR1B = 0x02; //start Timer
007E 82E0 ldi R24,2
0080 8EBD out 0x2e,R24
0082 .dbline -2
0082 L7:
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbend
.area vector(rom, abs)
.org 16
0010 42C0 rjmp _Timer1
.area text(rom, con, rel)
0084 .dbfile D:\IccAvr\Pei\LYJ\LYJ.c
0084 .dbfunc e Timer1 _Timer1 fV
.even
0084 _Timer1::
0084 00D0 rcall push_lset
0086 .dbline -1
0086 .dbline 110
0086 ; }
0086 ;
0086 ; #pragma interrupt_handler Timer1:9
0086 ; void Timer1(void)
0086 ; {
0086 .dbline 112
0086 ; //TIMER1 has overflowed
0086 ; TCNT1H = 0xFF; //reload counter high value
0086 8FEF ldi R24,255
0088 8DBD out 0x2d,R24
008A .dbline 113
008A ; TCNT1L = 0x9C; //reload counter low value
008A 8CE9 ldi R24,156
008C 8CBD out 0x2c,R24
008E .dbline 115
008E ;
008E ; CheckIR();//红外解码
008E 8BD0 rcall _CheckIR
0090 .dbline -2
0090 L8:
0090 00D0 rcall pop_lset
0092 .dbline 0 ; func end
0092 1895 reti
0094 .dbend
0094 .dbfunc e IoInit _IoInit fV
.even
0094 _IoInit::
0094 .dbline -1
0094 .dbline 120
0094 ; }
0094 ;
0094 ; //call this routine to initialize all peripherals
0094 ; void IoInit(void)
0094 ; {
0094 .dbline 122
0094 ; //stop errant interrupts until set up
0094 ; CLI(); //disable all interrupts
0094 F894 cli
0096 .dbline 123
0096 ; PortInit();
0096 B4DF rcall _PortInit
0098 .dbline 124
0098 ; WdtInit();
0098 C0DF rcall _WdtInit
009A .dbline 125
009A ; Timer0Init();
009A C5DF rcall _Timer0Init
009C .dbline 126
009C ; Timer1Init();
009C E2DF rcall _Timer1Init
009E .dbline 129
009E ; //ADCSR&=~BIT(ADEN);
009E ;
009E ; MCUCR = 0x00;//int0 low level在掉电模式,低电平触发才能唤醒,下跳沿不行
009E 2224 clr R2
00A0 25BE out 0x35,R2
00A2 .dbline 130
00A2 ; GICR = 0x00;//Int Mask,Int0 disable
00A2 2BBE out 0x3b,R2
00A4 .dbline 131
00A4 ; TIMSK = 0x05; //timer interrupt Mask: Timer0,1 enable
00A4 85E0 ldi R24,5
00A6 89BF out 0x39,R24
00A8 .dbline 132
00A8 ; SEI(); //re-enable interrupts
00A8 7894 sei
00AA .dbline -2
00AA L9:
00AA .dbline 0 ; func end
00AA 0895 ret
00AC .dbend
00AC .dbfunc e WdtOn _WdtOn fV
.even
00AC _WdtOn::
00AC .dbline -1
00AC .dbline 138
00AC ; //all peripherals are now initialized
00AC ; }
00AC ;
00AC ;
00AC ; void WdtOn()
00AC ; {
00AC .dbline 139
00AC ; WDR();
00AC A895 wdr
00AE .dbline 140
00AE ; WDTCR=0x0f;
00AE 8FE0 ldi R24,15
00B0 81BD out 0x21,R24
00B2 .dbline -2
00B2 L10:
00B2 .dbline 0 ; func end
00B2 0895 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -