📄 coder.lst
字号:
(0208) OUTL;
0148 9897 CBI 0x12,7
(0209) }
0149 9029 LD R2,Y+
014A BE2F OUT 0x3F,R2
014B 91E9 LD R30,Y+
014C 9189 LD R24,Y+
014D 9119 LD R17,Y+
014E 9109 LD R16,Y+
014F 9029 LD R2,Y+
0150 9518 RETI
(0210)
(0211) }
(0212)
(0213)
(0214)
(0215) void Putchar (Uchar c)
(0216) {
(0217) while(!(UCSRA&(1<<UDRE)));
_Putchar:
c --> R16
0151 9B5D SBIS 0x0B,5
0152 CFFE RJMP _Putchar
(0218) UDR=c;
0153 B90C OUT 0x0C,R16
0154 9508 RET
_ReadADC:
int2 --> R20
int1 --> R22
channel --> R16
0155 D158 RCALL push_gset2
(0219) }
(0220)
(0221)
(0222) Uint ReadADC (Uchar channel)
(0223) {
(0224) Uint int1,int2;
(0225) ADMUX&=~0x1F;
0156 B187 IN R24,0x07
0157 7E80 ANDI R24,0xE0
0158 B987 OUT 0x07,R24
(0226) ADMUX|=channel;
0159 B027 IN R2,0x07
015A 2A20 OR R2,R16
015B B827 OUT 0x07,R2
(0227) ADCSRA|=0x40;
015C 9A36 SBI 0x06,6
(0228) while(~ADCSRA&0x10){}
015D B026 IN R2,0x06
015E 2433 CLR R3
015F 9420 COM R2
0160 9430 COM R3
0161 FC24 SBRC R2,4
0162 CFFA RJMP 0x015D
(0229) ADCSRA|=0x10;
0163 9A34 SBI 0x06,4
(0230) int2=ADCL;
0164 B144 IN R20,0x04
0165 2755 CLR R21
(0231) int1=ADCH;
0166 B165 IN R22,0x05
0167 2777 CLR R23
(0232) int1<<=8;
0168 2F76 MOV R23,R22
0169 2766 CLR R22
(0233) return (int1+int2);
016A 018B MOVW R16,R22
016B 0F04 ADD R16,R20
016C 1F15 ADC R17,R21
016D D138 RCALL pop_gset2
016E 9508 RET
_main:
warning_frequency --> R10
ledonof --> Y+13
warning_counter --> Y+12
battcheck --> Y+11
youmen --> R14
safedelay --> Y+10
safe --> Y+9
batt --> R22
checken --> Y+8
temp --> Y+0
counter --> R20
016F 972E SBIW R28,0xE
(0234) }
(0235)
(0236)
(0237) main()
(0238) {
(0239)
(0240) Uint batt;//电量
(0241) Uint temp[4];//滤波用
(0242) Uint youmen ;//油门缓存
(0243) Uchar counter ;//采集计数
(0244) Uchar safe=1,safedelay=0;//油门保护
0170 2400 CLR R0
0171 9403 INC R0
0172 8609 STD Y+9,R0
0173 2400 CLR R0
0174 860A STD Y+10,R0
(0245) Uchar warning_frequency;//警告频率
(0246) Uchar warning_counter=0;
0175 860C STD Y+12,R0
(0247) Uchar ledonof=0;
0176 860D STD Y+13,R0
(0248) Uchar battcheck=1;//检测电量许可
0177 2400 CLR R0
0178 9403 INC R0
0179 860B STD Y+11,R0
(0249) Uchar checken=200;//等待电压稳定
017A EC88 LDI R24,0xC8
017B 8788 STD Y+8,R24
(0250)
(0251) init_devices();
017C DF6E RCALL _init_devices
017D C125 RJMP 0x02A3
(0252)
(0253)
(0254) while(1)
(0255) {
(0256)
(0257)
(0258) for(counter=0;counter<=3;counter++)
017E 2744 CLR R20
017F C033 RJMP 0x01B3
(0259) {
(0260) temp[counter]=ReadADC (counter);
0180 2F04 MOV R16,R20
0181 DFD3 RCALL _ReadADC
0182 E082 LDI R24,2
0183 9F84 MUL R24,R20
0184 01F0 MOVW R30,R0
0185 01CE MOVW R24,R28
0186 0FE8 ADD R30,R24
0187 1FF9 ADC R31,R25
0188 8311 STD Z+1,R17
0189 8300 STD Z+0,R16
(0261) if((temp[counter]>time[counter]+1)||(temp[counter]<time[counter]-1))time[counter]=temp[counter];
018A E082 LDI R24,2
018B 9F84 MUL R24,R20
018C 01CE MOVW R24,R28
018D 01F0 MOVW R30,R0
018E 0FE8 ADD R30,R24
018F 1FF9 ADC R31,R25
0190 8020 LDD R2,Z+0
0191 8031 LDD R3,Z+1
0192 E786 LDI R24,0x76
0193 E090 LDI R25,0
0194 01F0 MOVW R30,R0
0195 0FE8 ADD R30,R24
0196 1FF9 ADC R31,R25
0197 8040 LDD R4,Z+0
0198 8051 LDD R5,Z+1
0199 01C2 MOVW R24,R4
019A 9601 ADIW R24,1
019B 1582 CP R24,R2
019C 0593 CPC R25,R3
019D F028 BCS 0x01A3
019E 01C2 MOVW R24,R4
019F 9701 SBIW R24,1
01A0 1628 CP R2,R24
01A1 0639 CPC R3,R25
01A2 F478 BCC 0x01B2
01A3 E082 LDI R24,2
01A4 9F84 MUL R24,R20
01A5 01CE MOVW R24,R28
01A6 01F0 MOVW R30,R0
01A7 0FE8 ADD R30,R24
01A8 1FF9 ADC R31,R25
01A9 8020 LDD R2,Z+0
01AA 8031 LDD R3,Z+1
01AB E786 LDI R24,0x76
01AC E090 LDI R25,0
01AD 01F0 MOVW R30,R0
01AE 0FE8 ADD R30,R24
01AF 1FF9 ADC R31,R25
01B0 8231 STD Z+1,R3
01B1 8220 STD Z+0,R2
01B2 9543 INC R20
01B3 E083 LDI R24,3
01B4 1784 CP R24,R20
01B5 F008 BCS 0x01B7
01B6 CFC9 RJMP 0x0180
(0262)
(0263) }
(0264)
(0265) batt=ReadADC (4);
01B7 E004 LDI R16,4
01B8 DF9C RCALL _ReadADC
01B9 01B8 MOVW R22,R16
(0266)
(0267) if(BUTTON1)time[4]=SWL_time;else time[4]=SWH_time;
01BA 9BB1 SBIS 0x16,1
01BB C007 RJMP 0x01C3
01BC E684 LDI R24,0x64
01BD E090 LDI R25,0
01BE 9390007F STS 0x7F,R25
01C0 9380007E STS 0x7E,R24
01C2 C006 RJMP 0x01C9
01C3 E884 LDI R24,0x84
01C4 E093 LDI R25,3
01C5 9390007F STS 0x7F,R25
01C7 9380007E STS 0x7E,R24
(0268) if(BUTTON2)time[5]=SWL_time;else time[5]=SWH_time;
01C9 9BB2 SBIS 0x16,2
01CA C007 RJMP 0x01D2
01CB E684 LDI R24,0x64
01CC E090 LDI R25,0
01CD 93900081 STS 0x81,R25
01CF 93800080 STS 0x80,R24
01D1 C006 RJMP 0x01D8
01D2 E884 LDI R24,0x84
01D3 E093 LDI R25,3
01D4 93900081 STS 0x81,R25
01D6 93800080 STS 0x80,R24
(0269) if(BUTTON3)time[6]=SWL_time;else time[6]=SWH_time;
01D8 9BB3 SBIS 0x16,3
01D9 C007 RJMP 0x01E1
01DA E684 LDI R24,0x64
01DB E090 LDI R25,0
01DC 93900083 STS 0x83,R25
01DE 93800082 STS 0x82,R24
01E0 C006 RJMP 0x01E7
01E1 E884 LDI R24,0x84
01E2 E093 LDI R25,3
01E3 93900083 STS 0x83,R25
01E5 93800082 STS 0x82,R24
(0270) if(BUTTON4)time[7]=SWL_time;else time[7]=SWH_time;
01E7 9BB4 SBIS 0x16,4
01E8 C007 RJMP 0x01F0
01E9 E684 LDI R24,0x64
01EA E090 LDI R25,0
01EB 93900085 STS 0x85,R25
01ED 93800084 STS 0x84,R24
01EF C006 RJMP 0x01F6
01F0 E884 LDI R24,0x84
01F1 E093 LDI R25,3
01F2 93900085 STS 0x85,R25
01F4 93800084 STS 0x84,R24
(0271)
(0272) time[8]=12000-time[0]-time[1]-time[2]-time[3]-time[4]-time[5]-time[6]-time[7];
01F6 90200076 LDS R2,time
01F8 90300077 LDS R3,time+1
01FA EE80 LDI R24,0xE0
01FB E29E LDI R25,0x2E
01FC 1982 SUB R24,R2
01FD 0993 SBC R25,R3
01FE 90200078 LDS R2,time+2
0200 90300079 LDS R3,time+3
0202 1982 SUB R24,R2
0203 0993 SBC R25,R3
0204 9020007A LDS R2,0x7A
0206 9030007B LDS R3,0x7B
0208 1982 SUB R24,R2
0209 0993 SBC R25,R3
020A 9020007C LDS R2,0x7C
020C 9030007D LDS R3,0x7D
020E 1982 SUB R24,R2
020F 0993 SBC R25,R3
0210 9020007E LDS R2,0x7E
0212 9030007F LDS R3,0x7F
0214 1982 SUB R24,R2
0215 0993 SBC R25,R3
0216 90200080 LDS R2,0x80
0218 90300081 LDS R3,0x81
021A 1982 SUB R24,R2
021B 0993 SBC R25,R3
021C 90200082 LDS R2,0x82
021E 90300083 LDS R3,0x83
0220 1982 SUB R24,R2
0221 0993 SBC R25,R3
0222 90200084 LDS R2,0x84
0224 90300085 LDS R3,0x85
0226 1982 SUB R24,R2
0227 0993 SBC R25,R3
0228 93900087 STS 0x87,R25
022A 93800086 STS 0x86,R24
(0273)
(0274) WDR();
022C 95A8 WDR
(0275)
(0276) if(safe)
022D 8409 LDD R0,Y+9
022E 2000 TST R0
022F F0C9 BEQ 0x0249
(0277) {
(0278) youmen=time[2];
0230 90E0007A LDS R14,0x7A
0232 90F0007B LDS R15,0x7B
(0279) time[2]=0;
0234 2422 CLR R2
0235 2433 CLR R3
0236 9230007B STS 0x7B,R3
0238 9220007A STS 0x7A,R2
(0280) if(safedelay>3)
023A E083 LDI R24,3
023B 840A LDD R0,Y+10
023C 1580 CP R24,R0
023D F440 BCC 0x0246
(0281) {
(0282) if(youmen<50)safe=0;
023E 01C7 MOVW R24,R14
023F 3382 CPI R24,0x32
0240 E0E0 LDI R30,0
0241 079E CPC R25,R30
0242 F430 BCC 0x0249
0243 2400 CLR R0
0244 8609 STD Y+9,R0
(0283) }
0245 C003 RJMP 0x0249
(0284) else safedelay++;
0246 840A LDD R0,Y+10
0247 9403 INC R0
0248 860A STD Y+10,R0
(0285) }
(0286)
(0287)
(0288) if(!(BUTTON5))
0249 99B5 SBIC 0x16,5
024A C016 RJMP 0x0261
(0289) {
(0290) TCCR0 = 0x05; //start timer//开始判断有无信号
024B E085 LDI R24,5
024C BF83 OUT 0x33,R24
(0291) GICR = 0xC0;//外中断开
024D EC80 LDI R24,0xC0
024E BF8B OUT 0x3B,R24
(0292) if (input)
024F 90200073 LDS R2,input
0251 2022 TST R2
0252 F041 BEQ 0x025B
(0293) {
(0294) TCCR1B = 0x00;//原来的信号发送关闭
0253 2422 CLR R2
0254 BC2E OUT 0x2E,R2
(0295) train=1;//开始训练
0255 E081 LDI R24,1
0256 93800074 STS train,R24
(0296) ch_counter=0;//等待放行
0258 92200072 STS ch_counter,R2
(0297) }
025A C010 RJMP 0x026B
(0298) else
(0299) {
(0300) TCCR1B = 0x02;
025B E082 LDI R24,2
025C BD8E OUT 0x2E,R24
(0301) train=0;//退出时关闭训练
025D 2422 CLR R2
025E 92200074 STS train,R2
(0302) ////原来的信号发送打开
(0303) }
(0304) }//if(!(BUTTON5))
0260 C00A RJMP 0x026B
(0305) else
(0306) {
(0307) GICR = 0x00;//外中断关
0261 2422 CLR R2
0262 BE2B OUT 0x3B,R2
(0308) TCCR0 = 0x00;
0263 BE23 OUT 0x33,R2
(0309) TCNT0 = 0x00;
0264 BE22 OUT 0x32,R2
(0310) train=0;
0265 92200074 STS train,R2
(0311) input=0;
0267 92200073 STS input,R2
(0312) TCCR1B = 0x02;
0269 E082 LDI R24,2
026A BD8E OUT 0x2E,R24
(0313) }
(0314)
(0315) ////////////////////////////
(0316)
(0317) if(checken==0)
026B 8408 LDD R0,Y+8
026C 2000 TST R0
026D F571 BNE 0x029C
(0318) {
(0319) if(battcheck)
026E 840B LDD R0,Y+11
026F 2000 TST R0
0270 F171 BEQ 0x029F
(0320) {
(0321) if(batt<450) //进入报警状态
0271 3C62 CPI R22,0xC2
0272 E0E1 LDI R30,1
0273 077E CPC R23,R30
0274 F528 BCC 0x029A
(0322) {
(0323) if(batt>393) //进入频闪状态
0275 E889 LDI R24,0x89
0276 E091 LDI R25,1
0277 1786 CP R24,R22
0278 0797 CPC R25,R23
0279 F4E0 BCC 0x0296
(0324) {
(0325) warning_frequency=batt-390;
027A 01CB MOVW R24,R22
027B 5886 SUBI R24,0x86
027C 4091 SBCI R25,1
027D 2EA8 MOV R10,R24
(0326) warning_counter++;
027E 840C LDD R0,Y+12
027F 9403 INC R0
0280 860C STD Y+12,R0
(0327) if(warning_counter>=warning_frequency)
0281 1608 CP R0,R24
0282 F0E0 BCS 0x029F
(0328) {
(0329) warning_counter=0;
0283 2400 CLR R0
0284 860C STD Y+12,R0
(0330) ledonof=!ledonof;
0285 840D LDD R0,Y+13
0286 2000 TST R0
0287 F421 BNE 0x028C
0288 E081 LDI R24,1
0289 E090 LDI R25,0
028A 016C MOVW R12,R24
028B C002 RJMP 0x028E
028C 24CC CLR R12
028D 24DD CLR R13
028E 86CD STD Y+13,R12
(0331) if(ledonof)LEDH;
028F 2C0C MOV R0,R12
0290 20CC TST R12
0291 F011 BEQ 0x0294
0292 9AC0 SBI 0x18,0
0293 C00B RJMP 0x029F
(0332) else LEDL;
0294 98C0 CBI 0x18,0
(0333) }
(0334) }
0295 C009 RJMP 0x029F
(0335) else {LEDH;battcheck=0; }//进入长亮状态,不允许电压回升
0296 9AC0 SBI 0x18,0
0297 2400 CLR R0
0298 860B STD Y+11,R0
(0336)
(0337) }
0299 C005 RJMP 0x029F
(0338)
(0339) else LEDL; //关闭
029A 98C0 CBI 0x18,0
(0340) }
(0341) }//if(checken==0)
029B C003 RJMP 0x029F
(0342) else checken--;
029C 8408 LDD R0,Y+8
029D 940A DEC R0
029E 8608 STD Y+8,R0
(0343)
(0344)
(0345) ////////////////////////////
(0346)
(0347) while(ch_counter);
FILE: <library>
029F 90200072 LDS R2,ch_counter
02A1 2022 TST R2
02A2 F7E1 BNE 0x029F
02A3 CEDA RJMP 0x017E
02A4 962E ADIW R28,0xE
02A5 9508 RET
pop_gset2:
02A6 E0E2 LDI R30,2
02A7 C00C RJMP pop
push_gset5:
02A8 92FA ST R15,-Y
02A9 92EA ST R14,-Y
push_gset4:
02AA 92DA ST R13,-Y
02AB 92CA ST R12,-Y
push_gset3:
02AC 92BA ST R11,-Y
02AD 92AA ST R10,-Y
push_gset2:
02AE 937A ST R23,-Y
02AF 936A ST R22,-Y
push_gset1:
02B0 935A ST R21,-Y
02B1 934A ST R20,-Y
02B2 9508 RET
pop_gset1:
02B3 E0E1 LDI R30,1
pop:
02B4 9149 LD R20,Y+
02B5 9159 LD R21,Y+
02B6 FDE0 SBRC R30,0
02B7 9508 RET
02B8 9169 LD R22,Y+
02B9 9179 LD R23,Y+
02BA FDE1 SBRC R30,1
02BB 9508 RET
02BC 90A9 LD R10,Y+
02BD 90B9 LD R11,Y+
02BE FDE2 SBRC R30,2
02BF 9508 RET
02C0 90C9 LD R12,Y+
02C1 90D9 LD R13,Y+
02C2 FDE3 SBRC R30,3
02C3 9508 RET
02C4 90E9 LD R14,Y+
02C5 90F9 LD R15,Y+
02C6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -