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

📄 step.s

📁 用M16驱动步进电机 实现三种驱动方式 单四拍驱动、双四拍驱动 单双八拍驱动
💻 S
📖 第 1 页 / 共 2 页
字号:
;                    PORTC |= (1<<(3-i/2))|(1<<(4-i/2));
	ldi R18,2
	ldi R19,0
	mov R16,R2
	clr R17
	xcall div16s
	movw R4,R16
	ldi R18,4
	ldi R19,0
	sub R18,R16
	sbc R19,R17
	ldi R16,1
	ldi R17,0
	xcall lsl16
	movw R2,R16
	ldi R18,3
	ldi R19,0
	sub R18,R4
	sbc R19,R5
	ldi R16,1
	ldi R17,0
	xcall lsl16
	movw R4,R16
	or R4,R2
	or R5,R3
	in R2,0x15
	clr R3
	or R2,R4
	or R3,R5
	out 0x15,R2
	xjmp L37
L36:
	.dbline 115
;                else
;                    PORTC |= (1<<(3-i/2))|1;
	lds R2,_i
	lsr R2
	ldi R17,3
	sub R17,R2
	ldi R16,1
	xcall lsl8
	mov R24,R16
	ori R24,1
	in R2,0x15
	or R2,R24
	out 0x15,R2
L37:
	.dbline 116
;                }
L35:
	.dbline 117
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 118
;            if(i>=8)i=0;
	cpi R24,8
	brlo L23
X21:
	.dbline 118
	clr R2
	sts _i,R2
	.dbline 119
;            break;
	.dbline 122
;        case 4:
;        
;        default:break;
L23:
	.dbline -2
L21:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r a 10 c
	.dbend
	.dbfunc e timer1_init _timer1_init fV
	.even
_timer1_init::
	.dbline -1
	.dbline 134
;        }
;    }
; 
; /****************************
; *        定时器1配置函数        *
; * 工作模式:普通模式        *
; * 工作方式:溢出中断        *
; * 预 分 频:64                *
; * 时钟频率:外部7.3728MHZ    *
; ****************************/
; void timer1_init(void)
;    {
	.dbline 135
;    TCCR1B = 0x00;
	clr R2
	out 0x2e,R2
	.dbline 136
;    TCNT1H = zhuansu>>8;
	lds R2,_zhuansu
	lds R3,_zhuansu+1
	mov R2,R3
	clr R3
	out 0x2d,R2
	.dbline 137
;    TCNT1L = zhuansu&0xFF;
	lds R24,_zhuansu
	lds R25,_zhuansu+1
	andi R25,0
	out 0x2c,R24
	.dbline 138
;    TCCR1A = 0x00;
	clr R2
	out 0x2f,R2
	.dbline 139
;    TCCR1B = 0x02;
	ldi R24,2
	out 0x2e,R24
	.dbline -2
L41:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 32
	jmp _timer1_ovf_isr
	.area text(rom, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
	.even
_timer1_ovf_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	.dbline -1
	.dbline 146
;    }
; /****************************
; *        定时器1中断函数        *
; ****************************/
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
;    {
	.dbline 147
;    TCNT1H = zhuansu>>8;
	lds R2,_zhuansu
	lds R3,_zhuansu+1
	mov R2,R3
	clr R3
	out 0x2d,R2
	.dbline 148
;    TCNT1L = zhuansu&0xFF;
	lds R24,_zhuansu
	lds R25,_zhuansu+1
	andi R25,0
	out 0x2c,R24
	.dbline 149
;    PORTC &= 0xF0;
	in R24,0x15
	andi R24,240
	out 0x15,R24
	.dbline 150
;    if(n)
	lds R2,_n
	tst R2
	breq L43
X26:
	.dbline 151
;        bj_fsf(m);            //反转
	lds R16,_m
	xcall _bj_fsf
	xjmp L44
L43:
	.dbline 153
;    else
;        bj_fs(m);            //正转
	lds R16,_m
	xcall _bj_fs
L44:
	.dbline -2
L42:
	.dbline 0 ; func end
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 160
;    }
; 
; /****************************
; *        器件初始化函数        *
; ****************************/
; void init_devices(void)
;    {
	.dbline 161
;    CLI();
	cli
	.dbline 162
;    port_init();
	xcall _port_init
	.dbline 163
;    timer1_init();
	xcall _timer1_init
	.dbline 165
; 
;    MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 166
;    GICR = 0x00;
	out 0x3b,R2
	.dbline 167
;    TIMSK = 0x04;
	ldi R24,4
	out 0x39,R24
	.dbline 168
;    SEI();
	sei
	.dbline -2
L45:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;           key1 -> R22
;            key -> R20
	.even
_main::
	.dbline -1
	.dbline 175
;    }
; 
; /****************************
; *            主函数            *
; ****************************/
; void main(void)
;    {
	.dbline 177
;    unsigned char key,key1;
;    init_devices();
	xcall _init_devices
	xjmp L48
L47:
	.dbline 180
;    
;    while(1)
;        {
	.dbline 181
;        key=RD_KEY();        //按键扫描
	in R20,0x13
	ori R20,15
	com R20
	swap R20
	andi R20,#0x0F
	.dbline 182
;        if(key)
	brne X39
	xjmp L50
X39:
X27:
	.dbline 183
;            {
	.dbline 184
;            delay_nms(200);
	ldi R16,200
	ldi R17,0
	xcall _delay_nms
	.dbline 185
;            key1=RD_KEY();
	in R22,0x13
	ori R22,15
	com R22
	swap R22
	andi R22,#0x0F
	.dbline 186
;            if(key==key1)
	cp R20,R22
	breq X40
	xjmp L70
X40:
X28:
	.dbline 187
;                {
	.dbline 188
;                switch(key)        //按键有效,相应处理
	mov R22,R20
	clr R23
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L57
X29:
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L60
X30:
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	brne X41
	xjmp L63
X41:
X31:
	cpi R22,8
	ldi R30,0
	cpc R23,R30
	brne X42
	xjmp L66
X42:
X32:
	xjmp L70
L57:
	.dbline 191
;                    {
;                    case 0x01:    //S1键处理:转速增加
;                        zhuansu += 100;
	lds R24,_zhuansu
	lds R25,_zhuansu+1
	subi R24,156  ; offset = 100
	sbci R25,255
	sts _zhuansu+1,R25
	sts _zhuansu,R24
	.dbline 192
;                        if(zhuansu>62000)zhuansu=62000;
	ldi R24,48
	ldi R25,242
	ldi R26,0
	ldi R27,0
	lds R2,_zhuansu
	lds R3,_zhuansu+1
	clr R4
	clr R5
	cp R24,R2
	cpc R25,R3
	cpc R26,R4
	cpc R27,R5
	brlt X43
	xjmp L70
X43:
X33:
	.dbline 192
	ldi R24,62000
	ldi R25,242
	sts _zhuansu+1,R25
	sts _zhuansu,R24
	.dbline 193
;                        break;
	xjmp L70
L60:
	.dbline 195
;                    case 0x02:    //S2键处理:转速降低
;                        zhuansu -= 100;
	lds R24,_zhuansu
	lds R25,_zhuansu+1
	subi R24,100
	sbci R25,0
	sts _zhuansu+1,R25
	sts _zhuansu,R24
	.dbline 196
;                        if(zhuansu<5000)zhuansu=5000;
	cpi R24,136
	ldi R30,19
	cpc R25,R30
	brsh L70
X34:
	.dbline 196
	ldi R24,5000
	ldi R25,19
	sts _zhuansu+1,R25
	sts _zhuansu,R24
	.dbline 197
;                        break;
	xjmp L70
L63:
	.dbline 199
;                    case 0x04:    //S3键处理:转换驱动方式
;                        m++;
	lds R24,_m
	subi R24,255    ; addi 1
	sts _m,R24
	.dbline 200
;                        if(m>=4)m=1;
	cpi R24,4
	brlo L70
X35:
	.dbline 200
	ldi R24,1
	sts _m,R24
	.dbline 201
;                        break;
	xjmp L70
L66:
	.dbline 203
;                    case 0x08:    //S4键处理:正反转控制
;                        if(n)
	lds R2,_n
	tst R2
	breq L67
X36:
	.dbline 204
;                            n=0;
	clr R2
	sts _n,R2
	xjmp L70
L67:
	.dbline 206
;                        else
;                            n=1;
	ldi R24,1
	sts _n,R24
	.dbline 207
;                        break;
	.dbline 208
;                    default:break;
	.dbline 210
;                    }
;                }
	xjmp L70
L69:
	.dbline 212
;            while(key)            //等待按键释放
;                {
	.dbline 213
;                delay_nms(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_nms
	.dbline 214
;                key=RD_KEY();
	in R20,0x13
	ori R20,15
	com R20
	swap R20
	andi R20,#0x0F
	.dbline 215
;                }
L70:
	.dbline 211
	tst R20
	brne L69
X37:
	.dbline 216
;            }
L50:
	.dbline 217
;        }
L48:
	.dbline 179
	xjmp L47
X38:
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbsym r key1 22 c
	.dbsym r key 20 c
	.dbend
;    }
; 

⌨️ 快捷键说明

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