📄 motor_sensor.asm
字号:
;project:motor control
;IC body:SG8P122
;Author:wulj
;Data:2007/11/16
;motor model:pm35l-048-ccb0
;*******************************************
R_iar equ [00h]
R_rp equ [04h]
r_pressdebonce equ [10h] ;去抖值
r_relaxdebonce equ [11h]
keyflag equ [12h] ;key flag
keycode equ [13h] ;
R_speed equ [14h] ;motor speed
temp0 equ [15h]
temp1 equ [16h]
delayl equ [17h]
num equ [18h]
direction equ [19h]
temp2 equ [1ah]
temp3 equ [1bh]
acc_buf equ [1eh]
status_buf equ [1fh]
c_debonce equ 225
;*******************************************
CSEG 000h
jmp reset
CSEG 001H
mov acc_buf,a
swpa status
mov status_buf,a
nop
sbz irq,0
jmp tcc_int
jmp int_end
tcc_int:
mov a,0feh
mov IRQ,A
mov a,p0
and a,03h
xor a,00h
sbnz status,2
inc r_pressdebonce ;按键延时
; inc r_relaxdebonce
; mov a,250
; mov tcc,a
inc temp0
jmp int_end
int_end:
swp acc_buf
swpa acc_buf
swpa status_buf
mov status,a
reti
speed_Table:
tbl
retl 7
retl 80
retl 40
retl 7
retl 20
retl 7
retl 7
retl 7
retl 14
;*******************************************
reset:
di
call portini
call sysini
call ramini
mov a,1
mov R_speed,a
jmp main
portini:
mov a,03h
ctlw p0c
MOV A,00FH
ctlw p1c
mov a,00h
mov p1,a
mov p0,a
MOV A,00cH ;P10~P13 P00,P01 PULLD enable
ctlw pulld
ret
sysini:
mov a,02h
ctlw wwc
mov a,00000000b ;OSC=2MHZ 000-->1:2 256*2/1mhz=512us
cntw
mov a,00000000b
mov irq,a
mov a,01h ;ttc enable
ctlw ire
nop
; ei
ret
ramini:
mov a,10h
mov R_rp,a
clear_begin:
mov a,00h
mov R_iar,a
inc R_rp
mov a,R_rp
xor a,3fh
sbnz status,2
jmp clear_begin
clr R_iar
clr R_rp
ret
;*******************************************
;*******************************************
main:
ei
wdtc
sbz keyflag,0
jmp On_off_loop
call scankey
sbz keyflag,1
call speed_loop
sbnz direction,0
jmp run_r
jmp run_l
; jmp motor_loop
On_off_loop:
call scankey
sbz keyflag,1
call speed_loop
sbz keyflag,0 ;
jmp On_off_loop
sbnz direction,0
jmp run_r
jmp run_l
;*******************************************
;*******************************************
speed_loop:
bclr keyflag,1
bclr status,0
slc R_speed
mov a,R_speed
sub a,09h
sbz status,0
ret
mov a,1
mov R_speed,a
ret
;*******************************************
motor_loop:
; mov a,025h
; mov num,a ;/*设置转数*/
jmp run_l ;左转
; mov a,020h
; mov delayl,a
; call delay
; mov a,025h
; mov num,a ;/*设置转数*/
; call run_r ;右转
; mov a,020h
; mov delayl,a
; call delay
jmp main
;*******************************************
run_l: ;正转
call delay ;切换时延时
bst direction,0 ;正转
bst p1,7 ;10000000b
nop
bclr p1,4
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bst p0,4 ;led
;;
bst p1,6 ;11000000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,6
nop
bclr p1,7 ;01000000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bclr p0,4 ;led
;;
bst p1,5 ;01100000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,5 ;00100000b
nop
bclr p1,6
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bst p0,4 ;led
;;
bclr p1,4 ;00110000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,4
nop
bclr p1,5 ;00010000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bclr p0,4 ;led
;;
bst p1,7 ;10010000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
jmp run_l
; sdz num
; jmp run_l ;
; ret
sensor_loop:
sbz direction,0
jmp left_loop
jmp right_loop
left_loop:
sbz p1,0 ;TEST
ret
sbz direction,1
ret
mov a,00h ;motor stop
mov p1,a
nop
bst direction,1
bclr direction,2
mov a,R_speed
xor a,8
sbnz status,2
jmp run_r
mov a,00h
mov p1,a
mov a,254
mov R_speed,a
wait_loop: ;如果是最高速,暂停一会
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sdz R_speed
jmp wait_loop
mov a,8
mov R_speed,a
jmp run_r
right_loop:
sbz p1,2
ret
sbz direction,2
ret
mov a,00h ;motor stop
mov p1,a
nop
bclr direction,1
bst direction,2
mov a,R_speed
xor a,8
sbnz status,2
jmp run_l
mov a,00h
mov p1,a
mov a,254
mov R_speed,a
wait_loop1: ;如果是最高速,暂停一会
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sdz R_speed
jmp wait_loop1
mov a,8
mov R_speed,a
jmp run_l
wait_loop00:
di
mov a,R_speed
call speed_Table
mov temp1,a
ei
wait_loop01:
bclr status,0
mov a,temp0
sub a,temp1 ;8~64
sbz status,0
jmp wait_loop01
clr temp0
ret
run_r: ;反转
call delay ;切换时延时
bclr direction,0 ;反转
bst p1,4 ;00010000b
nop
bclr p1,7
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bst p0,4 ;led
;;
bst p1,5 ;00110000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,5 ;00100000b
nop
bclr p1,4
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bclr p0,4 ;led
;;
bst p1,6 ;01100000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,6 ;01000000b
nop
bclr p1,5
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bst p0,4 ;led
;;
bst p1,7 ;11000000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
bst p1,7
nop
bclr p1,6 ;10000000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
bclr p0,4 ;led
;;
bst p1,4 ;10010000b
; mov a,01Ah
; mov delayl,a
; call delay
call sensor_loop ;查看是否到边界
call wait_loop00
call scankey ;
mov a,keyflag
xor a,00h
sbnz status,2
jmp main
; bclr p0,4 ;led
; sdz num
jmp run_r ;
; ret
scankey:
; di
mov a,p0
and a,00000011b
xor a,00h
mov keycode,a
sbz status,2
ret
mov a,r_pressdebonce
add a,c_debonce
sbnz status,0
ret
clr r_pressdebonce
mov a,p0
and a,00000011b
xor a,keycode
sbnz status,2
ret
; clr r_pressdebonce
; ei
mov a,keycode
sbz keycode,0
xor keyflag,a ;对on/off 取反
sbz keycode,1
bst keyflag,1
clr keycode
wait_low:
mov a,p0
and a,00000011b
xor a,0
sbnz status,2
jmp wait_low
mov a,r_pressdebonce
add a,c_debonce
sbnz status,0
ret
clr r_pressdebonce
ret
;scankey: ;
di
mov a,p0
and a,00000011b
xor a,00h
ei
mov keycode,a
sbz status,2
jmp nokey_loop
bclr status,0
mov a,r_pressdebonce
add a,c_debonce
sbnz status,0
jmp exit_loop
clr r_relaxdebonce
mov a,keycode
sbz keycode,0
xor keyflag,a ;对on/off 取反
sbz keycode,1
bst keyflag,1
; clr keycode
ret
nokey_loop:
mov a,r_relaxdebonce
add a,c_debonce
sbnz status,0
jmp exit_loop
clr r_pressdebonce
clr keycode
exit_loop:
; clr r_pressdebonce ;
ret
delay:
mov a,20
mov temp2,a
delay_loop0:
mov a,200
mov temp3,a
delay_loop1:
wdtc
nop
nop
nop
nop
nop
nop
sdz temp3
jmp delay_loop1
sdz temp2
jmp delay_loop0
nop
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -