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

📄 boat.s

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 S
📖 第 1 页 / 共 3 页
字号:
L62:
	.dbline 194
	sbis 0xb,5
	rjmp L61
	.dbline 195
	ldi R24,<_tbuf
	ldi R25,>_tbuf
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 196
L58:
	.dbline 193
	inc R22
L60:
	.dbline 193
	cp R22,R20
	brlo L62
	.dbline 197
; 			while( !( UCSRA & BIT( UDRE ) ) );
; 			UDR = tbuf[i];
;   		}
;  	}
L36:
L24:
	.dbline 198
; 	SEI();
	sei
	.dbline -2
	.dbline 199
; }
L22:
	xcall pop_gset3
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r command 10 c
	.dbsym r dataLen 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 203
; 
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
	.dbline 205
; 	//stop errant interrupts until set up
; 	CLI(); //disable all interrupts
	cli
	.dbline 206
; 	port_init();
	xcall _port_init
	.dbline 207
; 	timer1_init();
	xcall _timer1_init
	.dbline 208
; 	timer2_init();
	xcall _timer2_init
	.dbline 209
; 	uart0_init();
	xcall _uart0_init
	.dbline 211
; 
; 	MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 212
; 	GICR  = 0x00;
	out 0x3b,R2
	.dbline 213
; 	TIMSK = 0x40; //timer interrupt sources
	ldi R24,64
	out 0x39,R24
	.dbline 214
; 	SEI(); //re-enable interrupts
	sei
	.dbline -2
	.dbline 216
; 	//all peripherals are now initialised
; }
L64:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e pwm_ctrler _pwm_ctrler fV
	.dbstruct 0 12 _trap
	.dbfield 0 des_speed I
	.dbfield 2 real_speed I
	.dbfield 4 acce_count i
	.dbfield 6 dece_count i
	.dbfield 8 counter i
	.dbfield 10 step I
	.dbend
;           pt_r -> R18,R19
;           pt_l -> R16,R17
	.even
_pwm_ctrler::
	.dbline -1
	.dbline 222
; 
; /**************************** PWM调速控制模块 ********************************/
; 
; //PWM控制器,电机控制的底层操作代码
; void pwm_ctrler( trap *pt_l, trap *pt_r )
; {
	.dbline 224
;  	//左电机加减速梯形图控制器
; 	if ( OCR1A <= pt_l->step )			//当速度减少到一定值时
	movw R30,R16
	ldd R2,z+10
	ldd R3,z+11
	in R4,0x2a
	in R5,0x2b
	cp R2,R4
	cpc R3,R5
	brsh X5
	xjmp L66
X5:
	.dbline 225
; 	{
	.dbline 226
; 		OCR1A = pt_l->step;				//保持,高频润滑
	movw R30,R16
	ldd R2,z+10
	ldd R3,z+11
	out 0x2b,R3
	out 0x2a,R2
	.dbline 227
; 		if ( pt_l->des_speed == 0 ){	//当期望值为0时的处理
	movw R30,R16
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne L68
	tst R3
	brne L68
X3:
	.dbline 227
	.dbline 228
; 			pt_l->real_speed = 0;
	clr R2
	clr R3
	movw R30,R16
	std z+3,R3
	std z+2,R2
	.dbline 229
; 			SET_L_DIR;
	sbi 0x18,0
	.dbline 230
	xjmp L67
L68:
	.dbline 230
; 		} else{
	.dbline 231
; 			if ( pt_l->des_speed > 0 )	SET_L_DIR;
	clr R2
	clr R3
	movw R30,R16
	ldd R4,z+0
	ldd R5,z+1
	cp R2,R4
	cpc R3,R5
	brge L70
	.dbline 231
	sbi 0x18,0
	xjmp L71
L70:
	.dbline 232
; 			else	RST_L_DIR;
	cbi 0x18,0
L71:
	.dbline 233
; 			if ( ++ pt_l->counter >= 400 ){
	movw R24,R16
	adiw R24,8
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	movw R4,R24
	std z+1,R5
	std z+0,R4
	cpi R24,144
	ldi R30,1
	cpc R25,R30
	brsh X6
	xjmp L67
X6:
	.dbline 233
	.dbline 234
; 				DDRD |= BIT(PD5);		//刷新PD5为输出
	sbi 0x11,5
	.dbline 235
; 				OCR1A = pt_l->step + 1;
	movw R30,R16
	ldd R24,z+10
	ldd R25,z+11
	adiw R24,1
	out 0x2b,R25
	out 0x2a,R24
	.dbline 236
; 				if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A);	//需要强制类型转换吗?
	clr R2
	clr R3
	movw R30,R16
	ldd R4,z+0
	ldd R5,z+1
	cp R2,R4
	cpc R3,R5
	brge L74
	.dbline 236
	in R2,0x2a
	in R3,0x2b
	std z+3,R3
	std z+2,R2
	xjmp L75
L74:
	.dbline 237
; 				else pt_l->real_speed = -(int)(OCR1A);
	in R24,0x2a
	in R25,0x2b
	com R24
	com R25
	subi R24,0xFF
	sbci R25,0xFF
	movw R30,R16
	std z+3,R25
	std z+2,R24
L75:
	.dbline 238
; 				pt_l->counter = 0;		//定时计数器清零
	clr R2
	clr R3
	movw R30,R16
	std z+9,R3
	std z+8,R2
	.dbline 239
; 			}
	.dbline 240
; 		}
	.dbline 241
	xjmp L67
L66:
	.dbline 241
; 	} else if ( pt_l->real_speed < pt_l->des_speed ){
	movw R30,R16
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R4,R2
	cpc R5,R3
	brlt X7
	xjmp L76
X7:
	.dbline 241
	.dbline 242
; 		if ( ++ pt_l->counter == pt_l->acce_count ){
	movw R24,R16
	adiw R24,8
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	movw R4,R24
	std z+1,R5
	std z+0,R4
	movw R30,R16
	ldd R2,z+4
	ldd R3,z+5
	cp R24,R2
	cpc R25,R3
	breq X8
	xjmp L77
X8:
	.dbline 242
	.dbline 243
; 			pt_l->real_speed += pt_l->step;	//加速梯形图
	movw R24,R16
	adiw R24,2
	movw R30,R16
	ldd R4,z+10
	ldd R5,z+11
	movw R30,R24
	ldd R6,z+0
	ldd R7,z+1
	add R6,R4
	adc R7,R5
	std z+1,R7
	std z+0,R6
	.dbline 244
; 			if ( pt_l->real_speed < 0 ){	//取绝对值
	movw R30,R16
	ldd R24,z+2
	ldd R25,z+3
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L80
	.dbline 244
	.dbline 245
; 				OCR1A = (uint)(-pt_l->real_speed);
	movw R30,R16
	ldd R24,z+2
	ldd R25,z+3
	com R24
	com R25
	subi R24,0xFF
	sbci R25,0xFF
	out 0x2b,R25
	out 0x2a,R24
	.dbline 246
	xjmp L81
L80:
	.dbline 246
; 			} else {
	.dbline 247
; 				OCR1A = (uint)(pt_l->real_speed);
	movw R30,R16
	ldd R2,z+2
	ldd R3,z+3
	out 0x2b,R3
	out 0x2a,R2
	.dbline 248
; 			}
L81:
	.dbline 249
; 			pt_l->counter = 0;				//计数器清零
	clr R2
	clr R3
	movw R30,R16
	std z+9,R3
	std z+8,R2
	.dbline 250
; 		}
	.dbline 251
	xjmp L77
L76:
	.dbline 251
; 	} else if( pt_l->real_speed > pt_l->des_speed ){
	movw R30,R16
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R4
	cpc R3,R5
	brlt X9
	xjmp L82
X9:
	.dbline 251
	.dbline 252
; 		if ( ++ pt_l->counter == pt_l->dece_count ){
	movw R24,R16
	adiw R24,8
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	movw R4,R24
	std z+1,R5
	std z+0,R4
	movw R30,R16
	ldd R2,z+6
	ldd R3,z+7
	cp R24,R2
	cpc R25,R3
	breq X10
	xjmp L84
X10:
	.dbline 252
	.dbline 253
; 			pt_l->real_speed -= pt_l->step;
	movw R24,R16
	adiw R24,2
	movw R30,R16
	ldd R4,z+10
	ldd R5,z+11
	movw R30,R24
	ldd R6,z+0
	ldd R7,z+1
	sub R6,R4
	sbc R7,R5
	std z+1,R7
	std z+0,R6
	.dbline 254
; 			if ( pt_l->real_speed < 0 ){	//取绝对值
	movw R30,R16
	ldd R24,z+2
	ldd R25,z+3
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L86
	.dbline 254
	.dbline 255
; 				OCR1A = (uint)(-pt_l->real_speed);
	movw R30,R16
	ldd R24,z+2
	ldd R25,z+3
	com R24
	com R25
	subi R24,0xFF
	sbci R25,0xFF
	out 0x2b,R25
	out 0x2a,R24
	.dbline 256
	xjmp L87
L86:
	.dbline 256
; 			} else {
	.dbline 257
; 				OCR1A = (uint)(pt_l->real_speed);
	movw R30,R16
	ldd R2,z+2
	ldd R3,z+3
	out 0x2b,R3
	out 0x2a,R2
	.dbline 258
; 			}
L87:
	.dbline 259
; 			pt_l->counter = 0;
	clr R2
	clr R3
	movw R30,R16
	std z+9,R3
	std z+8,R2
	.dbline 260
; 		}
L84:
	.dbline 261
; 	}
L82:
L77:
L67:
	.dbline 263
; 	//右电机加减速梯形图控制器
; 	if ( OCR1B <= pt_r->step )			//当速度减少到一定值时
	movw R30,R18
	ldd R2,z+10
	ldd R3,z+11
	in R4,0x28
	in R5,0x29
	cp R2,R4
	cpc R3,R5
	brsh X11
	xjmp L88
X11:
	.dbline 264
; 	{
	.dbline 265
; 		OCR1B = pt_r->step;				//保持,高频润滑
	movw R30,R18
	ldd R2,z+10
	ldd R3,z+11
	out 0x29,R3
	out 0x28,R2
	.dbline 266
; 		if ( pt_r->des_speed == 0 ){	//当期望值为0时的处理
	movw R30,R18
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne L90
	tst R3
	brne L90
X4:
	.dbline 266
	.dbline 267
; 			pt_r->real_speed = 0;
	clr R2
	clr R3
	movw R30,R18
	std z+3,R3
	std z+2,R2
	.dbline 268
; 			SET_R_DIR;
	sbi 0x18,1
	.dbline 269
	xjmp L89
L90:
	.dbline 269
; 		} else{
	.dbline 270
; 			if ( pt_r->des_speed > 0 )	SET_R_DIR;
	clr R2
	clr R3
	movw R30,R18
	ldd R4,z+0
	ldd R5,z+1
	cp R2,R4
	cpc R3,R5
	brge L92
	.dbline 270
	sbi 0x18,1
	xjmp L93
L92:
	.dbline 271
; 			else	RST_R_DIR;
	cbi 0x18,1
L93:
	.dbline 272
; 			if ( ++ pt_r->counter >= 400 ){
	movw R24,R18
	adiw R24,8
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	movw R4,R24
	std z+1,R5
	std z+0,R4
	cpi R24,144
	ldi R30,1
	cpc R25,R30
	brsh X12
	xjmp L89
X12:
	.dbline 272
	.dbline 273
; 				DDRD |= BIT(PD4);		//刷新PD5为输出
	sbi 0x11,4
	.dbline 274
; 				OCR1B = pt_r->step + 1;
	movw R30,R18
	ldd R24,z+10
	ldd R25,z+11
	adiw R24,1
	out 0x29,R25
	out 0x28,R24
	.dbline 275
; 				if( pt_r->des_speed > 0 ) pt_r->real_speed = (int)(OCR1B);	//需要强制类型转换吗?
	clr R2
	clr R3
	movw R30,R18
	ldd R4,z+0
	ldd R5,z+1
	cp R2,R4
	cpc R3,R5
	brge L96
	.dbline 275
	in R2,0x28
	in R3,0x29
	std z+3,R3
	std z+2,R2
	xjmp L97
L96:
	.dbline 276
; 				else pt_r->real_speed = -(int)(OCR1B);
	in R24,0x28
	in R25,0x29
	com R24
	com R25
	subi R24,0xFF
	sbci R25,0xFF
	movw R30,R18
	std z+3,R25
	std z+2,R24
L97:
	.dbline 277
; 				pt_r->counter = 0;		//定时计数器清零
	clr R2
	clr R3
	movw R30,R18
	std z+9,R3
	std z+8,R2
	.dbline 278
; 			}
	.dbline 279
; 		}
	.dbline 280
	xjmp L89
L88:
	.dbline 280
; 	} else if ( pt_r->real_speed < pt_r->des_speed ){
	movw R30,R18
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R4,R2
	cpc R5,R3
	brlt X13
	xjmp L98
X13:
	.dbline 280
	.dbline 281
; 		if ( ++ pt_r->counter == pt_r->acce_count ){
	movw R24,R18
	adiw R24,8
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	movw R4,R24
	std z+1,R5
	std z+0,R4
	movw R30,R18
	ldd R2,z+4
	ldd R3,z+5
	cp R24,R2
	cpc R25,R3
	breq X14

⌨️ 快捷键说明

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