📄 a7960.dt
字号:
;客 户:奥利奇
;适用机型:A7980
;软体版本:02
;开发日期:2008-2-26 14:25
;版 权:美德斯电子有限公司所有
;修改内容:按键选择次数为1-4次(01版本为1-8次)
; 马达间隔工作时间为0.5秒(01版本为1秒)
;技术核心:自动感应供皂器,采用先进的编码方式,低功耗芯片使本电路板功能相当完善,能满足各种场合使用
; 马达每次工作时间为1秒
; 低电压报警为4.2V
; 马达工作时闪绿灯,低电压报警时闪红灯,每2秒闪一次,闪0.5秒
;----------------------------------------------------------
R0 == 0X0
R1 == 0X1
PC == 0x2
R3 == 0X3
R4 == 0X4
P5 == 0x5
P6 == 0x6
iocb == 0xb
IOCD == 0XD
IOCE == 0XE
time_ms == 0x19
time_jian_ge == 0x1d
key_time == 0x1e
motor_count == 0x1f
motor_count1 == 0x20
out_flag == 0x21
;----------------------------------------------------------
;out_flag,0=按键指示灯的标志
;----------------------------------------------------------
led_count == 0x22
time_led == 0x23
low_led == 0x24
key_count == 0x25
error_count == 0x26
clr_count == 0x27
time_100ms == 0x28
time_motor == 0x29
time_check == 0x2a
time_200ms == 0x2b
key_flag == 0x2c
;----------------------------------------------------------
;key_flag,0=发射的标志(0为发射,1为停止)
;key_flag,1=第一次检测有反射的标志
;key_flag,2=两次检测间隔200ms到了的标志
;key_flag,3=一直有反射的标志
;key_flag,4=马达输出的标志
;key_flag,5=电压低的标志
;key_flag,6=红灯亮的标志
;key_flag,7=
;----------------------------------------------------------
fashe_count == 0x2d
a_buf == 0x2e
r3_buf == 0x2f
;----------------------------------------------------------
ORG 0x000
RESET: JMP Main
ORG 0X08
jmp int_153
;----------------------------------------------------------
; RAM CLR
;----------------------------------------------------------
RAM_CLR: MOV A,@0X10
MOV r4,A
CLR_LOOP: mov a,@0x0
mov r0,a
INC r4
MOV A,r4
and a,@0x2f
xor a,@0x2f ;判断是否到了3eh
JBS r3,2
JMP CLR_LOOP
RET
;==========================================================
; Main Program
;==========================================================
Main: disi
clr p5
clr p6
mov a,@0xc
iow p5
mov a,@0x5a
iow p6
mov a,@0xbf
iow iocd ;p6.6有上拉
;----------------------------------
;以上为i/o设置
;----------------------------------
call ram_clr ;清ram
MOV A, @0X80
iow ioce ;开watchdog
MOV A, @0X6
MOV R1, A ;置计数器初值
MOV A, @0X01
IOW 0X0F
MOV A, @0X42 ;8分频
CONTW
eni
bs p5,1
bs p6,5
bs p6,7 ;开机亮一次红灯
bs key_flag,6
;----------------------------------
mov a,@0x64
mov time_200ms,a ;每200ms发射一次
mov time_check,a ;两次检测间隔时间
mov a,@0x32
mov time_100ms,a ;马达工作时间
mov a,@0x12
mov time_motor,a ;马达工作时间1
mov a,@0x66
mov clr_count,a ;0x66次检测不到表示无反射
mov a,@0xa
mov error_count,a ;两次检测间隔之间再检测到10次表次解码错误
mov a,@0x1e
mov low_led,a ;低电压红灯闪的间隔时间
mov a,@0x3
mov time_led,a ;红灯亮的时间
mov a,@0x5
mov key_time,a ;按键指示间隔时间
mov a,@0x1
mov motor_count,a
mov motor_count1,a ;马达工作次数
mov led_count,a
mov a,@0x15
mov time_jian_ge,a
;----------------------------------------------------------
; 主程序
;----------------------------------------------------------
loop:
call fashe
call key_check
call low_power
wdtc
jmp loop
;----------------------------------------------------------
; 按键
;----------------------------------------------------------
key_check:
jbc key_flag,3
ret ;有反射时禁止按键
jbc key_flag,7
jmp check_over ;按键闭合没有松开跳结束
jbc p6,6
ret ;无键闭合结束
inc key_count
jbs key_count,4
ret ;防抖
clr key_count
bs key_flag,7 ;置有键闭合的标志
bs out_flag,0 ;置需要按键指示的标志
mov a,@0x1e
mov low_led,a ;低压指示在完成按键指示后3秒再工作
mov a,motor_count1
xor a,@0x4 ;按键选择是否达到4次
jbc r3,2
jmp check_high ;工作次数达到8次跳
inc motor_count1 ;加1
mov a,motor_count1
mov motor_count,a ;用于马达工作计数
mov led_count,a ;用于按键指示计数
jmp check_over
check_high:
mov a,@0x1
mov motor_count,a
mov motor_count1,a
mov led_count,a ;超过4次重置1
check_over:
jbc p6,6 ;按键是否松开
bc key_flag,7
ret
;----------------------------------------------------------
; 低电压检测
;----------------------------------------------------------
low_power:
jbc key_flag,3
ret ;有反射时不检测
jbc key_flag,7
ret ;有按键工作时不检测
jbc out_flag,0
ret ;按键指示工作时不检测
jbs p6,4
jmp high
bs key_flag,5 ;置电压低的标志
ret
high:
bc key_flag,5 ;清电压低的标志
ret
;----------------------------------------------------------
; 发射
;----------------------------------------------------------
fashe:
jbc key_flag,0
ret
bs key_flag,0
mov a,@0x9a
mov fashe_count,a
fashe_loop:
bc p6,0
nop ;1
nop ;2
nop ;3
nop ;4
nop ;5
nop ;6
nop ;7
nop ;8
nop ;9
nop ;10
nop ;11
nop ;12
bs p6,0
nop ;1
nop ;2
nop ;3
nop ;4
nop ;5
nop ;6
nop ;7
nop ;8
nop ;9
djz fashe_count
jmp fashe_loop
ret
;----------------------------------------------------------
; 中断2ms
;----------------------------------------------------------
int_153:
mov a_buf,a
swap a_buf
swapa r3
mov r3_buf,a
CLR 0X0F
MOV A, @0x6
add a,r1 ;置计数器初值
;----------------------------------
djz time_200ms
jmp int_0
bc key_flag,0 ;间隔200ms发射一次
mov a,@0x64
mov time_200ms,a
;----------------------------------
int_0:
djz time_100ms
jmp int_1
mov a,@0x32
mov time_100ms,a ;0.1s
;---------------------------------
jbs key_flag,6
jmp int_low
djz time_led
jmp int_low
bc p6,7 ;灭红灯
bc key_flag,6 ;清灯亮的标志
mov a,@0x3
mov time_led,a ;重置时间,0.3s
;----------------------------------
int_low:
jbc key_flag,3
jmp int_motor ;有反射时不做低电压指示
jbc key_flag,7
jmp int_key ;有按键按下时不做低电压指示
jbc out_flag,0
jmp int_key ;有按键指示时不做电压指示
jbs key_flag,5
jmp int_key ;没的低电压不指示
djz low_led
jmp int_key ;3秒计时
bs p6,7 ;亮红灯
bc p5,0
bs key_flag,6 ;置红灯亮的标志
mov a,@0x1e
mov low_led,a ;重置时间
int_key:
jbs out_flag,0 ;是否需要按键指示
jmp int_motor
djz key_time ;计时
jmp int_motor
mov a,@0x5 ;重置时间
mov key_time,a ;间隔0.5s
bs key_flag,6 ;置红灯亮的标志
bc p5,0
bs p6,7 ;按键指示亮红灯
djz led_count ;按键次数计数
jmp int_motor
bc out_flag,0 ;完了清需要指示的标志
int_motor:
jbs key_flag,3
jmp int_motor1 ;没有反射时不做再次工作的计数
djz time_jian_ge
jmp int_motor1 ;间隔计时
mov a,@0x15
mov time_jian_ge,a ;重置时间
mov a,motor_count
and a,@0xff
jbc r3,2
jmp int_motor1 ;马达工作次数是否为0
dec motor_count
bs p6,2 ;马达输出
bs key_flag,4 ;置马达输出的标志
bs p5,0
bc p6,7 ;亮灯
int_motor1:
jbs key_flag,4 ;马达输出
jmp int_1
djz time_motor ;计时
jmp int_1
mov a,@0x12
mov time_motor,a ;重置马达工作时间
bc key_flag,4 ;清马达工作的标志
bc p6,2 ;关闭马达
bc p5,0 ;关闭马达工作指示灯
;----------------------------------
int_1: ;第二次解码
jbc key_flag,3
jmp int_3 ;马达一直工作不做第二次检测
jbs key_flag,1
jmp int_3 ;第一次没有检测到或没有检测跳第一次检测处
jbs key_flag,2
jmp int_4 ;没有到第二次检测的时间跳
jbc p5,3 ;第二次检测
jmp int_5 ;没有检测到跳
bc key_flag,1
bs key_flag,3 ;一直有反射的标志
bs p6,2 ;马达输出
bs key_flag,4 ;置马达输出的标志
bc out_flag,0 ;马达输出时清除按键指示
mov a,motor_count1
mov motor_count,a ;重置马达工作次数
dec motor_count
mov a,@0x16
mov time_jian_ge,a ;第一次时间要长一点
bs p5,0
bc p6,7
jmp int_6
int_3: ;第一次解码
jbc p5,3 ;第一次检测
jmp int_5
bs key_flag,1 ;第一次检测到的标志
mov a,@0x66
mov clr_count,a
mov a,@0xa
mov error_count,a
int_4: ;两次间隔计时
jbs key_flag,1
jmp int_6 ;第一次无反射跳
djz time_check
jmp int_6 ;时间没有到跳
bs key_flag,2
mov a,@0x64
mov time_check,a
jmp int_6
int_5:
djz clr_count
jmp int_6
bc p6,2 ;无反射,关闭马达
bc p5,0
bc key_flag,1 ;清检测到第一次的标志
bc key_flag,2 ;清第二次时间到的标志
bc key_flag,3 ;清一直有反的标志
bc key_flag,4 ;清马达输出的标志
mov a,@0x66
mov clr_count,a ;无反射计数器重置
mov a,@0x64
mov time_check,a ;间隔检测重置
mov a,@0x32
mov time_100ms,a
mov a,@0x12
mov time_motor,a ;马达工作时间重置
int_6:
jbs key_flag,1
jmp int_7
jbc key_flag,2
jmp int_7
jbc p5,3 ;除错检测
jmp int_7
djz error_count
jmp int_7
bc key_flag,1
bc key_flag,2
bc key_flag,3
bc key_flag,4
mov a,@0x66
mov clr_count,a
mov a,@0x64
mov time_check,a
mov a,@0x32
mov time_100ms,a
mov a,@0x12
mov time_motor,a
mov a,@0xa
mov error_count,a
int_7:
int_over:
swapa r3_buf
mov r3,a
swapa a_buf
reti
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -