📄 2040a.dt
字号:
;客 户:奥利奇
;适用机型:2050
;软体版本:01
;开发日期:2008-10-23 15:04
;版 权:与利达电子有限公司所有
;技术核心:
;----------------------------------------------------------
R0 == 0X0
R1 == 0X1
PC == 0x2
R3 == 0X3
R4 == 0X4
P5 == 0x5
P6 == 0x6
p7 == 0x7
iocb == 0xb
ioce == 0XE
iocf == 0xf
;----------------------------------------------------------
time_count == 0x2e
time_count1 == 0x2f
error_count == 0x30
time_check == 0x31
key_flag == 0x32
;----------------------------------------------------------
;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 == 0x33
time_motor == 0x34
time_motor1 == 0x35
time_fashe == 0x36 ;发射的间隔时间
count_low == 0x37 ;低速检测计数,用于防抖
count_mid == 0x38
count_high == 0x39
disp_flag == 0x3a
;----------------------------------------------------------
;disp_flag,0=低速按键状态标志
;disp_flag,1=中速按键状态标志
;disp_flag,2=高速按键状态标志
;disp_flag,3=数码管位选标志
;disp_flag,4=低速档的标志
;disp_flag,5=中速档的标志
;disp_flag,6=高速档的标志
;----------------------------------------------------------
data_disp1 == 0x3b
data_disp2 == 0x3c
a_buf == 0x3d
r3_buf == 0x3e
r3f == 0x3f
;----------------------------------------------------------
ORG 0x0fff
RESET: JMP Main
ORG 0x000
JMP Main
ORG 0X01
int_153:
mov a_buf,a
swap a_buf
swapa r3
mov r3_buf,a
bc r3f,0
MOV A, @0x6
add a,r1 ;置计数器初值
;----------------------------------
;感应计时
;----------------------------------
jbs key_flag,3
jmp int_2
djz time_count
jmp int_2
mov a,@0xfa
mov time_count,a
djz time_count1
jmp int_2
mov a,@0x78
mov time_count1,a
bs key_flag,4 ;置马达工作时间达到60秒的标志
bc p6,0
bc p6,1
bc p6,2
int_2:
;----------------------------------
;延时关闭马达
;----------------------------------
jbs key_flag,3
jmp int_3
djz time_motor
jmp int_3
mov a,@0x19
mov time_motor,a
djz time_motor1
jmp int_3
bc key_flag,3
bc key_flag,4 ;清马达工作达到60秒的标志
bc p6,0
bc p6,1
bc p6,2
mov a,@0xfa
mov time_count,a
mov a,@0x78
mov time_count1,a ;马达最长工作时间赋值
int_3:
;----------------------------------
;显示
;----------------------------------
jbc disp_flag,3 ;是否要显示第一位?
jmp int_4 ;跳第二位显示
bs disp_flag,3
bs p6,3
bc p6,4
mov a,data_disp1
mov p7,a
jmp int_6
int_4:
bc disp_flag,3
bc p6,3
bs p6,4
mov a,data_disp2
mov p7,a
int_6:
;----------------------------------
;两次检测之间计时
;----------------------------------
jbs key_flag,1
jmp int_7
djz time_check
jmp int_7
bc key_flag,1 ;清第一次检测到的标志
bs key_flag,2 ;置到了第二次检测时间的标志
int_7:
;----------------------------------
;间隔发射计时
;----------------------------------
djz time_fashe
jmp int_8
mov a,@0x64
mov time_fashe,a
bc key_flag,0 ;允许发射
int_8:
;----------------------------------
;解码开始
;----------------------------------
jbc key_flag,2 ;是否到了第二次检测的时间
jmp int_10
jbc key_flag,1 ;是否检测到第一次
jmp int_9
jbc p5,3 ;是否有感应(第一次检测)
jmp int_12 ;无感应跳
bs key_flag,1 ;置检测到第一次的标志
mov a,@0x64
mov time_check,a
mov a,@0xa
mov error_count,a
int_9:
;----------------------------------
;两次之间检测
;----------------------------------
jbc p5,3 ;是否有错误信号
jmp int_12
djz error_count ;错误信号计数
jmp int_12
bc key_flag,1 ;出现10次错误信号,清第一次感应到的标志
jmp int_12
int_10:
;----------------------------------
;第二次检测
;----------------------------------
jbc p5,3
jmp int_11
bs key_flag,3 ;置马达工作的标志
mov a,@0x19
mov time_motor,a
mov a,@0x10
mov time_motor1,a
jbc key_flag,4 ;马达是否工作达到60秒
jmp int_11
bs p6,0
jbc disp_flag,4 ;是否在低速状态?
jmp int_11
jbc disp_flag,5
jmp int_high
bs p6,1
jmp int_11
int_high:
bs p6,2
int_11:
;----------------------------------
;第二次没有检测到处理
;----------------------------------
bc key_flag,2 ;清到第二次检测时间的标志
int_12:
;----------------------------------
;无感应处理
;----------------------------------
int_over:
nop
swapa r3_buf
mov r3,a
swapa a_buf
reti
; 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,@0x3f
xor a,@0x3f ;判断是否到了3eh
JBS r3,2
JMP CLR_LOOP
RET
;==========================================================
; Main Program
;==========================================================
Main: disi
clr p5
clr p6
clr p7
mov a,@0xf ;p5输入
iow p5
mov a,@0x0 ;p6输出
iow p6
mov a,@0x0
iow p7
;----------------------------------
;以上为i/o设置
;----------------------------------
call ram_clr ;清ram
mov a,@0xff
iow iocb
MOV A,@0x31 ;开watchdog
iow ioce
MOV A, @0X01 ;允许中断
IOW iocf
MOV A,@0X6 ;置计数器初值
MOV R1,A
MOV A,@0Xc2 ;8分频给TCC,禁止唤醒
CONTW
eni
mov a,@0x24
mov data_disp1,a
mov a,@0x49
mov data_disp2,a ;开机默认显示值
bs disp_flag,4 ;开机默认低档
mov a,@0x64
mov time_fashe,a ;发射间隔时间赋值
;----------------------------------
mov a,@0x64
mov time_check,a ;两次检测间隔时间
mov a,@0xa
mov error_count,a ;两次检测间隔之间再检测到10次表次解码错误
mov a,@0xfa
mov time_count,a
mov a,@0x78
mov time_count1,a ;马达最长工作时间赋值
;----------------------------------------------------------
; 主程序
;----------------------------------------------------------
loop:
call key_low
call key_mid
call key_high
call fashe
wdtc
jmp loop
;----------------------------------------------------------
; 发射
;----------------------------------------------------------
fashe:
jbc key_flag,0
ret
bs key_flag,0
mov a,@0x9a
mov fashe_count,a
fashe_loop:
bs p6,6
nop ;1
nop ;2
nop ;3
nop ;4
nop ;5
nop ;6
nop ;7
nop ;8
nop ;9
nop ;10
nop ;11
nop ;12
bc p6,6
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
;----------------------------------------------------------
;按键检测1
;----------------------------------------------------------
key_low:
jbc disp_flag,0 ;按键检测之前是否松开过?
jmp low_end
jbc p5,0 ;是否闭合?
jmp low_over
inc count_low
jbs count_low,4
ret
bs disp_flag,0
clr count_low
mov a,@0x24
mov data_disp1,a
mov a,@0x49
mov data_disp2,a
bc p6,1 ;关闭中速发热丝
bc p6,2 ;关闭高速发热比
bs disp_flag,4 ;置低速运行的标志
ret
low_over:
clr count_low
ret
low_end:
jbc p5,0
bc disp_flag,0
ret
;----------------------------------------------------------
;按键检测2
;----------------------------------------------------------
key_mid:
jbc disp_flag,1 ;按键检测之前是否松开过?
jmp mid_end
jbc p5,1 ;是否闭合?
jmp mid_over
inc count_mid
jbs count_mid,4
ret
bs disp_flag,1
clr count_mid
mov a,@0x41
mov data_disp1,a
mov a,@0x2
mov data_disp2,a
bc p6,2 ;关闭高速发热丝
bc disp_flag,4
bc disp_flag,5 ;置为中速工作状态
ret
mid_over:
clr count_mid
ret
mid_end:
jbc p5,1
bc disp_flag,1
ret
;----------------------------------------------------------
;按键检测3
;----------------------------------------------------------
key_high:
jbc disp_flag,2 ;按键检测之前是否松开过?
jmp high_end
jbc p5,2 ;是否闭合?
jmp high_over
inc count_high
jbs count_high,4
ret
bs disp_flag,2
clr count_high
mov a,@0x1
mov data_disp1,a
mov a,@0x49
mov data_disp2,a
bc p6,1 ;关闭中速发热丝
bc disp_flag,4
bs disp_flag,5 ;置为高速工作状态
ret
high_over:
clr count_high
ret
high_end:
jbc p5,2
bc disp_flag,2
ret
;----------------------------------------------------------
; 中断2ms
;----------------------------------------------------------
/*
int_153:
mov a_buf,a
swap a_buf
swapa r3
mov r3_buf,a
bc r3f,0
MOV A, @0x6
add a,r1 ;置计数器初值
;----------------------------------
;感应计时
;----------------------------------
jbs key_flag,3
jmp int_2
djz time_count
jmp int_2
mov a,@0xfa
mov time_count,a
djz time_count1
jmp int_2
mov a,@0x78
mov time_count1,a
bs key_flag,4 ;置马达工作时间达到60秒的标志
bc p6,0
bc p6,1
bc p6,2
int_2:
;----------------------------------
;延时关闭马达
;----------------------------------
jbs key_flag,3
jmp int_3
djz time_motor
jmp int_3
mov a,@0x19
mov time_motor,a
djz time_motor1
jmp int_3
bc key_flag,3
bc key_flag,4 ;清马达工作达到60秒的标志
bc p6,0
bc p6,1
bc p6,2
mov a,@0xfa
mov time_count,a
mov a,@0x78
mov time_count1,a ;马达最长工作时间赋值
int_3:
;----------------------------------
;显示
;----------------------------------
jbc disp_flag,3 ;是否要显示第一位?
jmp int_4 ;跳第二位显示
bs disp_flag,3
bs p6,3
bc p6,4
mov a,data_disp1
mov p7,a
jmp int_6
int_4:
bc disp_flag,3
bc p6,3
bs p6,4
mov a,data_disp2
mov p7,a
int_6:
;----------------------------------
;两次检测之间计时
;----------------------------------
jbs key_flag,1
jmp int_7
djz time_check
jmp int_7
bc key_flag,1 ;清第一次检测到的标志
bs key_flag,2 ;置到了第二次检测时间的标志
int_7:
;----------------------------------
;间隔发射计时
;----------------------------------
djz time_fashe
jmp int_8
mov a,@0x64
mov time_fashe,a
bc key_flag,0 ;允许发射
int_8:
;----------------------------------
;解码开始
;----------------------------------
jbc key_flag,2 ;是否到了第二次检测的时间
jmp int_10
jbc key_flag,1 ;是否检测到第一次
jmp int_9
jbc p5,3 ;是否有感应(第一次检测)
jmp int_12 ;无感应跳
bs key_flag,1 ;置检测到第一次的标志
mov a,@0x64
mov time_check,a
mov a,@0xa
mov error_count,a
int_9:
;----------------------------------
;两次之间检测
;----------------------------------
jbc p5,3 ;是否有错误信号
jmp int_12
djz error_count ;错误信号计数
jmp int_12
bc key_flag,1 ;出现10次错误信号,清第一次感应到的标志
jmp int_12
int_10:
;----------------------------------
;第二次检测
;----------------------------------
jbc p5,3
jmp int_11
bs key_flag,3 ;置马达工作的标志
mov a,@0x19
mov time_motor,a
mov a,@0x10
mov time_motor1,a
jbc key_flag,4 ;马达是否工作达到60秒
jmp int_11
bs p6,0
jbc disp_flag,4 ;是否在低速状态?
jmp int_11
jbc disp_flag,5
jmp int_high
bs p6,1
jmp int_11
int_high:
bs p6,2
int_11:
;----------------------------------
;第二次没有检测到处理
;----------------------------------
bc key_flag,2 ;清到第二次检测时间的标志
int_12:
;----------------------------------
;无感应处理
;----------------------------------
int_over:
nop
swapa r3_buf
mov r3,a
swapa a_buf
reti */
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -