⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boat.lst

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
    02E6 9580      COM	R24
    02E7 9590      COM	R25
    02E8 5F8F      SUBI	R24,0xFF
    02E9 4F9F      SBCI	R25,0xFF
    02EA BD99      OUT	0x29,R25
    02EB BD88      OUT	0x28,R24
(0285) 			} else {
    02EC C005      RJMP	0x02F2
(0286) 				OCR1B = (uint)(pt_r->real_speed);
    02ED 01F9      MOVW	R30,R18
    02EE 8022      LDD	R2,Z+2
    02EF 8033      LDD	R3,Z+3
    02F0 BC39      OUT	0x29,R3
    02F1 BC28      OUT	0x28,R2
(0287) 			}
(0288) 			pt_r->counter = 0;				//计数器清零
    02F2 2422      CLR	R2
    02F3 2433      CLR	R3
    02F4 01F9      MOVW	R30,R18
    02F5 8631      STD	Z+9,R3
    02F6 8620      STD	Z+8,R2
(0289) 		}
(0290) 	} else if( pt_r->real_speed > pt_r->des_speed ){
    02F7 C040      RJMP	0x0338
    02F8 01F9      MOVW	R30,R18
    02F9 8020      LDD	R2,Z+0
    02FA 8031      LDD	R3,Z+1
    02FB 8042      LDD	R4,Z+2
    02FC 8053      LDD	R5,Z+3
    02FD 1424      CP	R2,R4
    02FE 0435      CPC	R3,R5
    02FF F00C      BLT	0x0301
    0300 C037      RJMP	0x0338
(0291) 		if ( ++ pt_r->counter == pt_r->dece_count ){
    0301 01C9      MOVW	R24,R18
    0302 9608      ADIW	R24,0x8
    0303 01FC      MOVW	R30,R24
    0304 8180      LDD	R24,Z+0
    0305 8191      LDD	R25,Z+1
    0306 9601      ADIW	R24,1
    0307 012C      MOVW	R4,R24
    0308 8251      STD	Z+1,R5
    0309 8240      STD	Z+0,R4
    030A 01F9      MOVW	R30,R18
    030B 8026      LDD	R2,Z+6
    030C 8037      LDD	R3,Z+7
    030D 1582      CP	R24,R2
    030E 0593      CPC	R25,R3
    030F F009      BEQ	0x0311
    0310 C027      RJMP	0x0338
(0292) 			pt_r->real_speed -= pt_r->step;
    0311 01C9      MOVW	R24,R18
    0312 9602      ADIW	R24,2
    0313 01F9      MOVW	R30,R18
    0314 8442      LDD	R4,Z+10
    0315 8453      LDD	R5,Z+11
    0316 01FC      MOVW	R30,R24
    0317 8060      LDD	R6,Z+0
    0318 8071      LDD	R7,Z+1
    0319 1864      SUB	R6,R4
    031A 0875      SBC	R7,R5
    031B 8271      STD	Z+1,R7
    031C 8260      STD	Z+0,R6
(0293) 			if ( pt_r->real_speed < 0 ){	//取绝对值
    031D 01F9      MOVW	R30,R18
    031E 8182      LDD	R24,Z+2
    031F 8193      LDD	R25,Z+3
    0320 3080      CPI	R24,0
    0321 E0E0      LDI	R30,0
    0322 079E      CPC	R25,R30
    0323 F454      BGE	0x032E
(0294) 				OCR1B = (uint)(-pt_r->real_speed);
    0324 01F9      MOVW	R30,R18
    0325 8182      LDD	R24,Z+2
    0326 8193      LDD	R25,Z+3
    0327 9580      COM	R24
    0328 9590      COM	R25
    0329 5F8F      SUBI	R24,0xFF
    032A 4F9F      SBCI	R25,0xFF
    032B BD99      OUT	0x29,R25
    032C BD88      OUT	0x28,R24
(0295) 			} else {
    032D C005      RJMP	0x0333
(0296) 				OCR1B = (uint)(pt_r->real_speed);
    032E 01F9      MOVW	R30,R18
    032F 8022      LDD	R2,Z+2
    0330 8033      LDD	R3,Z+3
    0331 BC39      OUT	0x29,R3
    0332 BC28      OUT	0x28,R2
(0297) 			}
(0298) 			pt_r->counter = 0;
    0333 2422      CLR	R2
    0334 2433      CLR	R3
    0335 01F9      MOVW	R30,R18
    0336 8631      STD	Z+9,R3
    0337 8620      STD	Z+8,R2
(0299) 		}
(0300) 	}
(0301) }
    0338 9508      RET
(0302) 
(0303) //电机速度控制接口函数
(0304) void trap_ctrler( int l_des_speed, int r_des_speed )
(0305) {
(0306) 	l_trap.acce_count = L_ACCE_COUNT;			//设定左电机
_trap_ctrler:
  r_des_speed          --> R18
  l_des_speed          --> R16
    0339 E082      LDI	R24,2
    033A E090      LDI	R25,0
    033B 939000A2  STS	0xA2,R25
    033D 938000A1  STS	0xA1,R24
(0307) 	l_trap.dece_count = L_DECE_COUNT;
    033F 939000A4  STS	0xA4,R25
    0341 938000A3  STS	0xA3,R24
(0308) 	l_trap.step = L_STEP;
    0343 E081      LDI	R24,1
    0344 939000A8  STS	0xA8,R25
    0346 938000A7  STS	0xA7,R24
(0309) 	if ( l_des_speed > ( MAX_SPEED - l_trap.step ) ){			//给定值限幅处理
    0348 011C      MOVW	R2,R24
    0349 EF8E      LDI	R24,0xFE
    034A E091      LDI	R25,1
    034B 1982      SUB	R24,R2
    034C 0993      SBC	R25,R3
    034D 1780      CP	R24,R16
    034E 0791      CPC	R25,R17
    034F F44C      BGE	0x0359
(0310) 		l_trap.des_speed = MAX_SPEED - l_trap.step;
    0350 EF8E      LDI	R24,0xFE
    0351 E091      LDI	R25,1
    0352 1982      SUB	R24,R2
    0353 0993      SBC	R25,R3
    0354 9390009E  STS	_l_trap+1,R25
    0356 9380009D  STS	_l_trap,R24
(0311) 	} else if ( l_des_speed < ( MIN_SPEED + l_trap.step ) ){
    0358 C018      RJMP	0x0371
    0359 918000A7  LDS	R24,0xA7
    035B 919000A8  LDS	R25,0xA8
    035D 5F8E      SUBI	R24,0xFE
    035E 4091      SBCI	R25,1
    035F 1708      CP	R16,R24
    0360 0719      CPC	R17,R25
    0361 F45C      BGE	0x036D
(0312) 		l_trap.des_speed = MIN_SPEED + l_trap.step;
    0362 918000A7  LDS	R24,0xA7
    0364 919000A8  LDS	R25,0xA8
    0366 5F8E      SUBI	R24,0xFE
    0367 4091      SBCI	R25,1
    0368 9390009E  STS	_l_trap+1,R25
    036A 9380009D  STS	_l_trap,R24
(0313) 	} else {
    036C C004      RJMP	0x0371
(0314) 		l_trap.des_speed = l_des_speed;
    036D 9310009E  STS	_l_trap+1,R17
    036F 9300009D  STS	_l_trap,R16
(0315) 	}
(0316) 	r_trap.acce_count = R_ACCE_COUNT;			//设定右电机
    0371 E082      LDI	R24,2
    0372 E090      LDI	R25,0
    0373 93900096  STS	0x96,R25
    0375 93800095  STS	0x95,R24
(0317) 	r_trap.dece_count = R_DECE_COUNT;
    0377 93900098  STS	0x98,R25
    0379 93800097  STS	0x97,R24
(0318) 	r_trap.step = R_STEP;
    037B E081      LDI	R24,1
    037C 9390009C  STS	0x9C,R25
    037E 9380009B  STS	0x9B,R24
(0319) 	if ( r_des_speed > ( MAX_SPEED - r_trap.step ) ){			//给定值限幅处理
    0380 011C      MOVW	R2,R24
    0381 EF8E      LDI	R24,0xFE
    0382 E091      LDI	R25,1
    0383 1982      SUB	R24,R2
    0384 0993      SBC	R25,R3
    0385 1782      CP	R24,R18
    0386 0793      CPC	R25,R19
    0387 F44C      BGE	0x0391
(0320) 		r_trap.des_speed = MAX_SPEED - r_trap.step;
    0388 EF8E      LDI	R24,0xFE
    0389 E091      LDI	R25,1
    038A 1982      SUB	R24,R2
    038B 0993      SBC	R25,R3
    038C 93900092  STS	_r_trap+1,R25
    038E 93800091  STS	_r_trap,R24
(0321) 	} else if ( r_des_speed < ( MIN_SPEED + r_trap.step ) ){
    0390 C018      RJMP	0x03A9
    0391 9180009B  LDS	R24,0x9B
    0393 9190009C  LDS	R25,0x9C
    0395 5F8E      SUBI	R24,0xFE
    0396 4091      SBCI	R25,1
    0397 1728      CP	R18,R24
    0398 0739      CPC	R19,R25
    0399 F45C      BGE	0x03A5
(0322) 		r_trap.des_speed = MIN_SPEED + r_trap.step;
    039A 9180009B  LDS	R24,0x9B
    039C 9190009C  LDS	R25,0x9C
    039E 5F8E      SUBI	R24,0xFE
    039F 4091      SBCI	R25,1
    03A0 93900092  STS	_r_trap+1,R25
    03A2 93800091  STS	_r_trap,R24
(0323) 	} else {
    03A4 C004      RJMP	0x03A9
(0324) 		r_trap.des_speed = r_des_speed;
    03A5 93300092  STS	_r_trap+1,R19
    03A7 93200091  STS	_r_trap,R18
(0325) 	}
(0326) }
    03A9 9508      RET
_key_process:
  key_buf              --> R20
    03AA 940E0462  CALL	push_gset1
    03AC 01A8      MOVW	R20,R16
(0327) 
(0328) /**************************** 键盘信号处理模块 ********************************/
(0329) void key_process( uint key_buf )
(0330) {
(0331) 	if ( key_buf & BIT( L_STOP_KEY ) ){
    03AD FF54      SBRS	R21,4
    03AE C01B      RJMP	0x03CA
(0332) 		l_temp_speed = l_trap.des_speed;
    03AF 9020009D  LDS	R2,_l_trap
    03B1 9030009E  LDS	R3,_l_trap+1
    03B3 92300090  STS	_l_temp_speed+1,R3
    03B5 9220008F  STS	_l_temp_speed,R2
(0333) 		l_trap.des_speed = 0;
    03B7 2422      CLR	R2
    03B8 2433      CLR	R3
    03B9 9230009E  STS	_l_trap+1,R3
    03BB 9220009D  STS	_l_trap,R2
(0334) 		trap_ctrler( 0, r_trap.des_speed );
    03BD 91200091  LDS	R18,_r_trap
    03BF 91300092  LDS	R19,_r_trap+1
    03C1 2700      CLR	R16
    03C2 2711      CLR	R17
    03C3 DF75      RCALL	_trap_ctrler
(0335) 		key_prev_status |= BIT( L_STOP_KEY_PRESS );
    03C4 91800060  LDS	R24,_key_prev_status
    03C6 6180      ORI	R24,0x10
    03C7 93800060  STS	_key_prev_status,R24
(0336) 	} else if ( ( key_buf & BIT( L_RESUME_KEY ) ) && ( key_prev_status & BIT( L_STOP_KEY_PRESS ) ) ){
    03C9 C038      RJMP	0x0402
    03CA FF50      SBRS	R21,0
    03CB C01B      RJMP	0x03E7
    03CC 90200060  LDS	R2,_key_prev_status
    03CE FE24      SBRS	R2,4
    03CF C017      RJMP	0x03E7
(0337) 		l_trap.des_speed = l_temp_speed;
    03D0 9020008F  LDS	R2,_l_temp_speed
    03D2 90300090  LDS	R3,_l_temp_speed+1
    03D4 9230009E  STS	_l_trap+1,R3
    03D6 9220009D  STS	_l_trap,R2
(0338) 		trap_ctrler( l_trap.des_speed, r_trap.des_speed );
    03D8 91200091  LDS	R18,_r_trap
    03DA 91300092  LDS	R19,_r_trap+1
    03DC 9100009D  LDS	R16,_l_trap
    03DE 9110009E  LDS	R17,_l_trap+1
    03E0 DF58      RCALL	_trap_ctrler
(0339) 		key_prev_status &= ~BIT( L_STOP_KEY_PRESS );
    03E1 91800060  LDS	R24,_key_prev_status
    03E3 7E8F      ANDI	R24,0xEF
    03E4 93800060  STS	_key_prev_status,R24
(0340) 	} else if ( key_buf & BIT( L_ACCE_KEY ) ){
    03E6 C01B      RJMP	0x0402
    03E7 FF40      SBRS	R20,0
    03E8 C00C      RJMP	0x03F5
(0341) 		trap_ctrler( l_trap.des_speed + SPEED_INC, r_trap.des_speed );
    03E9 91200091  LDS	R18,_r_trap
    03EB 91300092  LDS	R19,_r_trap+1
    03ED 9100009D  LDS	R16,_l_trap
    03EF 9110009E  LDS	R17,_l_trap+1
    03F1 5F0B      SUBI	R16,0xFB
    03F2 4F1F      SBCI	R17,0xFF
    03F3 DF45      RCALL	_trap_ctrler
(0342) 	} else if ( key_buf & BIT( L_DECE_KEY ) ){
    03F4 C00D      RJMP	0x0402
    03F5 FF44      SBRS	R20,4
    03F6 C00B      RJMP	0x0402
(0343) 		trap_ctrler( l_trap.des_speed - SPEED_INC, r_trap.des_speed );
    03F7 91200091  LDS	R18,_r_trap
    03F9 91300092  LDS	R19,_r_trap+1
    03FB 9100009D  LDS	R16,_l_trap
    03FD 9110009E  LDS	R17,_l_trap+1
    03FF 5005      SUBI	R16,5
    0400 4010      SBCI	R17,0
    0401 DF37      RCALL	_trap_ctrler
(0344) 	}
(0345) 
(0346) 	if ( key_buf & BIT( R_STOP_KEY ) ){
    0402 FF57      SBRS	R21,7
    0403 C01B      RJMP	0x041F
(0347) 		r_temp_speed = r_trap.des_speed;
    0404 90200091  LDS	R2,_r_trap
    0406 90300092  LDS	R3,_r_trap+1
    0408 9230008E  STS	_r_temp_speed+1,R3
    040A 9220008D  STS	_r_temp_speed,R2
(0348) 		r_trap.des_speed = 0;
    040C 2422      CLR	R2
    040D 2433      CLR	R3
    040E 92300092  STS	_r_trap+1,R3
    0410 92200091  STS	_r_trap,R2
(0349) 		trap_ctrler( l_trap.des_speed, 0 );
    0412 2722      CLR	R18
    0413 2733      CLR	R19
    0414 9100009D  LDS	R16,_l_trap
    0416 9110009E  LDS	R17,_l_trap+1
    0418 DF20      RCALL	_trap_ctrler
(0350) 		key_prev_status |= BIT( R_STOP_KEY_PRESS );
    0419 91800060  LDS	R24,_key_prev_status
    041B 6081      ORI	R24,1
    041C 93800060  STS	_key_prev_status,R24
(0351) 	} else if ( ( key_buf & BIT( R_RESUME_KEY ) ) && ( key_prev_status & BIT( R_STOP_KEY_PRESS ) ) ){
    041E C038      RJMP	0x0457
    041F FF53      SBRS	R21,3
    0420 C01B      RJMP	0x043C
    0421 90200060  LDS	R2,_key_prev_status
    0423 FE20      SBRS	R2,0
    0424 C017      RJMP	0x043C
(0352) 		r_trap.des_speed = r_temp_speed;
    0425 9020008D  LDS	R2,_r_temp_speed
    0427 9030008E  LDS	R3,_r_temp_speed+1
    0429 92300092  STS	_r_trap+1,R3
    042B 92200091  STS	_r_trap,R2
(0353) 		trap_ctrler( l_trap.des_speed, r_trap.des_speed );
    042D 91200091  LDS	R18,_r_trap
    042F 91300092  LDS	R19,_r_trap+1
    0431 9100009D  LDS	R16,_l_trap
    0433 9110009E  LDS	R17,_l_trap+1
    0435 DF03      RCALL	_trap_ctrler
(0354) 		key_prev_status &= ~BIT( R_STOP_KEY_PRESS );
    0436 91800060  LDS	R24,_key_prev_status
    0438 7F8E      ANDI	R24,0xFE
    0439 93800060  STS	_key_prev_status,R24
(0355) 	} else if ( key_buf & BIT( R_ACCE_KEY ) ){
    043B C01B      RJMP	0x0457
    043C FF43      SBRS	R20,3
    043D C00C      RJMP	0x044A
(0356) 		trap_ctrler( l_trap.des_speed, r_trap.des_speed + SPEED_INC );
    043E 91200091  LDS	R18,_r_trap
    0440 91300092  LDS	R19,_r_trap+1
    0442 5F2B      SUBI	R18,0xFB
    0443 4F3F      SBCI	R19,0xFF
    0444 9100009D  LDS	R16,_l_trap
    0446 9110009E  LDS	R17,_l_trap+1
    0448 DEF0      RCALL	_trap_ctrler
(0357) 	} else if ( key_buf & BIT( R_DECE_KEY ) ){
    0449 C00D      RJMP	0x0457
    044A FF47      SBRS	R20,7
    044B C00B      RJMP	0x0457
(0358) 		trap_ctrler( l_trap.des_speed, r_trap.des_speed - SPEED_INC );
    044C 91200091  LDS	R18,_r_trap
    044E 91300092  LDS	R19,_r_trap+1
    0450 5025      SUBI	R18,5
    0451 4030      SBCI	R19,0
    0452 9100009D  LDS	R16,_l_trap
    0454 9110009E  LDS	R17,_l_trap+1
    0456 DEE2      RCALL	_trap_ctrler
(0359) 	}	
(0360) }
    0457 940E0465  CALL	pop_gset1
    0459 9508      RET
(0361) 
(0362) void main(void)
(0363) {
(0364) 	init_devices();
_main:
    045A DD1F      RCALL	_init_devices
(0365) 	rst_ctrl();
    045B DBF9      RCALL	_rst_ctrl
(0366) 	
(0367) 	do{
(0368) 		WDR();
    045C 95A8      WDR
(0369) 	}while(1);
    045D CFFE      RJMP	0x045C
(0370) }
FILE: <library>
    045E 9508      RET
pop_gset3:
    045F E0E4      LDI	R30,4
    0460 940C0466  JMP	pop
push_gset1:
    0462 935A      ST	R21,-Y
    0463 934A      ST	R20,-Y
    0464 9508      RET
pop_gset1:
    0465 E0E1      LDI	R30,1
pop:
    0466 9149      LD	R20,Y+
    0467 9159      LD	R21,Y+
    0468 FDE0      SBRC	R30,0
    0469 9508      RET
    046A 9169      LD	R22,Y+
    046B 9179      LD	R23,Y+
    046C FDE1      SBRC	R30,1
    046D 9508      RET
    046E 90A9      LD	R10,Y+
    046F 90B9      LD	R11,Y+
    0470 FDE2      SBRC	R30,2
    0471 9508      RET
    0472 90C9      LD	R12,Y+
    0473 90D9      LD	R13,Y+
    0474 FDE3      SBRC	R30,3
    0475 9508      RET
    0476 90E9      LD	R14,Y+
    0477 90F9      LD	R15,Y+
    0478 9508      RET
push_gset2:
    0479 937A      ST	R23,-Y
    047A 936A      ST	R22,-Y
    047B 940C0462  JMP	push_gset1
push_gset3:
    047D 92BA      ST	R11,-Y
    047E 92AA      ST	R10,-Y
    047F 940C0479  JMP	push_gset2
push_lset:
    0481 93FA      ST	R31,-Y
    0482 93EA      ST	R30,-Y
    0483 93BA      ST	R27,-Y
    0484 93AA      ST	R26,-Y
    0485 939A      ST	R25,-Y
    0486 938A      ST	R24,-Y
    0487 933A      ST	R19,-Y
    0488 932A      ST	R18,-Y
    0489 931A      ST	R17,-Y
    048A 930A      ST	R16,-Y
    048B 929A      ST	R9,-Y
    048C 928A      ST	R8,-Y
    048D 927A      ST	R7,-Y
    048E 926A      ST	R6,-Y
    048F 925A      ST	R5,-Y
    0490 924A      ST	R4,-Y
    0491 923A      ST	R3,-Y
    0492 922A      ST	R2,-Y
    0493 921A      ST	R1,-Y
    0494 920A      ST	R0,-Y
    0495 B60F      IN	R0,0x3F
    0496 920A      ST	R0,-Y
    0497 9508      RET
pop_lset:
    0498 9009      LD	R0,Y+
    0499 BE0F      OUT	0x3F,R0
    049A 9009      LD	R0,Y+
    049B 9019      LD	R1,Y+
    049C 9029      LD	R2,Y+
    049D 9039      LD	R3,Y+
    049E 9049      LD	R4,Y+
    049F 9059      LD	R5,Y+
    04A0 9069      LD	R6,Y+
    04A1 9079      LD	R7,Y+
    04A2 9089      LD	R8,Y+
    04A3 9099      LD	R9,Y+
    04A4 9109      LD	R16,Y+
    04A5 9119      LD	R17,Y+
    04A6 9129      LD	R18,Y+
    04A7 9139      LD	R19,Y+
    04A8 9189      LD	R24,Y+
    04A9 9199      LD	R25,Y+
    04AA 91A9      LD	R26,Y+
    04AB 91B9      LD	R27,Y+
    04AC 91E9      LD	R30,Y+
    04AD 91F9      LD	R31,Y+
    04AE 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -