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

📄 boat.lst

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
    016F 8020      LDD	R2,Z+0
    0170 B82C      OUT	0x0C,R2
    0171 9563      INC	R22
    0172 1764      CP	R22,R20
    0173 F398      BCS	0x0167
(0196)   		}
(0197)  	}
(0198) 	SEI();
    0174 9478      BSET	7
(0199) }
    0175 940E045F  CALL	pop_gset3
    0177 940E0498  CALL	pop_lset
    0179 9518      RETI
(0200) 
(0201) //call this routine to initialise all peripherals
(0202) void init_devices(void)
(0203) {
(0204) 	//stop errant interrupts until set up
(0205) 	CLI(); //disable all interrupts
_init_devices:
    017A 94F8      BCLR	7
(0206) 	port_init();
    017B DF20      RCALL	_port_init
(0207) 	timer1_init();
    017C DF2D      RCALL	_timer1_init
(0208) 	timer2_init();
    017D DF3B      RCALL	_timer2_init
(0209) 	uart0_init();
    017E DF44      RCALL	_uart0_init
(0210) 
(0211) 	MCUCR = 0x00;
    017F 2422      CLR	R2
    0180 BE25      OUT	0x35,R2
(0212) 	GICR  = 0x00;
    0181 BE2B      OUT	0x3B,R2
(0213) 	TIMSK = 0x40; //timer interrupt sources
    0182 E480      LDI	R24,0x40
    0183 BF89      OUT	0x39,R24
(0214) 	SEI(); //re-enable interrupts
    0184 9478      BSET	7
(0215) 	//all peripherals are now initialised
(0216) }
    0185 9508      RET
(0217) 
(0218) /**************************** PWM调速控制模块 ********************************/
(0219) 
(0220) //PWM控制器,电机控制的底层操作代码
(0221) void pwm_ctrler( trap *pt_l, trap *pt_r )
(0222) {
(0223)  	//左电机加减速梯形图控制器
(0224) 	if ( OCR1A <= pt_l->step )			//当速度减少到一定值时
_pwm_ctrler:
  pt_r                 --> R18
  pt_l                 --> R16
    0186 01F8      MOVW	R30,R16
    0187 8422      LDD	R2,Z+10
    0188 8433      LDD	R3,Z+11
    0189 B44A      IN	R4,0x2A
    018A B45B      IN	R5,0x2B
    018B 1424      CP	R2,R4
    018C 0435      CPC	R3,R5
    018D F408      BCC	0x018F
    018E C04F      RJMP	0x01DE
(0225) 	{
(0226) 		OCR1A = pt_l->step;				//保持,高频润滑
    018F 01F8      MOVW	R30,R16
    0190 8422      LDD	R2,Z+10
    0191 8433      LDD	R3,Z+11
    0192 BC3B      OUT	0x2B,R3
    0193 BC2A      OUT	0x2A,R2
(0227) 		if ( pt_l->des_speed == 0 ){	//当期望值为0时的处理
    0194 01F8      MOVW	R30,R16
    0195 8020      LDD	R2,Z+0
    0196 8031      LDD	R3,Z+1
    0197 2022      TST	R2
    0198 F449      BNE	0x01A2
    0199 2033      TST	R3
    019A F439      BNE	0x01A2
(0228) 			pt_l->real_speed = 0;
    019B 2422      CLR	R2
    019C 2433      CLR	R3
    019D 01F8      MOVW	R30,R16
    019E 8233      STD	Z+3,R3
    019F 8222      STD	Z+2,R2
(0229) 			SET_L_DIR;
    01A0 9AC0      SBI	0x18,0
(0230) 		} else{
    01A1 C0BD      RJMP	0x025F
(0231) 			if ( pt_l->des_speed > 0 )	SET_L_DIR;
    01A2 2422      CLR	R2
    01A3 2433      CLR	R3
    01A4 01F8      MOVW	R30,R16
    01A5 8040      LDD	R4,Z+0
    01A6 8051      LDD	R5,Z+1
    01A7 1424      CP	R2,R4
    01A8 0435      CPC	R3,R5
    01A9 F414      BGE	0x01AC
    01AA 9AC0      SBI	0x18,0
    01AB C001      RJMP	0x01AD
(0232) 			else	RST_L_DIR;
    01AC 98C0      CBI	0x18,0
(0233) 			if ( ++ pt_l->counter >= 400 ){
    01AD 01C8      MOVW	R24,R16
    01AE 9608      ADIW	R24,0x8
    01AF 01FC      MOVW	R30,R24
    01B0 8180      LDD	R24,Z+0
    01B1 8191      LDD	R25,Z+1
    01B2 9601      ADIW	R24,1
    01B3 012C      MOVW	R4,R24
    01B4 8251      STD	Z+1,R5
    01B5 8240      STD	Z+0,R4
    01B6 3980      CPI	R24,0x90
    01B7 E0E1      LDI	R30,1
    01B8 079E      CPC	R25,R30
    01B9 F408      BCC	0x01BB
    01BA C0A4      RJMP	0x025F
(0234) 				DDRD |= BIT(PD5);		//刷新PD5为输出
    01BB 9A8D      SBI	0x11,5
(0235) 				OCR1A = pt_l->step + 1;
    01BC 01F8      MOVW	R30,R16
    01BD 8582      LDD	R24,Z+10
    01BE 8593      LDD	R25,Z+11
    01BF 9601      ADIW	R24,1
    01C0 BD9B      OUT	0x2B,R25
    01C1 BD8A      OUT	0x2A,R24
(0236) 				if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A);	//需要强制类型转换吗?
    01C2 2422      CLR	R2
    01C3 2433      CLR	R3
    01C4 01F8      MOVW	R30,R16
    01C5 8040      LDD	R4,Z+0
    01C6 8051      LDD	R5,Z+1
    01C7 1424      CP	R2,R4
    01C8 0435      CPC	R3,R5
    01C9 F42C      BGE	0x01CF
    01CA B42A      IN	R2,0x2A
    01CB B43B      IN	R3,0x2B
    01CC 8233      STD	Z+3,R3
    01CD 8222      STD	Z+2,R2
    01CE C009      RJMP	0x01D8
(0237) 				else pt_l->real_speed = -(int)(OCR1A);
    01CF B58A      IN	R24,0x2A
    01D0 B59B      IN	R25,0x2B
    01D1 9580      COM	R24
    01D2 9590      COM	R25
    01D3 5F8F      SUBI	R24,0xFF
    01D4 4F9F      SBCI	R25,0xFF
    01D5 01F8      MOVW	R30,R16
    01D6 8393      STD	Z+3,R25
    01D7 8382      STD	Z+2,R24
(0238) 				pt_l->counter = 0;		//定时计数器清零
    01D8 2422      CLR	R2
    01D9 2433      CLR	R3
    01DA 01F8      MOVW	R30,R16
    01DB 8631      STD	Z+9,R3
    01DC 8620      STD	Z+8,R2
(0239) 			}
(0240) 		}
(0241) 	} else if ( pt_l->real_speed < pt_l->des_speed ){
    01DD C081      RJMP	0x025F
    01DE 01F8      MOVW	R30,R16
    01DF 8020      LDD	R2,Z+0
    01E0 8031      LDD	R3,Z+1
    01E1 8042      LDD	R4,Z+2
    01E2 8053      LDD	R5,Z+3
    01E3 1442      CP	R4,R2
    01E4 0453      CPC	R5,R3
    01E5 F00C      BLT	0x01E7
    01E6 C038      RJMP	0x021F
(0242) 		if ( ++ pt_l->counter == pt_l->acce_count ){
    01E7 01C8      MOVW	R24,R16
    01E8 9608      ADIW	R24,0x8
    01E9 01FC      MOVW	R30,R24
    01EA 8180      LDD	R24,Z+0
    01EB 8191      LDD	R25,Z+1
    01EC 9601      ADIW	R24,1
    01ED 012C      MOVW	R4,R24
    01EE 8251      STD	Z+1,R5
    01EF 8240      STD	Z+0,R4
    01F0 01F8      MOVW	R30,R16
    01F1 8024      LDD	R2,Z+4
    01F2 8035      LDD	R3,Z+5
    01F3 1582      CP	R24,R2
    01F4 0593      CPC	R25,R3
    01F5 F009      BEQ	0x01F7
    01F6 C068      RJMP	0x025F
(0243) 			pt_l->real_speed += pt_l->step;	//加速梯形图
    01F7 01C8      MOVW	R24,R16
    01F8 9602      ADIW	R24,2
    01F9 01F8      MOVW	R30,R16
    01FA 8442      LDD	R4,Z+10
    01FB 8453      LDD	R5,Z+11
    01FC 01FC      MOVW	R30,R24
    01FD 8060      LDD	R6,Z+0
    01FE 8071      LDD	R7,Z+1
    01FF 0C64      ADD	R6,R4
    0200 1C75      ADC	R7,R5
    0201 8271      STD	Z+1,R7
    0202 8260      STD	Z+0,R6
(0244) 			if ( pt_l->real_speed < 0 ){	//取绝对值
    0203 01F8      MOVW	R30,R16
    0204 8182      LDD	R24,Z+2
    0205 8193      LDD	R25,Z+3
    0206 3080      CPI	R24,0
    0207 E0E0      LDI	R30,0
    0208 079E      CPC	R25,R30
    0209 F454      BGE	0x0214
(0245) 				OCR1A = (uint)(-pt_l->real_speed);
    020A 01F8      MOVW	R30,R16
    020B 8182      LDD	R24,Z+2
    020C 8193      LDD	R25,Z+3
    020D 9580      COM	R24
    020E 9590      COM	R25
    020F 5F8F      SUBI	R24,0xFF
    0210 4F9F      SBCI	R25,0xFF
    0211 BD9B      OUT	0x2B,R25
    0212 BD8A      OUT	0x2A,R24
(0246) 			} else {
    0213 C005      RJMP	0x0219
(0247) 				OCR1A = (uint)(pt_l->real_speed);
    0214 01F8      MOVW	R30,R16
    0215 8022      LDD	R2,Z+2
    0216 8033      LDD	R3,Z+3
    0217 BC3B      OUT	0x2B,R3
    0218 BC2A      OUT	0x2A,R2
(0248) 			}
(0249) 			pt_l->counter = 0;				//计数器清零
    0219 2422      CLR	R2
    021A 2433      CLR	R3
    021B 01F8      MOVW	R30,R16
    021C 8631      STD	Z+9,R3
    021D 8620      STD	Z+8,R2
(0250) 		}
(0251) 	} else if( pt_l->real_speed > pt_l->des_speed ){
    021E C040      RJMP	0x025F
    021F 01F8      MOVW	R30,R16
    0220 8020      LDD	R2,Z+0
    0221 8031      LDD	R3,Z+1
    0222 8042      LDD	R4,Z+2
    0223 8053      LDD	R5,Z+3
    0224 1424      CP	R2,R4
    0225 0435      CPC	R3,R5
    0226 F00C      BLT	0x0228
    0227 C037      RJMP	0x025F
(0252) 		if ( ++ pt_l->counter == pt_l->dece_count ){
    0228 01C8      MOVW	R24,R16
    0229 9608      ADIW	R24,0x8
    022A 01FC      MOVW	R30,R24
    022B 8180      LDD	R24,Z+0
    022C 8191      LDD	R25,Z+1
    022D 9601      ADIW	R24,1
    022E 012C      MOVW	R4,R24
    022F 8251      STD	Z+1,R5
    0230 8240      STD	Z+0,R4
    0231 01F8      MOVW	R30,R16
    0232 8026      LDD	R2,Z+6
    0233 8037      LDD	R3,Z+7
    0234 1582      CP	R24,R2
    0235 0593      CPC	R25,R3
    0236 F009      BEQ	0x0238
    0237 C027      RJMP	0x025F
(0253) 			pt_l->real_speed -= pt_l->step;
    0238 01C8      MOVW	R24,R16
    0239 9602      ADIW	R24,2
    023A 01F8      MOVW	R30,R16
    023B 8442      LDD	R4,Z+10
    023C 8453      LDD	R5,Z+11
    023D 01FC      MOVW	R30,R24
    023E 8060      LDD	R6,Z+0
    023F 8071      LDD	R7,Z+1
    0240 1864      SUB	R6,R4
    0241 0875      SBC	R7,R5
    0242 8271      STD	Z+1,R7
    0243 8260      STD	Z+0,R6
(0254) 			if ( pt_l->real_speed < 0 ){	//取绝对值
    0244 01F8      MOVW	R30,R16
    0245 8182      LDD	R24,Z+2
    0246 8193      LDD	R25,Z+3
    0247 3080      CPI	R24,0
    0248 E0E0      LDI	R30,0
    0249 079E      CPC	R25,R30
    024A F454      BGE	0x0255
(0255) 				OCR1A = (uint)(-pt_l->real_speed);
    024B 01F8      MOVW	R30,R16
    024C 8182      LDD	R24,Z+2
    024D 8193      LDD	R25,Z+3
    024E 9580      COM	R24
    024F 9590      COM	R25
    0250 5F8F      SUBI	R24,0xFF
    0251 4F9F      SBCI	R25,0xFF
    0252 BD9B      OUT	0x2B,R25
    0253 BD8A      OUT	0x2A,R24
(0256) 			} else {
    0254 C005      RJMP	0x025A
(0257) 				OCR1A = (uint)(pt_l->real_speed);
    0255 01F8      MOVW	R30,R16
    0256 8022      LDD	R2,Z+2
    0257 8033      LDD	R3,Z+3
    0258 BC3B      OUT	0x2B,R3
    0259 BC2A      OUT	0x2A,R2
(0258) 			}
(0259) 			pt_l->counter = 0;
    025A 2422      CLR	R2
    025B 2433      CLR	R3
    025C 01F8      MOVW	R30,R16
    025D 8631      STD	Z+9,R3
    025E 8620      STD	Z+8,R2
(0260) 		}
(0261) 	}
(0262) 	//右电机加减速梯形图控制器
(0263) 	if ( OCR1B <= pt_r->step )			//当速度减少到一定值时
    025F 01F9      MOVW	R30,R18
    0260 8422      LDD	R2,Z+10
    0261 8433      LDD	R3,Z+11
    0262 B448      IN	R4,0x28
    0263 B459      IN	R5,0x29
    0264 1424      CP	R2,R4
    0265 0435      CPC	R3,R5
    0266 F408      BCC	0x0268
    0267 C04F      RJMP	0x02B7
(0264) 	{
(0265) 		OCR1B = pt_r->step;				//保持,高频润滑
    0268 01F9      MOVW	R30,R18
    0269 8422      LDD	R2,Z+10
    026A 8433      LDD	R3,Z+11
    026B BC39      OUT	0x29,R3
    026C BC28      OUT	0x28,R2
(0266) 		if ( pt_r->des_speed == 0 ){	//当期望值为0时的处理
    026D 01F9      MOVW	R30,R18
    026E 8020      LDD	R2,Z+0
    026F 8031      LDD	R3,Z+1
    0270 2022      TST	R2
    0271 F449      BNE	0x027B
    0272 2033      TST	R3
    0273 F439      BNE	0x027B
(0267) 			pt_r->real_speed = 0;
    0274 2422      CLR	R2
    0275 2433      CLR	R3
    0276 01F9      MOVW	R30,R18
    0277 8233      STD	Z+3,R3
    0278 8222      STD	Z+2,R2
(0268) 			SET_R_DIR;
    0279 9AC1      SBI	0x18,1
(0269) 		} else{
    027A C0BD      RJMP	0x0338
(0270) 			if ( pt_r->des_speed > 0 )	SET_R_DIR;
    027B 2422      CLR	R2
    027C 2433      CLR	R3
    027D 01F9      MOVW	R30,R18
    027E 8040      LDD	R4,Z+0
    027F 8051      LDD	R5,Z+1
    0280 1424      CP	R2,R4
    0281 0435      CPC	R3,R5
    0282 F414      BGE	0x0285
    0283 9AC1      SBI	0x18,1
    0284 C001      RJMP	0x0286
(0271) 			else	RST_R_DIR;
    0285 98C1      CBI	0x18,1
(0272) 			if ( ++ pt_r->counter >= 400 ){
    0286 01C9      MOVW	R24,R18
    0287 9608      ADIW	R24,0x8
    0288 01FC      MOVW	R30,R24
    0289 8180      LDD	R24,Z+0
    028A 8191      LDD	R25,Z+1
    028B 9601      ADIW	R24,1
    028C 012C      MOVW	R4,R24
    028D 8251      STD	Z+1,R5
    028E 8240      STD	Z+0,R4
    028F 3980      CPI	R24,0x90
    0290 E0E1      LDI	R30,1
    0291 079E      CPC	R25,R30
    0292 F408      BCC	0x0294
    0293 C0A4      RJMP	0x0338
(0273) 				DDRD |= BIT(PD4);		//刷新PD5为输出
    0294 9A8C      SBI	0x11,4
(0274) 				OCR1B = pt_r->step + 1;
    0295 01F9      MOVW	R30,R18
    0296 8582      LDD	R24,Z+10
    0297 8593      LDD	R25,Z+11
    0298 9601      ADIW	R24,1
    0299 BD99      OUT	0x29,R25
    029A BD88      OUT	0x28,R24
(0275) 				if( pt_r->des_speed > 0 ) pt_r->real_speed = (int)(OCR1B);	//需要强制类型转换吗?
    029B 2422      CLR	R2
    029C 2433      CLR	R3
    029D 01F9      MOVW	R30,R18
    029E 8040      LDD	R4,Z+0
    029F 8051      LDD	R5,Z+1
    02A0 1424      CP	R2,R4
    02A1 0435      CPC	R3,R5
    02A2 F42C      BGE	0x02A8
    02A3 B428      IN	R2,0x28
    02A4 B439      IN	R3,0x29
    02A5 8233      STD	Z+3,R3
    02A6 8222      STD	Z+2,R2
    02A7 C009      RJMP	0x02B1
(0276) 				else pt_r->real_speed = -(int)(OCR1B);
    02A8 B588      IN	R24,0x28
    02A9 B599      IN	R25,0x29
    02AA 9580      COM	R24
    02AB 9590      COM	R25
    02AC 5F8F      SUBI	R24,0xFF
    02AD 4F9F      SBCI	R25,0xFF
    02AE 01F9      MOVW	R30,R18
    02AF 8393      STD	Z+3,R25
    02B0 8382      STD	Z+2,R24
(0277) 				pt_r->counter = 0;		//定时计数器清零
    02B1 2422      CLR	R2
    02B2 2433      CLR	R3
    02B3 01F9      MOVW	R30,R18
    02B4 8631      STD	Z+9,R3
    02B5 8620      STD	Z+8,R2
(0278) 			}
(0279) 		}
(0280) 	} else if ( pt_r->real_speed < pt_r->des_speed ){
    02B6 C081      RJMP	0x0338
    02B7 01F9      MOVW	R30,R18
    02B8 8020      LDD	R2,Z+0
    02B9 8031      LDD	R3,Z+1
    02BA 8042      LDD	R4,Z+2
    02BB 8053      LDD	R5,Z+3
    02BC 1442      CP	R4,R2
    02BD 0453      CPC	R5,R3
    02BE F00C      BLT	0x02C0
    02BF C038      RJMP	0x02F8
(0281) 		if ( ++ pt_r->counter == pt_r->acce_count ){
    02C0 01C9      MOVW	R24,R18
    02C1 9608      ADIW	R24,0x8
    02C2 01FC      MOVW	R30,R24
    02C3 8180      LDD	R24,Z+0
    02C4 8191      LDD	R25,Z+1
    02C5 9601      ADIW	R24,1
    02C6 012C      MOVW	R4,R24
    02C7 8251      STD	Z+1,R5
    02C8 8240      STD	Z+0,R4
    02C9 01F9      MOVW	R30,R18
    02CA 8024      LDD	R2,Z+4
    02CB 8035      LDD	R3,Z+5
    02CC 1582      CP	R24,R2
    02CD 0593      CPC	R25,R3
    02CE F009      BEQ	0x02D0
    02CF C068      RJMP	0x0338
(0282) 			pt_r->real_speed += pt_r->step;	//加速梯形图
    02D0 01C9      MOVW	R24,R18
    02D1 9602      ADIW	R24,2
    02D2 01F9      MOVW	R30,R18
    02D3 8442      LDD	R4,Z+10
    02D4 8453      LDD	R5,Z+11
    02D5 01FC      MOVW	R30,R24
    02D6 8060      LDD	R6,Z+0
    02D7 8071      LDD	R7,Z+1
    02D8 0C64      ADD	R6,R4
    02D9 1C75      ADC	R7,R5
    02DA 8271      STD	Z+1,R7
    02DB 8260      STD	Z+0,R6
(0283) 			if ( pt_r->real_speed < 0 ){	//取绝对值
    02DC 01F9      MOVW	R30,R18
    02DD 8182      LDD	R24,Z+2
    02DE 8193      LDD	R25,Z+3
    02DF 3080      CPI	R24,0
    02E0 E0E0      LDI	R30,0
    02E1 079E      CPC	R25,R30
    02E2 F454      BGE	0x02ED
(0284) 				OCR1B = (uint)(-pt_r->real_speed);
    02E3 01F9      MOVW	R30,R18
    02E4 8182      LDD	R24,Z+2
    02E5 8193      LDD	R25,Z+3

⌨️ 快捷键说明

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