📄 motor.s
字号:
.module motor.c
.area data(ram, con, rel)
L5:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L6:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area text(rom, con, rel)
.dbfile D:\_文档~1\easy-STQ-20080712\motor.c
.dbfunc e Motor _Motor fV
.dbsym s KeyTemp L6 c
.dbsym s KeyLast L5 c
.even
_Motor::
xcall push_gset5
sbiw R28,4
.dbline -1
.dbline 13
;
;
; #define MOTOR_GLOBAL
; #include "motor.h"
;
; static void MotorLocal(void); //本地控制
; static void MotorRemote3(void); //远程三线制
; static void MotorRemote4(void); //远程四线制
;
;
;
; void Motor(void) //电机任务
; {
.dbline 17
; //一个任务周期的信号消抖动
; static uchar KeyLast = 0, KeyTemp = 0;
;
; KeyTemp = (GetLocalClose()|GetLocalOpen()<<1|GetLocal()<<2|GetRemote()<<3|\
sbic 0x13,6
rjmp L7
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
xjmp L8
L7:
clr R0
clr R1
std y+3,R1
std y+2,R0
L8:
sbic 0x13,7
rjmp L9
ldi R24,1
ldi R25,0
std y+1,R25
std y+0,R24
xjmp L10
L9:
clr R0
clr R1
std y+1,R1
std y+0,R0
L10:
sbic 0x19,6
rjmp L11
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L12
L11:
clr R14
clr R15
L12:
sbic 0x19,5
rjmp L13
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L14
L13:
clr R12
clr R13
L14:
sbic 0x10,3
rjmp L15
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L16
L15:
clr R10
clr R11
L16:
sbic 0x10,4
rjmp L17
ldi R22,1
ldi R23,0
xjmp L18
L17:
clr R22
clr R23
L18:
sbic 0x10,5
rjmp L19
ldi R20,1
ldi R21,0
xjmp L20
L19:
clr R20
clr R21
L20:
ldd R2,y+0
ldd R3,y+1
lsl R2
rol R3
ldd R4,y+2
ldd R5,y+3
or R4,R2
or R5,R3
movw R2,R14
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
movw R2,R12
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
movw R2,R10
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
ldi R18,5
ldi R19,0
movw R16,R22
xcall lsl16
or R4,R16
or R5,R17
ldi R18,6
ldi R19,0
movw R16,R20
xcall lsl16
or R4,R16
or R5,R17
sts L6,R4
xjmp L22
L21:
.dbline 23
; GetRemoteStop()<<4|GetRemoteClose()<<5|GetRemoteOpen()<<6);
;
; //当有信号时消抖动
; while(GetLocalClose()||GetLocalOpen()||GetLocal()||GetRemote()||\
; GetRemoteStop()||GetRemoteClose()||GetRemoteOpen())
; {
.dbline 24
; if(KeyTemp == KeyLast) break; //如两次电机任务扫描键值相等,跳出并执行后面代码
lds R2,L5
lds R3,L6
cp R3,R2
brne L24
.dbline 24
xjmp L23
L24:
.dbline 26
.dbline 27
lds R2,L6
sts L5,R2
.dbline 28
xjmp L4
L22:
.dbline 21
sbis 0x13,6
rjmp L21
sbis 0x13,7
rjmp L21
sbis 0x19,6
rjmp L21
sbis 0x19,5
rjmp L21
sbis 0x10,3
rjmp L21
sbis 0x10,4
rjmp L21
sbis 0x10,5
rjmp L21
L23:
.dbline 32
; else
; {
; KeyLast = KeyTemp; //保存上次扫描键值
; return;
; }
; }
;
; if(KeyTemp == 0)StopMotor(); //所有信号丢失时关电机保护
lds R2,L6
tst R2
brne L26
.dbline 32
xcall _StopMotor
L26:
.dbline 34
;
; ProtectMotor(); //电机过热、限位保护
xcall _ProtectMotor
.dbline 36
;
; if( GetLocal()&&(!GetRemote())) //本地控制
sbic 0x19,6
rjmp L28
sbis 0x19,5
rjmp L28
.dbline 37
; {
.dbline 38
; SetLocalLed();
cbi 0x18,5
.dbline 39
; ClrRemoteLed();
sbi 0x18,6
.dbline 41
;
; if(ControlFlag != IN_LOCAL) //控制状态转换
lds R24,_ControlFlag
cpi R24,1
breq L30
.dbline 42
; {
.dbline 43
; StopMotor();
xcall _StopMotor
.dbline 44
; ControlFlag = IN_LOCAL;
ldi R24,1
sts _ControlFlag,R24
.dbline 45
; }
L30:
.dbline 47
;
; MotorLocal();
xcall _MotorLocal
.dbline 48
; }
L28:
.dbline 51
;
; //远程三线制
; if( (!GetLocal()) && GetRemote() && GetRemoteMode() )
sbis 0x19,6
rjmp L32
sbic 0x19,5
rjmp L32
sbis 0x19,0
rjmp L32
.dbline 52
; {
.dbline 53
; ClrLocalLed();
sbi 0x18,5
.dbline 54
; SetRemoteLed();
cbi 0x18,6
.dbline 56
;
; if(ControlFlag != IN_REMOTE3) //控制状态转换
lds R24,_ControlFlag
cpi R24,2
breq L34
.dbline 57
; {
.dbline 58
; StopMotor();
xcall _StopMotor
.dbline 59
; ControlFlag = IN_REMOTE3;
ldi R24,2
sts _ControlFlag,R24
.dbline 60
; }
L34:
.dbline 62
;
; MotorRemote3();
xcall _MotorRemote3
.dbline 63
; }
L32:
.dbline 66
;
; //远程四线制
; if( (!GetLocal()) && GetRemote() && (!GetRemoteMode()) )
sbis 0x19,6
rjmp L36
sbic 0x19,5
rjmp L36
sbic 0x19,0
rjmp L36
.dbline 67
; {
.dbline 68
; ClrLocalLed();
sbi 0x18,5
.dbline 69
; SetRemoteLed();
cbi 0x18,6
.dbline 71
;
; if(ControlFlag != IN_REMOTE4) //控制状态转换
lds R24,_ControlFlag
cpi R24,3
breq L38
.dbline 72
; {
.dbline 73
; StopMotor();
xcall _StopMotor
.dbline 74
; ControlFlag = IN_REMOTE4;
ldi R24,3
sts _ControlFlag,R24
.dbline 75
; }
L38:
.dbline 77
xcall _MotorRemote4
.dbline 78
L36:
.dbline -2
L4:
adiw R28,4
xcall pop_gset5
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorLocal _MotorLocal fV
.even
_MotorLocal:
.dbline -1
.dbline 84
;
; MotorRemote4();
; }
;
; }//end of 电机任务
;
;
; static void MotorLocal(void) //本地控制
; {
.dbline 85
; if(GetLocalOpen()&&!GetLocalClose()) //本地开
sbic 0x13,7
rjmp L41
sbis 0x13,6
rjmp L41
.dbline 86
; {
.dbline 87
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L43
sbic 0x19,2
rjmp L43
lds R24,_MotorFlag
cpi R24,1
breq L43
.dbline 88
; {
.dbline 89
; OpenMotor(); //开电机
xcall _OpenMotor
.dbline 90
; }
L43:
.dbline 93
;
;
; }
L41:
.dbline 95
;
; if(GetLocalClose()&&!GetLocalOpen()) //本地关
sbic 0x13,6
rjmp L45
sbis 0x13,7
rjmp L45
.dbline 96
; {
.dbline 97
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L47
sbic 0x19,2
rjmp L47
lds R24,_MotorFlag
cpi R24,2
breq L47
.dbline 98
; {
.dbline 99
; CloseMotor();
xcall _CloseMotor
.dbline 100
; }
L47:
.dbline 101
L45:
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorRemote3 _MotorRemote3 fV
.even
_MotorRemote3:
.dbline -1
.dbline 107
; }
;
; }//edd of 本地控制
;
;
; static void MotorRemote3(void) //远程三线制
; {
.dbline 108
; if(GetRemoteOpen()&&!GetRemoteClose()) //远程三线开
sbic 0x10,5
rjmp L50
sbis 0x10,4
rjmp L50
.dbline 109
; {
.dbline 110
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L52
sbic 0x19,2
rjmp L52
lds R24,_MotorFlag
cpi R24,1
breq L52
.dbline 111
; {
.dbline 112
; OpenMotor();
xcall _OpenMotor
.dbline 113
; }
L52:
.dbline 114
; }
L50:
.dbline 116
;
; if(GetRemoteClose()&&!GetRemoteOpen()) //远程三线关
sbic 0x10,4
rjmp L54
sbis 0x10,5
rjmp L54
.dbline 117
; {
.dbline 118
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L56
sbic 0x19,2
rjmp L56
lds R24,_MotorFlag
cpi R24,2
breq L56
.dbline 119
; {
.dbline 120
; CloseMotor();
xcall _CloseMotor
.dbline 121
; }
L56:
.dbline 123
L54:
.dbline -2
L49:
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorRemote4 _MotorRemote4 fV
.even
_MotorRemote4:
.dbline -1
.dbline 130
;
; }
; }
;
;
;
;
; static void MotorRemote4(void) //远程四线制
; {
.dbline 131
; if(GetRemoteStop()) //远程四线停
sbic 0x10,3
rjmp L59
.dbline 132
; {
.dbline 133
; StopMotor();
xcall _StopMotor
.dbline 134
; }
L59:
.dbline 136
; //远程四线开
; if(GetRemoteOpen()&&!GetRemoteClose()&&!GetRemoteStop())
sbic 0x10,5
rjmp L61
sbis 0x10,4
rjmp L61
sbis 0x10,3
rjmp L61
.dbline 137
; {
.dbline 138
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L63
sbic 0x19,2
rjmp L63
lds R24,_MotorFlag
cpi R24,1
breq L63
.dbline 139
; {
.dbline 140
; OpenMotor();
xcall _OpenMotor
.dbline 141
; }
L63:
.dbline 142
; }
L61:
.dbline 144
; //远程四线关
; if(GetRemoteClose()&&!GetRemoteOpen()&&!GetRemoteStop())
sbic 0x10,4
rjmp L65
sbis 0x10,5
rjmp L65
sbis 0x10,3
rjmp L65
.dbline 145
; {
.dbline 146
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L67
sbic 0x19,2
rjmp L67
lds R24,_MotorFlag
cpi R24,2
breq L67
.dbline 147
; {
.dbline 148
; CloseMotor();
xcall _CloseMotor
.dbline 149
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -