📄 双足机器人.s
字号:
.dbfunc e RightUp _RightUp fV
; time -> R20
.even
_RightUp::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 190
; {
; time--;
;
; PORTD&=0x3f;
; delay_20ms();
;
;
; PORTD|=0x40;
; delay_run();
; PORTD&=0x3f;
; }
;
;
;
;
; }
;
; void RightUp(unsigned char time)//抬右脚
; {
xjmp L48
L47:
.dbline 192
.dbline 193
dec R20
.dbline 195
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 196
xcall _delay_20ms
.dbline 199
sbi 0x12,7
.dbline 200
xcall _delay_back
.dbline 201
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 203
L48:
.dbline 191
; while(time>1)
ldi R24,1
cp R24,R20
brlo L47
.dbline -2
L46:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 c
.dbend
.dbfunc e RightFwd _RightFwd fV
; time -> R20
.even
_RightFwd::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 207
; {
; time--;
;
; PORTD&=0x3f;
; delay_20ms();
;
;
; PORTD|=0x80;
; delay_back();
; PORTD&=0x3f;
;
; }
; }
;
; void RightFwd(unsigned char time)//迈右脚
; {
xjmp L52
L51:
.dbline 209
.dbline 210
dec R20
.dbline 212
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 213
xcall _delay_20ms
.dbline 216
sbi 0x12,6
.dbline 217
xcall _delay_back
.dbline 218
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 219
L52:
.dbline 208
; while(time>1)
ldi R24,1
cp R24,R20
brlo L51
.dbline -2
L50:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 c
.dbend
.dbfunc e display_time _display_time fV
; j -> R20
; display -> R22
; point -> R12
; second -> R10
; minute -> R14
; n1 -> R20
.even
_display_time::
xcall push_gset5
mov R14,R18
mov R20,R16
ldd R10,y+10
ldd R12,y+12
.dbline -1
.dbline 234
; {
; time--;
;
; PORTD&=0x3f;
; delay_20ms();
;
;
; PORTD|=0x40;
; delay_back();
; PORTD&=0x3f;
; }
;
; }
;
;
; /////////////////小车运动////////////////////////////////////////
;
;
; /////////////液晶屏显示函数/////////////////////////////////////
;
;
; void display_time(unsigned char n1,unsigned char minute,unsigned char second,unsigned char point)
; //参数n1为控制是否显示冒号,11为不显示,10为显示.
; //minute\second为两个最大为99的整数
; //point为控制是否显示小数点,0为不显示,1为显示.
; {
.dbline 236
; unsigned char j,display;
; display=number[n1];
ldi R24,<_number
ldi R25,>_number
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R22,z+0
.dbline 237
; for(j=0;j<8;j++)
clr R20
xjmp L58
L55:
.dbline 238
.dbline 239
sbi 0x15,4
.dbline 240
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 240
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 241
mov R24,R22
andi R24,1
lsl R24
lsl R24
lsl R24
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 241
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 242
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 242
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 243
lsr R22
.dbline 244
L56:
.dbline 237
inc R20
L58:
.dbline 237
cpi R20,8
brlo L55
.dbline 245
; {
; PORTC|=0x10;
; PORTC&=0xf7;delay_us(5);
; PORTC|=((display&0x01)<<3);delay_us(5);
; PORTC&=0xef;delay_us(5);
; display>>=1;
; }
; display=number[minute/10];
ldi R18,10
ldi R19,0
mov R16,R14
clr R17
xcall div16s
movw R30,R16
ldi R24,<_number
ldi R25,>_number
add R30,R24
adc R31,R25
ldd R22,z+0
.dbline 246
; for(j=0;j<8;j++)
clr R20
xjmp L62
L59:
.dbline 247
.dbline 248
sbi 0x15,4
.dbline 248
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 249
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 249
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 250
mov R24,R22
andi R24,1
lsl R24
lsl R24
lsl R24
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 250
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 251
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 251
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 252
lsr R22
.dbline 253
L60:
.dbline 246
inc R20
L62:
.dbline 246
cpi R20,8
brlo L59
.dbline 254
; {
; PORTC|=0x10;delay_us(5);
; PORTC&=0xf7;delay_us(5);
; PORTC|=((display&0x01)<<3);delay_us(5);
; PORTC&=0xef;delay_us(5);
; display>>=1;
; }
; display=number[minute%10];
ldi R18,10
ldi R19,0
mov R16,R14
clr R17
xcall mod16s
movw R30,R16
ldi R24,<_number
ldi R25,>_number
add R30,R24
adc R31,R25
ldd R22,z+0
.dbline 255
; if(point) //显示路程时米与厘米之加小数点
tst R12
breq L63
.dbline 256
; display&=0x7f;
andi R22,127
L63:
.dbline 257
; for(j=0;j<8;j++)
clr R20
xjmp L68
L65:
.dbline 258
.dbline 259
sbi 0x15,4
.dbline 259
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 260
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 260
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 261
mov R24,R22
andi R24,1
lsl R24
lsl R24
lsl R24
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 261
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 262
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 262
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 263
lsr R22
.dbline 264
L66:
.dbline 257
inc R20
L68:
.dbline 257
cpi R20,8
brlo L65
.dbline 265
; {
; PORTC|=0x10;delay_us(5);
; PORTC&=0xf7;delay_us(5);
; PORTC|=((display&0x01)<<3);delay_us(5);
; PORTC&=0xef;delay_us(5);
; display>>=1;
; }
; display=number[second/10];
ldi R18,10
ldi R19,0
mov R16,R10
clr R17
xcall div16s
movw R30,R16
ldi R24,<_number
ldi R25,>_number
add R30,R24
adc R31,R25
ldd R22,z+0
.dbline 266
; for(j=0;j<8;j++)
clr R20
xjmp L72
L69:
.dbline 267
.dbline 268
sbi 0x15,4
.dbline 268
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 269
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 269
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 270
mov R24,R22
andi R24,1
lsl R24
lsl R24
lsl R24
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 270
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 271
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 271
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 272
lsr R22
.dbline 273
L70:
.dbline 266
inc R20
L72:
.dbline 266
cpi R20,8
brlo L69
.dbline 274
; {
; PORTC|=0x10;delay_us(5);
; PORTC&=0xf7;delay_us(5);
; PORTC|=((display&0x01)<<3);delay_us(5);
; PORTC&=0xef;delay_us(5);
; display>>=1;
; }
; display=number[second%10];
ldi R18,10
ldi R19,0
mov R16,R10
clr R17
xcall mod16s
movw R30,R16
ldi R24,<_number
ldi R25,>_number
add R30,R24
adc R31,R25
ldd R22,z+0
.dbline 275
; for(j=0;j<8;j++)
clr R20
xjmp L76
L73:
.dbline 276
.dbline 277
sbi 0x15,4
.dbline 277
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 278
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 278
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 279
mov R24,R22
andi R24,1
lsl R24
lsl R24
lsl R24
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 279
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 280
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 280
ldi R16,5
ldi R17,0
xcall _delay_us
.dbline 281
lsr R22
.dbline 282
L74:
.dbline 275
inc R20
L76:
.dbline 275
cpi R20,8
brlo L73
.dbline -2
L54:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r display 22 c
.dbsym r point 12 c
.dbsym r second 10 c
.dbsym r minute 14 c
.dbsym r n1 20 c
.dbend
.dbfunc e trace_road _trace_road fV
; pinc -> <dead>
.even
_trace_road::
.dbline -1
.dbline 290
; {
; PORTC|=0x10;delay_us(5);
; PORTC&=0xf7;delay_us(5);
; PORTC|=((display&0x01)<<3);delay_us(5);
; PORTC&=0xef;delay_us(5);
; display>>=1;
; }
; }
; /////////////液晶屏显示函数/////////////////////////////////////
;
;
;
; /////////////////寻找黑线////////////////////////////////////////
; void trace_road(void) //黑线寻迹函数
; {
.dbline 292
; unsigned char pinc;
; PINC=PINC&0x07; //PC0~PC2信号送给变量pinc
in R24,0x13
andi R24,7
out 0x13,R24
.dbline 293
; if((PINC==0x02)||(PINC==0x07))//只有中间传感器有信号,
in R24,0x13
cpi R24,2
breq L80
in R24,0x13
cpi R24,7
brne L78
L80:
.dbline 294
; { run();turn_state0=0; turn_state1=0;}//或三个均有信号,则直走
.dbline 294
xcall _run
.dbline 294
clr R2
sts _turn_state0,R2
.dbline 294
sts _turn_state1,R2
.dbline 294
xjmp L79
L78:
.dbline 295
; else if(PINC==0x06)//若右边无信号
in R24,0x13
cpi R24,6
brne L81
.dbline 296
; {turn_left();turn_state0=1;} //左转
.dbline 296
xcall _turn_left
.dbline 296
ldi R24,1
sts _turn_state0,R24
.dbline 296
xjmp L82
L81:
.dbline 297
; else if(PINC==0x03)//若左边无信号
in R24,0x13
cpi R24,3
brne L83
.dbline 298
; {turn_right(); turn_state1=1;} //右转
.dbline 298
xcall _turn_right
.dbline 298
ldi R24,1
sts _turn_state1,R24
.dbline 298
xjmp L84
L83:
.dbline 299
; else if(PINC==0x04)//若右边和中间均无信号
in R24,0x13
cpi R24,4
brne L85
.dbline 300
; { turn_left();turn_state0=1;} //左转
.dbline 300
xcall _turn_left
.dbline 300
ldi R24,1
sts _turn_state0,R24
.dbline 300
xjmp L86
L85:
.dbline 301
; else if(PINC==0x01)//若左边和中间均无信号
in R24,0x13
cpi R24,1
brne L87
.dbline 302
; {turn_right();turn_state1=1;} //右转
.dbline 302
xcall _turn_right
.dbline 302
ldi R24,1
sts _turn_state1,R24
.dbline 302
xjmp L88
L87:
.dbline 303
; else if((turn_state0==1)&&(PINC==0))//若三个均无信号
lds R24,_turn_state0
cpi R24,1
brne L89
in R2,0x13
tst R2
brne L89
.dbline 304
; turn_left(); //左转半圈
xcall _turn_left
xjmp L90
L89:
.dbline 305
; else if((turn_state1==1)&&(PINC==0))
lds R24,_turn_state1
cpi R24,1
brne L91
in R2,0x13
tst R2
brne L91
.dbline 306
; turn_right();
xcall _turn_right
xjmp L92
L91:
.dbline 308
; else
; run();
xcall _run
L92:
L90:
L88:
L86:
L84:
L82:
L79:
.dbline -2
L77:
.dbline 0 ; func end
ret
.dbsym l pinc 1 c
.dbend
.dbfunc e trace_light_init _trace_light_init fV
.even
_trace_light_init::
.dbline -1
.dbline 316
; }
; ///////////////////寻找黑线////////////////////////////////////////
;
;
;
; ////////////////////探测光源函数///////////////////////////////////
; void trace_light_init(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -