📄 coder.s
字号:
clr R2
out 0x32,R2
.dbline 200
; input=1;
ldi R24,1
sts _input,R24
.dbline 201
; if(train)//先不忙发送
lds R2,_train
tst R2
breq L35
.dbline 202
; switch(IN1)
in R16,0x10
clr R17
andi R16,8
andi R17,0
cpi R16,0
cpc R16,R17
breq L40
X5:
cpi R16,0
ldi R30,0
cpc R17,R30
brlt L37
L42:
cpi R16,8
ldi R30,0
cpc R17,R30
breq L41
rjmp L37
X6:
.dbline 203
; {
L40:
.dbline 205
; case 0:
; OUTH;
sbi 0x12,7
.dbline 206
; break;
rjmp L38
L41:
.dbline 208
; case 0x08:
; OUTL;
cbi 0x12,7
.dbline 209
; }
L37:
L38:
L35:
.dbline -2
L34:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Putchar _Putchar fV
; c -> R16
.even
_Putchar::
.dbline -1
.dbline 216
;
; }
;
;
;
; void Putchar (Uchar c)
; {
L44:
.dbline 217
L45:
.dbline 217
; while(!(UCSRA&(1<<UDRE)));
sbis 0xb,5
rjmp L44
.dbline 218
; UDR=c;
out 0xc,R16
.dbline -2
L43:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e ReadADC _ReadADC fi
; int2 -> R20,R21
; int1 -> R22,R23
; channel -> R16
.even
_ReadADC::
rcall push_gset2
.dbline -1
.dbline 223
; }
;
;
; Uint ReadADC (Uchar channel)
; {
.dbline 225
; Uint int1,int2;
; ADMUX&=~0x1F;
in R24,0x7
andi R24,224
out 0x7,R24
.dbline 226
; ADMUX|=channel;
in R2,0x7
or R2,R16
out 0x7,R2
.dbline 227
; ADCSRA|=0x40;
sbi 0x6,6
L48:
.dbline 228
.dbline 228
L49:
.dbline 228
; while(~ADCSRA&0x10){}
in R2,0x6
clr R3
com R2
com R3
sbrc R2,4
rjmp L48
.dbline 229
; ADCSRA|=0x10;
sbi 0x6,4
.dbline 230
; int2=ADCL;
in R20,0x4
clr R21
.dbline 231
; int1=ADCH;
in R22,0x5
clr R23
.dbline 232
; int1<<=8;
mov R23,R22
clr R22
.dbline 233
; return (int1+int2);
movw R16,R22
add R16,R20
adc R17,R21
.dbline -2
L47:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r int2 20 i
.dbsym r int1 22 i
.dbsym r channel 16 c
.dbend
.dbfunc e main _main fI
; warning_frequency -> R10
; ledonof -> y+13
; warning_counter -> y+12
; battcheck -> y+11
; youmen -> R14,R15
; safedelay -> y+10
; safe -> y+9
; batt -> R22,R23
; checken -> y+8
; temp -> y+0
; counter -> R20
.even
_main::
sbiw R28,14
.dbline -1
.dbline 238
; }
;
;
; main()
; {
.dbline 244
;
; Uint batt;//电量
; Uint temp[4];//滤波用
; Uint youmen ;//油门缓存
; Uchar counter ;//采集计数
; Uchar safe=1,safedelay=0;//油门保护
clr R0
inc R0
std y+9,R0
.dbline 244
clr R0
std y+10,R0
.dbline 246
; Uchar warning_frequency;//警告频率
; Uchar warning_counter=0;
std y+12,R0
.dbline 247
; Uchar ledonof=0;
std y+13,R0
.dbline 248
; Uchar battcheck=1;//检测电量许可
clr R0
inc R0
std y+11,R0
.dbline 249
; Uchar checken=200;//等待电压稳定
ldi R24,200
std y+8,R24
.dbline 251
;
; init_devices();
rcall _init_devices
rjmp L53
L52:
.dbline 255
;
;
; while(1)
; {
.dbline 258
;
;
; for(counter=0;counter<=3;counter++)
clr R20
rjmp L58
L55:
.dbline 259
; {
.dbline 260
; temp[counter]=ReadADC (counter);
mov R16,R20
rcall _ReadADC
ldi R24,2
mul R24,R20
movw R30,R0
movw R24,R28
add R30,R24
adc R31,R25
std z+1,R17
std z+0,R16
.dbline 261
ldi R24,2
mul R24,R20
movw R24,R28
movw R30,R0
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldi R24,<_time
ldi R25,>_time
movw R30,R0
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
movw R24,R4
adiw R24,1
cp R24,R2
cpc R25,R3
brlo L61
movw R24,R4
sbiw R24,1
cp R2,R24
cpc R3,R25
brsh L59
L61:
.dbline 261
; if((temp[counter]>time[counter]+1)||(temp[counter]<time[counter]-1))time[counter]=temp[counter];
ldi R24,2
mul R24,R20
movw R24,R28
movw R30,R0
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldi R24,<_time
ldi R25,>_time
movw R30,R0
add R30,R24
adc R31,R25
std z+1,R3
std z+0,R2
L59:
.dbline 263
L56:
.dbline 258
inc R20
L58:
.dbline 258
ldi R24,3
cp R24,R20
brlo X8
rjmp L55
X8:
.dbline 265
;
; }
;
; batt=ReadADC (4);
ldi R16,4
rcall _ReadADC
movw R22,R16
.dbline 267
sbis 0x16,1
rjmp L62
.dbline 267
ldi R24,100
ldi R25,0
sts _time+8+1,R25
sts _time+8,R24
rjmp L63
L62:
.dbline 267
;
; if(BUTTON1)time[4]=SWL_time;else time[4]=SWH_time;
ldi R24,900
ldi R25,3
sts _time+8+1,R25
sts _time+8,R24
L63:
.dbline 268
sbis 0x16,2
rjmp L66
.dbline 268
ldi R24,100
ldi R25,0
sts _time+10+1,R25
sts _time+10,R24
rjmp L67
L66:
.dbline 268
; if(BUTTON2)time[5]=SWL_time;else time[5]=SWH_time;
ldi R24,900
ldi R25,3
sts _time+10+1,R25
sts _time+10,R24
L67:
.dbline 269
sbis 0x16,3
rjmp L70
.dbline 269
ldi R24,100
ldi R25,0
sts _time+12+1,R25
sts _time+12,R24
rjmp L71
L70:
.dbline 269
; if(BUTTON3)time[6]=SWL_time;else time[6]=SWH_time;
ldi R24,900
ldi R25,3
sts _time+12+1,R25
sts _time+12,R24
L71:
.dbline 270
sbis 0x16,4
rjmp L74
.dbline 270
ldi R24,100
ldi R25,0
sts _time+14+1,R25
sts _time+14,R24
rjmp L75
L74:
.dbline 270
; if(BUTTON4)time[7]=SWL_time;else time[7]=SWH_time;
ldi R24,900
ldi R25,3
sts _time+14+1,R25
sts _time+14,R24
L75:
.dbline 272
;
; time[8]=12000-time[0]-time[1]-time[2]-time[3]-time[4]-time[5]-time[6]-time[7];
lds R2,_time
lds R3,_time+1
ldi R24,12000
ldi R25,46
sub R24,R2
sbc R25,R3
lds R2,_time+2
lds R3,_time+2+1
sub R24,R2
sbc R25,R3
lds R2,_time+4
lds R3,_time+4+1
sub R24,R2
sbc R25,R3
lds R2,_time+6
lds R3,_time+6+1
sub R24,R2
sbc R25,R3
lds R2,_time+8
lds R3,_time+8+1
sub R24,R2
sbc R25,R3
lds R2,_time+10
lds R3,_time+10+1
sub R24,R2
sbc R25,R3
lds R2,_time+12
lds R3,_time+12+1
sub R24,R2
sbc R25,R3
lds R2,_time+14
lds R3,_time+14+1
sub R24,R2
sbc R25,R3
sts _time+16+1,R25
sts _time+16,R24
.dbline 274
;
; WDR();
wdr
.dbline 276
;
; if(safe)
ldd R0,y+9
tst R0
breq L86
.dbline 277
; {
.dbline 278
; youmen=time[2];
lds R14,_time+4
lds R15,_time+4+1
.dbline 279
; time[2]=0;
clr R2
clr R3
sts _time+4+1,R3
sts _time+4,R2
.dbline 280
; if(safedelay>3)
ldi R24,3
ldd R0,y+10
cp R24,R0
brsh L90
.dbline 281
; {
.dbline 282
; if(youmen<50)safe=0;
movw R24,R14
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L91
.dbline 282
clr R0
std y+9,R0
.dbline 283
; }
rjmp L91
L90:
.dbline 284
; else safedelay++;
ldd R0,y+10
inc R0
std y+10,R0
L91:
.dbline 285
; }
L86:
.dbline 288
;
;
; if(!(BUTTON5))
sbic 0x16,5
rjmp L94
.dbline 289
; {
.dbline 290
; TCCR0 = 0x05; //start timer//开始判断有无信号
ldi R24,5
out 0x33,R24
.dbline 291
; GICR = 0xC0;//外中断开
ldi R24,192
out 0x3b,R24
.dbline 292
; if (input)
lds R2,_input
tst R2
breq L96
.dbline 293
; {
.dbline 294
; TCCR1B = 0x00;//原来的信号发送关闭
clr R2
out 0x2e,R2
.dbline 295
; train=1;//开始训练
ldi R24,1
sts _train,R24
.dbline 296
; ch_counter=0;//等待放行
sts _ch_counter,R2
.dbline 297
; }
rjmp L95
L96:
.dbline 299
; else
; {
.dbline 300
; TCCR1B = 0x02;
ldi R24,2
out 0x2e,R24
.dbline 301
; train=0;//退出时关闭训练
clr R2
sts _train,R2
.dbline 303
; ////原来的信号发送打开
; }
.dbline 304
; }//if(!(BUTTON5))
rjmp L95
L94:
.dbline 306
; else
; {
.dbline 307
; GICR = 0x00;//外中断关
clr R2
out 0x3b,R2
.dbline 308
; TCCR0 = 0x00;
out 0x33,R2
.dbline 309
; TCNT0 = 0x00;
out 0x32,R2
.dbline 310
; train=0;
sts _train,R2
.dbline 311
; input=0;
sts _input,R2
.dbline 312
; TCCR1B = 0x02;
ldi R24,2
out 0x2e,R24
.dbline 313
; }
L95:
.dbline 317
;
; ////////////////////////////
;
; if(checken==0)
ldd R0,y+8
tst R0
brne L98
.dbline 318
; {
.dbline 319
; if(battcheck)
ldd R0,y+11
tst R0
breq L113
.dbline 320
; {
.dbline 321
; if(batt<450) //进入报警状态
cpi R22,194
ldi R30,1
cpc R23,R30
brsh L102
.dbline 322
; {
.dbline 323
; if(batt>393) //进入频闪状态
ldi R24,393
ldi R25,1
cp R24,R22
cpc R25,R23
brsh L104
.dbline 324
; {
.dbline 325
; warning_frequency=batt-390;
movw R24,R22
subi R24,134
sbci R25,1
mov R10,R24
.dbline 326
; warning_counter++;
ldd R0,y+12
inc R0
std y+12,R0
.dbline 327
; if(warning_counter>=warning_frequency)
cp R0,R24
brlo L113
.dbline 328
; {
.dbline 329
; warning_counter=0;
clr R0
std y+12,R0
.dbline 330
; ledonof=!ledonof;
ldd R0,y+13
tst R0
brne L108
ldi R24,1
ldi R25,0
movw R12,R24
rjmp L109
L108:
clr R12
clr R13
L109:
std y+13,R12
.dbline 331
; if(ledonof)LEDH;
mov R0,R12
tst R12
breq L110
.dbline 331
sbi 0x18,0
rjmp L113
L110:
.dbline 332
; else LEDL;
cbi 0x18,0
.dbline 333
; }
.dbline 334
; }
rjmp L113
L104:
.dbline 335
; else {LEDH;battcheck=0; }//进入长亮状态,不允许电压回升
.dbline 335
sbi 0x18,0
.dbline 335
clr R0
std y+11,R0
.dbline 335
.dbline 337
;
; }
rjmp L113
L102:
.dbline 339
;
; else LEDL; //关闭
cbi 0x18,0
.dbline 340
; }
.dbline 341
; }//if(checken==0)
rjmp L113
L98:
.dbline 342
; else checken--;
ldd R0,y+8
dec R0
std y+8,R0
L112:
.dbline 347
L113:
.dbline 347
lds R2,_ch_counter
tst R2
brne L112
.dbline 349
L53:
.dbline 254
rjmp L52
X7:
.dbline -2
L51:
adiw R28,14
.dbline 0 ; func end
ret
.dbsym r warning_frequency 10 c
.dbsym l ledonof 13 c
.dbsym l warning_counter 12 c
.dbsym l battcheck 11 c
.dbsym r youmen 14 i
.dbsym l safedelay 10 c
.dbsym l safe 9 c
.dbsym r batt 22 i
.dbsym l checken 8 c
.dbsym l temp 0 A[8:4]i
.dbsym r counter 20 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\AVR程序\简易编码系统\coder.c
_time::
.blkb 18
.dbsym e time _time A[18:9]i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -