📄 ad.lis
字号:
01B6 .dbline -1
01B6 .dbline 82
01B6 ; }
01B6 ; void adinit()
01B6 ; {
01B6 .dbline 87
01B6 ; //ad转换相关的寄存器的初始化
01B6 ; //ACSR=0x80; //别忘了关掉模拟比较器的电源哦
01B6 ; // SFIOR=0x00;
01B6 ; //IO初始化
01B6 ; DDRB|=_BV(DDB0);
01B6 B89A sbi 0x17,0
01B8 .dbline 88
01B8 ; PORTB|=~_BV(PB0);
01B8 88B3 in R24,0x18
01BA 8E6F ori R24,254
01BC 88BB out 0x18,R24
01BE .dbline -2
01BE .dbline 93
01BE ; //ad转换相关的寄存器的初始化
01BE ; // ACSR=0x80; //别忘了关掉模拟比较器的电源哦
01BE ; // SFIOR=0x00;
01BE ;
01BE ; }
01BE L31:
01BE .dbline 0 ; func end
01BE 0895 ret
01C0 .dbend
01C0 .dbfunc e AdcConvertDin _AdcConvertDin fi
01C0 ; min_value -> R14
01C0 ; max_value -> R20
01C0 ; min_id -> R12
01C0 ; max_id -> R10
01C0 ; ret -> y+0
01C0 ; i -> R22
.even
01C0 _AdcConvertDin::
01C0 00D0 rcall push_gset5
01C2 2297 sbiw R28,2
01C4 .dbline -1
01C4 .dbline 98
01C4 ;
01C4 ;
01C4 ; //AD转换8次去掉最高和最低后取平均值返回
01C4 ; unsigned int AdcConvertDin(void)
01C4 ; {
01C4 .dbline 103
01C4 ; char i;
01C4 ; unsigned int ret;
01C4 ; char max_id,min_id,max_value,min_value;
01C4 ;
01C4 ; ADMUX=0X44;//参考电压VCC
01C4 84E4 ldi R24,68
01C6 87B9 out 0x7,R24
01C8 .dbline 104
01C8 ; ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
01C8 80E8 ldi R24,128
01CA 86B9 out 0x6,R24
01CC .dbline 107
01CC ;
01CC ; //连续转换8次
01CC ; for(i=0;i<8;i++)
01CC 6627 clr R22
01CE 24C0 rjmp L36
01D0 L33:
01D0 .dbline 108
01D0 ; {
01D0 .dbline 109
01D0 ; ADCSRA|=_BV(ADSC);
01D0 369A sbi 0x6,6
01D2 .dbline 110
01D2 ; delay_us(30);
01D2 0EE1 ldi R16,30
01D4 10E0 ldi R17,0
01D6 00D0 rcall _delay_us
01D8 03C0 rjmp L38
01DA L37:
01DA .dbline 112
01DA 0EE1 ldi R16,30
01DC 10E0 ldi R17,0
01DE 00D0 rcall _delay_us
01E0 L38:
01E0 .dbline 111
01E0 3699 sbic 0x6,6
01E2 FBCF rjmp L37
01E4 .dbline 113
01E4 24B0 in R2,0x4
01E6 3324 clr R3
01E8 3982 std y+1,R3
01EA 2882 std y+0,R2
01EC .dbline 114
01EC 25B0 in R2,0x5
01EE 3324 clr R3
01F0 322C mov R3,R2
01F2 2224 clr R2
01F4 0880 ldd R0,y+0
01F6 1980 ldd R1,y+1
01F8 0228 or R0,R2
01FA 1328 or R1,R3
01FC 1982 std y+1,R1
01FE 0882 std y+0,R0
0200 .dbline 115
0200 82E0 ldi R24,2
0202 869F mul R24,R22
0204 F001 movw R30,R0
0206 80E0 ldi R24,<_g_aAdValue
0208 90E0 ldi R25,>_g_aAdValue
020A E80F add R30,R24
020C F91F adc R31,R25
020E 0880 ldd R0,y+0
0210 1980 ldd R1,y+1
0212 1182 std z+1,R1
0214 0082 std z+0,R0
0216 .dbline 116
0216 L34:
0216 .dbline 107
0216 6395 inc R22
0218 L36:
0218 .dbline 107
0218 6830 cpi R22,8
021A D0F2 brlo L33
021C .dbline 117
021C ; while(ADCSRA&_BV(ADSC))
021C ; delay_us(30);
021C ; ret=ADCL;
021C ; ret|=(unsigned int)(ADCH<<8);
021C ; g_aAdValue[i]=ret;
021C ; }
021C ; ret=0;
021C 0024 clr R0
021E 1124 clr R1
0220 1982 std y+1,R1
0222 0882 std y+0,R0
0224 .dbline 118
0224 ; for(i=1;i<8;i++)
0224 61E0 ldi R22,1
0226 10C0 rjmp L43
0228 L40:
0228 .dbline 119
0228 82E0 ldi R24,2
022A 869F mul R24,R22
022C F001 movw R30,R0
022E 80E0 ldi R24,<_g_aAdValue
0230 90E0 ldi R25,>_g_aAdValue
0232 E80F add R30,R24
0234 F91F adc R31,R25
0236 2080 ldd R2,z+0
0238 3180 ldd R3,z+1
023A 0880 ldd R0,y+0
023C 1980 ldd R1,y+1
023E 020C add R0,R2
0240 131C adc R1,R3
0242 1982 std y+1,R1
0244 0882 std y+0,R0
0246 L41:
0246 .dbline 118
0246 6395 inc R22
0248 L43:
0248 .dbline 118
0248 6830 cpi R22,8
024A 70F3 brlo L40
024C .dbline 122
024C ; ret+=g_aAdValue[i];
024C ;
024C ; //找到最大和最小值索引
024C ; ret/=7;
024C 27E0 ldi R18,7
024E 30E0 ldi R19,0
0250 0881 ldd R16,y+0
0252 1981 ldd R17,y+1
0254 00D0 rcall div16u
0256 1983 std y+1,R17
0258 0883 std y+0,R16
025A .dbline 123
025A ; max_id=min_id=1;
025A CC24 clr R12
025C C394 inc R12
025E AA24 clr R10
0260 A394 inc R10
0262 .dbline 124
0262 ; max_value=min_value=0;
0262 EE24 clr R14
0264 4427 clr R20
0266 .dbline 125
0266 ; for(i=1;i<8;i++)
0266 61E0 ldi R22,1
0268 4FC0 rjmp L47
026A L44:
026A .dbline 126
026A ; {
026A .dbline 127
026A ; if(g_aAdValue[i]>ret)
026A 82E0 ldi R24,2
026C 869F mul R24,R22
026E F001 movw R30,R0
0270 80E0 ldi R24,<_g_aAdValue
0272 90E0 ldi R25,>_g_aAdValue
0274 E80F add R30,R24
0276 F91F adc R31,R25
0278 2080 ldd R2,z+0
027A 3180 ldd R3,z+1
027C 0880 ldd R0,y+0
027E 1980 ldd R1,y+1
0280 0214 cp R0,R2
0282 1304 cpc R1,R3
0284 00F5 brsh L48
0286 .dbline 128
0286 ; {
0286 .dbline 129
0286 ; if(g_aAdValue[i]-ret>max_value)
0286 82E0 ldi R24,2
0288 869F mul R24,R22
028A F001 movw R30,R0
028C 80E0 ldi R24,<_g_aAdValue
028E 90E0 ldi R25,>_g_aAdValue
0290 E80F add R30,R24
0292 F91F adc R31,R25
0294 2080 ldd R2,z+0
0296 3180 ldd R3,z+1
0298 0880 ldd R0,y+0
029A 1980 ldd R1,y+1
029C 2018 sub R2,R0
029E 3108 sbc R3,R1
02A0 442E mov R4,R20
02A2 5524 clr R5
02A4 4214 cp R4,R2
02A6 5304 cpc R5,R3
02A8 70F5 brsh L49
02AA .dbline 130
02AA ; {
02AA .dbline 131
02AA ; max_value=g_aAdValue[i]-ret;
02AA 82E0 ldi R24,2
02AC 869F mul R24,R22
02AE F001 movw R30,R0
02B0 80E0 ldi R24,<_g_aAdValue
02B2 90E0 ldi R25,>_g_aAdValue
02B4 E80F add R30,R24
02B6 F91F adc R31,R25
02B8 4081 ldd R20,z+0
02BA 0880 ldd R0,y+0
02BC 1980 ldd R1,y+1
02BE 4019 sub R20,R0
02C0 5109 sbc R21,R1
02C2 .dbline 132
02C2 ; max_id=i;
02C2 A62E mov R10,R22
02C4 .dbline 133
02C4 ; }
02C4 .dbline 134
02C4 ; }
02C4 20C0 rjmp L49
02C6 L48:
02C6 .dbline 136
02C6 ; else
02C6 ; {
02C6 .dbline 137
02C6 ; if(ret-g_aAdValue[i]>min_value)
02C6 82E0 ldi R24,2
02C8 869F mul R24,R22
02CA F001 movw R30,R0
02CC 80E0 ldi R24,<_g_aAdValue
02CE 90E0 ldi R25,>_g_aAdValue
02D0 E80F add R30,R24
02D2 F91F adc R31,R25
02D4 2080 ldd R2,z+0
02D6 3180 ldd R3,z+1
02D8 4880 ldd R4,y+0
02DA 5980 ldd R5,y+1
02DC 4218 sub R4,R2
02DE 5308 sbc R5,R3
02E0 2E2C mov R2,R14
02E2 3324 clr R3
02E4 2414 cp R2,R4
02E6 3504 cpc R3,R5
02E8 70F4 brsh L52
02EA .dbline 138
02EA ; {
02EA .dbline 139
02EA ; min_value=ret-g_aAdValue[i];
02EA 82E0 ldi R24,2
02EC 869F mul R24,R22
02EE F001 movw R30,R0
02F0 80E0 ldi R24,<_g_aAdValue
02F2 90E0 ldi R25,>_g_aAdValue
02F4 E80F add R30,R24
02F6 F91F adc R31,R25
02F8 2080 ldd R2,z+0
02FA 3180 ldd R3,z+1
02FC E880 ldd R14,y+0
02FE F980 ldd R15,y+1
0300 E218 sub R14,R2
0302 F308 sbc R15,R3
0304 .dbline 140
0304 ; min_id=i;
0304 C62E mov R12,R22
0306 .dbline 141
0306 ; }
0306 L52:
0306 .dbline 142
0306 ; }
0306 L49:
0306 .dbline 143
0306 L45:
0306 .dbline 125
0306 6395 inc R22
0308 L47:
0308 .dbline 125
0308 6830 cpi R22,8
030A 08F4 brsh X1
030C AECF rjmp L44
030E X1:
030E .dbline 146
030E ; }
030E ;
030E ; //去掉第一个和最大最小值后的平均值
030E ; ret=0;
030E 0024 clr R0
0310 1124 clr R1
0312 1982 std y+1,R1
0314 0882 std y+0,R0
0316 .dbline 147
0316 ; for(i=1;i<8;i++)
0316 61E0 ldi R22,1
0318 14C0 rjmp L57
031A L54:
031A .dbline 148
031A ; {
031A .dbline 149
031A ; if((i!=min_id)&&(i!=max_id))
031A 6C15 cp R22,R12
031C 89F0 breq L58
031E 6A15 cp R22,R10
0320 79F0 breq L58
0322 .dbline 150
0322 ; ret+=g_aAdValue[i];
0322 82E0 ldi R24,2
0324 869F mul R24,R22
0326 F001 movw R30,R0
0328 80E0 ldi R24,<_g_aAdValue
032A 90E0 ldi R25,>_g_aAdValue
032C E80F add R30,R24
032E F91F adc R31,R25
0330 2080 ldd R2,z+0
0332 3180 ldd R3,z+1
0334 0880 ldd R0,y+0
0336 1980 ldd R1,y+1
0338 020C add R0,R2
033A 131C adc R1,R3
033C 1982 std y+1,R1
033E 0882 std y+0,R0
0340 L58:
0340 .dbline 151
0340 L55:
0340 .dbline 147
0340 6395 inc R22
0342 L57:
0342 .dbline 147
0342 6830 cpi R22,8
0344 50F3 brlo L54
0346 .dbline 152
0346 ; }
0346 ; if(min_id!=max_id)
0346 CA14 cp R12,R10
0348 41F0 breq L60
034A .dbline 153
034A ; ret/=5;
034A 25E0 ldi R18,5
034C 30E0 ldi R19,0
034E 0881 ldd R16,y+0
0350 1981 ldd R17,y+1
0352 00D0 rcall div16u
0354 1983 std y+1,R17
0356 0883 std y+0,R16
0358 07C0 rjmp L61
035A L60:
035A .dbline 155
035A ; else
035A ; ret/=6;
035A 26E0 ldi R18,6
035C 30E0 ldi R19,0
035E 0881 ldd R16,y+0
0360 1981 ldd R17,y+1
0362 00D0 rcall div16u
0364 1983 std y+1,R17
0366 0883 std y+0,R16
0368 L61:
0368 .dbline 157
0368 ;
0368 ; ADCSRA=0;//关闭ADC
0368 2224 clr R2
036A 26B8 out 0x6,R2
036C .dbline 159
036C ;
036C ; return ret;
036C 0881 ldd R16,y+0
036E 1981 ldd R17,y+1
0370 .dbline -2
0370 L32:
0370 2296 adiw R28,2
0372 00D0 rcall pop_gset5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -