📄 timer.lst
字号:
BB 9180 0060 LDS R24,c
BD 9190 0061 LDS R25,c+1
BF 9601 ADIW R24,1
C0 9390 0061 STS c+1,R25
C2 9380 0060 STS c,R24
(0073) if((PIND&HW)!=HW_OLD)
C4 9020 0072 LDS R2,HW_OLD
C6 B380 IN R24,0x10
C7 7084 ANDI R24,4
C8 1582 CP R24,R2
C9 F101 BEQ 0x00EA
(0074) {
(0075) HW_OLD=(PIND&HW);
CA B380 IN R24,0x10
CB 7084 ANDI R24,4
CC 9380 0072 STS HW_OLD,R24
(0076) m=c; //每次翻转将定时器中断的次数的值给m,用于记录电平状态的时间 ,m的值会跟随c的值不断更新
CE 9020 0060 LDS R2,c
D0 9030 0061 LDS R3,c+1
D2 9230 0063 STS m+1,R3
D4 9220 0062 STS m,R2
(0077) f++; //记录翻转的次数
D6 9180 0068 LDS R24,f
D8 9190 0069 LDS R25,f+1
DA 9601 ADIW R24,1
DB 9390 0069 STS f+1,R25
DD 9380 0068 STS f,R24
(0078) x=f;
DF 011C MOVW R2,R24
E0 9230 0065 STS x+1,R3
E2 9220 0064 STS x,R2
(0079) c=0;
E4 2422 CLR R2
E5 2433 CLR R3
E6 9230 0061 STS c+1,R3
E8 9220 0060 STS c,R2
(0080) }
(0081) if(x>3&&x%2==0) //发生第四次翻转时红外的脉冲数据开始有效
EA 9020 0064 LDS R2,x
EC 9030 0065 LDS R3,x+1
EE E083 LDI R24,3
EF E090 LDI R25,0
F0 1582 CP R24,R2
F1 0593 CPC R25,R3
F2 F008 BCS 0x00F4
F3 C04D RJMP 0x0141
F4 FC20 SBRC R2,0
F5 C04B RJMP 0x0141
(0082) {x=0;
F6 2422 CLR R2
F7 2433 CLR R3
F8 9230 0065 STS x+1,R3
FA 9220 0064 STS x,R2
(0083) flag++; //记录存入数组中某一数据的位数,存入8位时应该清零
FC 9180 0066 LDS R24,flag
FE 9190 0067 LDS R25,flag+1
100 9601 ADIW R24,1
101 9390 0067 STS flag+1,R25
103 9380 0066 STS flag,R24
(0084) IRCode[IRCON]<<=1;
105 E68C LDI R24,0x6C
106 E090 LDI R25,0
107 9020 006A LDS R2,IRCON
109 9030 006B LDS R3,IRCON+1
10B 0C22 LSL R2
10C 1C33 ROL R3
10D 0E28 ADD R2,R24
10E 1E39 ADC R3,R25
10F 01F1 MOVW R30,R2
110 8020 LDD R2,Z+0
111 8031 LDD R3,Z+1
112 0C22 LSL R2
113 1C33 ROL R3
114 8231 STD Z+1,R3
115 8220 STD Z+0,R2
(0085) if(m>12) IRCode[IRCON]|=0x01;//为1是左移后最后一位写1。m的值为一个范围,在7和16之间
116 E08C LDI R24,0xC
117 E090 LDI R25,0
118 9020 0062 LDS R2,m
11A 9030 0063 LDS R3,m+1
11C 1582 CP R24,R2
11D 0593 CPC R25,R3
11E F488 BCC 0x0130
11F E68C LDI R24,0x6C
120 E090 LDI R25,0
121 90A0 006A LDS R10,IRCON
123 90B0 006B LDS R11,IRCON+1
125 0CAA LSL R10
126 1CBB ROL R11
127 0EA8 ADD R10,R24
128 1EB9 ADC R11,R25
129 01F5 MOVW R30,R10
12A 8180 LDD R24,Z+0
12B 8191 LDD R25,Z+1
12C 6081 ORI R24,1
12D 8391 STD Z+1,R25
12E 8380 STD Z+0,R24
12F C011 RJMP 0x0141
(0086) else IRCode[IRCON]&=0XFE;
130 E68C LDI R24,0x6C
131 E090 LDI R25,0
132 90A0 006A LDS R10,IRCON
134 90B0 006B LDS R11,IRCON+1
136 0CAA LSL R10
137 1CBB ROL R11
138 0EA8 ADD R10,R24
139 1EB9 ADC R11,R25
13A 01F5 MOVW R30,R10
13B 8180 LDD R24,Z+0
13C 8191 LDD R25,Z+1
13D 7F8E ANDI R24,0xFE
13E 7090 ANDI R25,0
13F 8391 STD Z+1,R25
140 8380 STD Z+0,R24
(0087) //PORTB=m;
(0088) }
(0089) if(flag==8)
141 9180 0066 LDS R24,flag
143 9190 0067 LDS R25,flag+1
145 3088 CPI R24,0x8
146 E0E0 LDI R30,0
147 079E CPC R25,R30
148 F579 BNE 0x0178
(0090) {
(0091) flag=0;
149 2422 CLR R2
14A 2433 CLR R3
14B 9230 0067 STS flag+1,R3
14D 9220 0066 STS flag,R2
(0092) IRCON++; //存满一个数据后数组的指针要加一
14F 9180 006A LDS R24,IRCON
151 9190 006B LDS R25,IRCON+1
153 9601 ADIW R24,1
154 9390 006B STS IRCON+1,R25
156 9380 006A STS IRCON,R24
(0093) if(IRCON==4) //数组中的数据存满
158 3084 CPI R24,4
159 E0E0 LDI R30,0
15A 079E CPC R25,R30
15B F4E1 BNE 0x0178
(0094) {
(0095)
(0096) IRCON=0;
15C 9230 006B STS IRCON+1,R3
15E 9220 006A STS IRCON,R2
(0097) uart0_init(); //开始向串口发送数据
160 DEEC RCALL _uart0_init
(0098) for(j=0;j<4;j++)
161 2744 CLR R20
162 C00B RJMP 0x016E
(0099) {
(0100) sendchar(IRCode[j]);
163 E68C LDI R24,0x6C
164 E090 LDI R25,0
165 2FE4 MOV R30,R20
166 27FF CLR R31
167 0FEE LSL R30
168 1FFF ROL R31
169 0FE8 ADD R30,R24
16A 1FF9 ADC R31,R25
16B 8100 LDD R16,Z+0
16C DEEB RCALL _sendchar
16D 9543 INC R20
16E 3044 CPI R20,4
16F F398 BCS 0x0163
(0101) //PORTB=IRCode[0];
(0102) }
(0103) f=0;
170 2422 CLR R2
171 2433 CLR R3
172 9230 0069 STS f+1,R3
174 9220 0068 STS f,R2
(0104) // delay_nms(1000);
(0105) // TIMSK = 0x00; //关定时器中断
(0106) GICR=0X40; //开外部中断
176 E480 LDI R24,0x40
177 BF8B OUT 0x3B,R24
(0107) }
(0108)
(0109)
(0110) }
(0111) TCCR0 = 0x02;
178 E082 LDI R24,2
179 BF83 OUT 0x33,R24
(0112) TIMSK = 0x02;
17A BF89 OUT 0x39,R24
17B D02A RCALL pop_xgset300C
17C 9009 LD R0,Y+
17D BE0F OUT 0x3F,R0
17E 91F9 LD R31,Y+
17F 91E9 LD R30,Y+
180 91B9 LD R27,Y+
181 91A9 LD R26,Y+
182 9199 LD R25,Y+
183 9189 LD R24,Y+
184 9139 LD R19,Y+
185 9129 LD R18,Y+
186 9119 LD R17,Y+
187 9109 LD R16,Y+
188 9099 LD R9,Y+
189 9089 LD R8,Y+
18A 9079 LD R7,Y+
18B 9069 LD R6,Y+
18C 9059 LD R5,Y+
18D 9049 LD R4,Y+
18E 9039 LD R3,Y+
18F 9029 LD R2,Y+
190 9019 LD R1,Y+
191 9009 LD R0,Y+
192 9518 RETI
(0113) }
(0114)
(0115) void init_devices_timer0(void)
(0116) {
(0117) CLI();
_init_devices_timer0:
193 94F8 BCLR 7
(0118) timer0_init();
194 DF01 RCALL _timer0_init
(0119) TIMSK = 0x02; //开定时器中断
195 E082 LDI R24,2
196 BF89 OUT 0x39,R24
(0120) SEI();
197 9478 BSET 7
198 9508 RET
(0121) }
(0122)
(0123)
(0124) void main(void)
(0125) {
(0126) DDRD&=~BIT(0);
_main:
199 9888 CBI 0x11,0
(0127) DDRD|=BIT(1);
19A 9A89 SBI 0x11,1
(0128) DDRD&=~BIT(2);
19B 988A CBI 0x11,2
(0129) DDRB=0XFF;
19C EF8F LDI R24,0xFF
19D BB87 OUT 0x17,R24
(0130) init_devices_int0();
19E DEEE RCALL _init_devices_int0
(0131) while(1);
FILE: <library>
19F CFFF RJMP 0x019F
1A0 9508 RET
push_xgset300C:
1A1 935A ST R21,-Y
1A2 934A ST R20,-Y
1A3 92BA ST R11,-Y
1A4 92AA ST R10,-Y
1A5 9508 RET
pop_xgset300C:
1A6 90A9 LD R10,Y+
1A7 90B9 LD R11,Y+
1A8 9149 LD R20,Y+
1A9 9159 LD R21,Y+
1AA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -