📄 step.s
字号:
.module step.c
.area text(rom, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.area data(ram, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
_i::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.dbsym e i _i c
_m::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.dbsym e m _m c
_n::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.dbsym e n _n c
_zhuansu::
.blkb 2
.area idata
.word 61500
.area data(ram, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.dbsym e zhuansu _zhuansu i
.area text(rom, con, rel)
.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 33
; /************************************
; * 步进电机的M16驱动程序 *
; * 功 能:用M16驱动步进电机 *
; * 实现三种驱动方式 *
; * 单四拍驱动、双四拍驱动 *
; * 单双八拍驱动 *
; * 驱动芯片:ULN2803 *
; * 联接方式:PC0-3分别通过2803接A-D *
; * 步进电机公共端接+5V电源 *
; * 建立日期:2008年04月10日 *
; * 作 者:弋蔚辉 *
; * 版 本:V1.0 *
; * 修改日期:2008年04月15日 *
; * 主控芯片:M16 *
; * 时钟频率:外部晶体 7.3728MHZ *
; * 编 译 器:ICCAVR 6.31A *
; ************************************/
; #include <iom16v.h>
; #include <macros.h>
; //#include "delay.h"
;
; #define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7
;
; unsigned char i=0; //转动计数
; unsigned char m=1; //驱动方式参数
; unsigned char n=0; //转动方向参数
; unsigned int zhuansu=61500; //转速数据
;
; /****************************
; * 端口配置函数 *
; ****************************/
; void port_init(void)
; {
.dbline 34
; PORTA = 0x40;
ldi R24,64
out 0x1b,R24
.dbline 35
; DDRA = 0x40;
out 0x1a,R24
.dbline 36
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 37
; DDRB = 0x00;
out 0x17,R2
.dbline 38
; PORTC = 0xF0;
ldi R24,240
out 0x15,R24
.dbline 39
; DDRC = 0x0F;
ldi R24,15
out 0x14,R24
.dbline 40
; PORTD = 0x00;
out 0x12,R2
.dbline 41
; DDRD = 0x00;
out 0x11,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e bj_fs _bj_fs fV
; a -> R10
.even
_bj_fs::
xcall push_xgset300C
mov R10,R16
.dbline -1
.dbline 49
; }
;
; /****************************
; * 正转操作函数 *
; * 入 口:a 三种工作方式 *
; ****************************/
; void bj_fs(unsigned char a)
; {
.dbline 50
; switch(a)
mov R20,R10
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L6
X0:
cpi R20,2
ldi R30,0
cpc R21,R30
breq L9
X1:
cpi R20,3
ldi R30,0
cpc R21,R30
brne X9
xjmp L14
X9:
X2:
xjmp L4
L6:
.dbline 53
; {
; case 1: //单四拍方式驱动
; PORTC |= 1<<i; //A、B、C、D驱动
lds R17,_i
ldi R16,1
xcall lsl8
in R2,0x15
or R2,R16
out 0x15,R2
.dbline 54
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 55
; if(i>=4)i=0;
cpi R24,4
brsh X10
xjmp L4
X10:
X3:
.dbline 55
clr R2
sts _i,R2
.dbline 56
; break;
xjmp L4
L9:
.dbline 58
; case 2: //双四拍方式驱动
; if(i!=4) //AB、BC、CD、DA驱动
lds R24,_i
cpi R24,4
breq L10
X4:
.dbline 59
; PORTC |= (1<<i)|(1<<(i-1));
mov R3,R24
mov R17,R24
subi R17,1
ldi R16,1
xcall lsl8
mov R2,R16
ldi R16,1
mov R17,R3
xcall lsl8
mov R3,R16
or R3,R2
in R2,0x15
or R2,R3
out 0x15,R2
xjmp L11
L10:
.dbline 61
; else
; PORTC |= (1<<(i-1))|1;
lds R17,_i
subi R17,1
ldi R16,1
xcall lsl8
mov R24,R16
ori R24,1
in R2,0x15
or R2,R24
out 0x15,R2
L11:
.dbline 62
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 63
; if(i>=5)i=1;
cpi R24,5
brsh X11
xjmp L4
X11:
X5:
.dbline 63
ldi R24,1
sts _i,R24
.dbline 64
; break;
xjmp L4
L14:
.dbline 66
; case 3: //单双八拍方式驱动
; if(i%2) //A、AB、B、BC、C、CD、D、DA驱动
ldi R17,2
lds R16,_i
xcall mod8u
tst R16
breq L15
X6:
.dbline 67
; {
.dbline 68
; if(i!=7)
lds R24,_i
cpi R24,7
breq L17
X7:
.dbline 69
; PORTC |= (1<<(i/2))|(1<<(i/2+1));
ldi R18,2
ldi R19,0
mov R16,R24
clr R17
xcall div16s
movw R4,R16
movw R18,R4
subi R18,255 ; offset = 1
sbci R19,255
ldi R16,1
ldi R17,0
xcall lsl16
movw R2,R16
ldi R16,1
ldi R17,0
movw R18,R4
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 L16
L17:
.dbline 71
; else
; PORTC |= (1<<(i/2))|1;
lds R17,_i
lsr R17
ldi R16,1
xcall lsl8
mov R24,R16
ori R24,1
in R2,0x15
or R2,R24
out 0x15,R2
.dbline 72
; }
xjmp L16
L15:
.dbline 74
; else
; {
.dbline 75
; PORTC |= 1<<(i/2);
lds R17,_i
lsr R17
ldi R16,1
xcall lsl8
in R2,0x15
or R2,R16
out 0x15,R2
.dbline 76
; }
L16:
.dbline 77
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 78
; if(i>=8)i=0;
cpi R24,8
brlo L4
X8:
.dbline 78
clr R2
sts _i,R2
.dbline 79
; break;
.dbline 80
; default:break;
L4:
.dbline -2
L2:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r a 10 c
.dbend
.dbfunc e bj_fsf _bj_fsf fV
; a -> R10
.even
_bj_fsf::
xcall push_xgset300C
mov R10,R16
.dbline -1
.dbline 89
; }
; }
;
; /****************************
; * 反转操作函数 *
; * 入 口:a 三种工作方式 *
; ****************************/
; void bj_fsf(unsigned char a)
; {
.dbline 90
; switch(a)
mov R20,R10
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L25
X12:
cpi R20,2
ldi R30,0
cpc R21,R30
breq L28
X13:
cpi R20,3
ldi R30,0
cpc R21,R30
brne X22
xjmp L33
X22:
X14:
cpi R20,4
ldi R30,0
cpc R21,R30
brne X23
xjmp L23
X23:
X15:
xjmp L23
L25:
.dbline 93
; {
; case 1: //单四拍方式驱动
; PORTC |= 1<<(3-i); //D、C、B、A驱动
lds R2,_i
ldi R17,3
sub R17,R2
ldi R16,1
xcall lsl8
in R2,0x15
or R2,R16
out 0x15,R2
.dbline 94
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 95
; if(i>=4)i=0;
cpi R24,4
brsh X24
xjmp L23
X24:
X16:
.dbline 95
clr R2
sts _i,R2
.dbline 96
; break;
xjmp L23
L28:
.dbline 98
; case 2: //双四拍方式驱动
; if(i!=4) //AD、CD、BC、AB驱动
lds R24,_i
cpi R24,4
breq L29
X17:
.dbline 99
; PORTC |= (1<<(3-i))|(1<<(4-i));
mov R3,R24
ldi R17,4
sub R17,R24
ldi R16,1
xcall lsl8
mov R2,R16
ldi R17,3
sub R17,R3
ldi R16,1
xcall lsl8
mov R3,R16
or R3,R2
in R2,0x15
or R2,R3
out 0x15,R2
xjmp L30
L29:
.dbline 101
; else
; PORTC |= (1<<(i-1))|1;
lds R17,_i
subi R17,1
ldi R16,1
xcall lsl8
mov R24,R16
ori R24,1
in R2,0x15
or R2,R24
out 0x15,R2
L30:
.dbline 102
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 103
; if(i>=5)i=1;
cpi R24,5
brsh X25
xjmp L23
X25:
X18:
.dbline 103
ldi R24,1
sts _i,R24
.dbline 104
; break;
xjmp L23
L33:
.dbline 106
; case 3: //单双八拍方式驱动
; if(i%2) //DA、D、CD、C、BC、B、AB、A驱动
ldi R17,2
lds R16,_i
xcall mod8u
tst R16
breq L34
X19:
.dbline 107
; {
.dbline 108
; PORTC |= 1<<(3-i/2);
lds R2,_i
lsr R2
ldi R17,3
sub R17,R2
ldi R16,1
xcall lsl8
in R2,0x15
or R2,R16
out 0x15,R2
.dbline 109
; }
xjmp L35
L34:
.dbline 111
; else
; {
.dbline 112
; if(i)
lds R2,_i
tst R2
breq L36
X20:
.dbline 113
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -