📄 086.asm
字号:
MOV SP,#0D0H ;0C0H;此条不能放在BEGCL中间 mov WDTCN, #0DEh mov WDTCN, #0ADh
;mov OSCICN, #00001111B;;mov OSCXCN, #000h ; External Oscillator Control Register
mov OSCXCN, #01100111b ;外部振荡器控制寄存器:B7=外部振荡器状态位;B6-B4=外部振荡器方式位;B3=备用;B2-B0=外部振荡器频率控制位
mov R0,#30
OX_WAIT:
;如果使用内部时钟,但激活本配置则出现随机自动复位;参见P154
clr A ;osc djnz ACC, $ ;wait for clr A
djnz ACC, $ ;at least 1msOX_WAIT0: mov A, OSCXCN jnb ACC.7, OX_WAIT0 ;等待外部振荡器状态位=1这稳定态,复位后是内部振荡器启动;
DJNZ R0,OX_WAIT
; ;外部振荡器
MOV BATFLAG,#081H
lcall INITSFR ;特殊功能寄存器初始化
MOV STILLDROPCOUNTER,#00H ;静态滴液计数器
;读取正常关机标志
MOV DPTR,#ADDR_NOMALOFF
LCALL ReadInfoFromFlash
XRL A,#NOMALPOWEROFFFLAG
JZ FIRSTOPEN ;正常关机的处理
;非正常复位的处理
LCALL INITLCD
lcall UNNOMALRESETDISPLAY
mov RSTSRC,#00H
MOV P74OUT,#00000001B
MOV A,P4K
ORL A,#00001000B
ANL A,#10111111B
MOV P4,A
MOV P4K,A
MOV A,P5
MOV P5,A
MOV A,DJBEG
JZ INITTERMINATE
MOV A,DJBEG
XRL A,#0FAH
JNZ INITTERMINATE
;上电前电机还在运行
LCALL STARTSTEPMOTO
LJMP XF
INITTERMINATE:
LCALL BEGCL
LJMP XF
FIRSTOPEN:
lcall SoftPowenOn ;软开关上电处理
LCALL PStatusManageInit
LCALL RSTDELAY ;上电复位后延时一段时间,保证其他外设成功复位
LCALL RSTDELAY ;上电复位后延时一段时间,保证其他外设成功复位
CLR WTV170_RST
LCALL WTV_Delay
LCALL WTV_Delay
LCALL WTV_Delay
LCALL WTV_Delay
SETB WTV170_RST ;语音电路复位
LCALL WTV_Delay
;开机鸣叫
LCALL TONE_OPENDOOR
;等待开机按键放开
LCALL WaitBootKeyUp
LCALL BEGCL; 初始化处理子程;
;先初始化为非正常关机
mov NORMALPOWEROFF,#0AAH
LCALL WriteInfoToFlash
ORL P6,#00011111B;
anl p6,#11111000b;p6.3,p6.2=m1,m2;11=h,01=4,10=8,00=16,
mov a,#0ffh;
;初始停止电机
ANL A,#01111111B
LCALL SETP5VALUE
mov a,#0ffh;
;mov p4,a;
;mov p5,a;
MOV P7,A;
MOV P1,A;
MOV P5K,#11001111B;
lcall STOPSTEPMOTO
;设置看门狗间隔时间参数为7
MOV WDTCN,#07H
;-----------------------------------------
;主循环开始
;
;-----------------------------------------
XF:
XF0:
MOV WDTCN,#0A5H ;使能并重新装载看门狗
LCALL CHECKPUNMPPOSITION
lcall ADJUSTPRESSLEVEL
LOWJ2:
MOV A,DJBEG;
JZ XF63;
;电机在转动的情况下,清除漏液计数器
MOV STILLDROPCOUNTER,#00H ;静态滴液计数器
LCALL DROPCHECKTIME
MOV A,R0
CPL A;
clr c
ADD A,JAZN;
JNC XF63
;检测时间到三,开始实际滴速计算和对比处理
LCALL DDSERR;
MOV R0,#KVOBZ;
MOV A,@R0;
JNZ XF63 ;KVO模式跳转到XF63
XF63:
MOV A,P4K
ORL A,#00001000B
MOV P4,A
MOV P4K,A
LCALL DISPLAY;
LCALL DISRJ;键识别
;快注结束判断
MOV R0,#KUAIZHU ;
MOV A,@R0 ;
JZ XF631 ;非快注状态,不需要判断是否放键
;快注状态下按键判断
MOV A,KEYC
XRL A,#14 ;判断是否为快注键,为快注键继续输液,否则停止快注
JZ XF631
;放开快注键
LCALL K06CL1
XF631:
SETB EA;
LCALL LEDCL ;指示灯处理
LCALL GDCL ;光带处理;
LCALL HSJCL
LCALL CHARGECL ;充电管理
;---------------------------------------------------------------------------------------------------
WARNINFOCL:
;报警信息处理
LCALL GDCL0
LCALL FATAERRCL
;---------------------------------------------------------------------------------------------
;键盘处理程序
;---------------------------------------------------------------------------------------------
XF1:
XF10:
MOV A,KEYC;键值处理;
XRL A,#0FFH;
JZ XFJ1;
;有按键的情况下的判断处理
;如果此时为暂停状态,暂停报警计时归0
MOV R0,#STATUS ;;机器运行状态字:b7=1 输完,b6=1 暂停,b5=1故障暂停(无计时限),b4=1锁键盘,b3=,b2=,b1=1(定量),b0=1(按滴/分控制,b0=0(按ml/小时控制)
mov A,@R0
ANL A,#01000000B
JZ XF10_0
;暂停情况下,清除暂停计时器
MOV R0,#PAUSETIME
MOV A,#00H
MOV @R0,A
mov A,GJBZ1 ;告警标志定义:b7=,b6=暂停超时,b5=输完,b4=门,b3=机障,b2=阻塞,b1=气泡,b0=欠压
jnb ACC.6,XF10_0
ANL A,#10111111B
MOV GJBZ1,A
LCALL CLEARWARNFLAG
;此时的键值都作为无效键处理
MOV KEYC,#0FFH
LJMP XFJ1
XF10_0:
MOV A,KEYC;
MOV DPTR,#TABK;用TAB+功能字母的方式不必记表的序号,键值变换送KODE; 读取数字键的值
MOVC A,@A+DPTR
MOV KCODE,A;
JMP XFK
TABK:
DB 01H,02H,03H,04H,05H,06H,07H,08H,0FFH,09H,00H,0FFH,0FFH,0FFH,0FFH,0FFH;
XFK:
;键值范围判断
CLR C
MOV A,#15
CPL A
ADD A,KEYC
JC XFJ1 ;无效键值,不处理
;有效键值
MOV A,KEYC;
MOV R1,A;
RL A;
ADD A,R1; (A)*3
MOV DPTR,#TAB2;
JMP @A+DPTR;
TAB2:
LJMP K00CL;数1 KEYC = 0
LJMP K00CL;数2 KEYC = 1
LJMP K00CL;数3 KEYC = 2
LJMP K00CL;数4 KEYC = 3
LJMP K00CL;数5 KEYC = 4
LJMP K00CL;数6 KEYC = 5
LJMP K00CL;数字7处理 KEYC = 6
LJMP K00CL;数8 KEYC = 7
LJMP K04CL;清除处理; KEYC = 8 调试 20060221
LJMP K00CL;数9 KEYC = 9
LJMP K00CL;数0 KEYC = 10
LJMP K05CL;确认KEY12 KEYC = 11
LJMP KEY13;备用键处理 KEYC = 12
LJMP K07CL;启停处理KEY14; KEYC = 13
LJMP KEY13; K06CL;快注处理 KEY15; KEYC = 14 快注不在这里启动
LJMP K02CL;转换键处理KEY16; KEYC = 15
XFJ1:
LJMP XF
KEY13:
LJMP XF;备用键处理;
;---------------------------------------------------------------------------------------------
;函数名称:K00CL
;函数功能: 数字按键处理
;
;
;其他说明:
;---------------------------------------------------------------------------------------------
K00CL:;
MOV A,DJBEG
JZ K00CL_000
;电机运行输液状态
;LCALL TONE_ERR
LJMP XF
K00CL_000:
MOV A,WINDOWS ;逻辑窗口为奇数时,不处理(输入锁定状态)
ANL A,#00000001B ;
JZ K00CL1;
LJMP XF
K00CL1:
;增加对总累计窗口的输入保护(不需要输入)
MOV A,WINDOWS
RR A
XRL A,#05
JNZ K00CL10
;总累计不需要输入
;MOV A, DJBEG
;JZ K00CL10 ;非输液过程中可以修改总累计
LJMP XF
K00CL10:
;已输入位数判断
MOV A,WBZ
jnz K00CL10_0
;第一次输入数字,清除显示信息区
MOV XSTMPH,#00H;窗口清除;
MOV XSTMPL,#00H;
LCALL WWDISM ;将XSTMPH,XSTMPL写入各逻辑窗口对应的输入窗口寄存器中;
LCALL WIN1AD ;取得当前窗口显存首址到R0
LCALL CLRXS ;清除显存区信息
;判断第一次输入的是否为0,为0不增加位数处理
MOV A,KCODE
JNZ K00CL_FIRSTBIT
;第一位输入为0,无效退出
ljmp XF
K00CL_FIRSTBIT:
;第一位输入不为0
;判断当前窗口是否为滴速设置窗口
mov A,WINDOWS
XRL A,#04H
JNZ K00CL10_0
;滴速设置窗口从第二位开始输入
inc WBZ
K00CL10_0:
LCALL GETW ;得当前逻辑窗口的物理窗口 A=返回值
XRL A,#02
JNZ K00CL10_1 ;非2号物理窗口的判断跳转
;2号物理窗口的输入位数判断
MOV A,WBZ
XRL A,#02H
JNZ K00CL10_2
;输入位数已经达到2,不处理
LJMP XF
K00CL10_1:
;非2号物理窗口的判断跳转
MOV A,WBZ
XRL A,#04H
jnz K00CL10_2
;输入位数已经达到4,不处理
LJMP XF
K00CL10_2:
LCALL WDISM ;将对应窗口的指示值送显示暂存(step->XSTMPL等),当前窗口显示BCD码存储首址DISMX送寄存器JCQ1
LCALL BCDZF ;将暂存(XSTMPL)转换为BCD码送显存,窗口指定位置存储到DISMx中
LCALL BCDMOV ;在BCDZF中(JCQ1)内容已加3 同时将键值按当前窗口指定位置存储到DISMx中
LCALL BCD4ADD;当前窗口四位BCD码转换为二进制并存入XSTMPH/L;
K00CL2:
LCALL WIN1AD ;获取该窗口显示对应显存首址DISMX,R0返回
MOV JCQ1,R0 ;
LCALL BCDZF ;将 XTMP(二进制)转为BCD存入 DISMX
;----------------------------------------------------------------------------------------
;函数名称: WWDISM
;函数功能:将输入缓冲区转换的二进制数据(在XTMP中)根据窗口号存入相应寄存器
; WW0: step=XSTMPL WW1: ZDJCQ=XSTMPL WW2: DSCHDSCL = XSTMPH XSTMPL,DSJCQH DSJCQL = XSTMPH XSTMPL
; WW3: HASENH/L=XSTMPH/L WW4: TOTAH/L=XSTMPH/L WW5: SUMH/L = XSTMPH/L
;----------------------------------------------------------------------------------------
LCALL WWDISM ;将XSTMPH,XSTMPL写入各逻辑窗口对应的键入寄存器中(DSJCQ,zdJCQ等);
LCALL GETW ;得当前逻辑窗口的物理窗口 A=返回值
INC WBZ ;w位光标前移 (输入位数增加1)
XRL A,#02
JNZ K01F1
;物理窗口为2时,位标志极限为2(位数极限);
MOV A,WBZ ;
XRL A,#02H ;
JNZ K01FF ;不等于2,可以继续输入
;MOV WBZ,#00H ;位光标回头(输入位数不能归零)
K01FF:
JMP XF ;
K01F1:
;物理窗口为1,3时,位标志上限为4
MOV A,WBZ
XRL A,#04H;
JNZ K01FF
;MOV WBZ,#00H ;不需要归零
LJMP XF;
K01CL:
MOV A,WINDOWS;逻辑窗口为奇数时,不存显示;
ANL A,#00000001B;
JZ K01CL1;
LJMP XF
K01CL1:
LCALL WDISM;将对应窗口的指示值送显示暂存,当前窗口首址送寄存器JCQ1
LCALL BCDZF;将暂存转换为BCD码送显存,窗口指定位置存储到DISMx中
LCALL BCD4ADD ;当前窗口四位BCD码转换为二进制;送入XSTMP中
K01CL2:
LCALL WIN1AD ;获取该窗口显示对应显存首址DISMX,R0返回
MOV JCQ1,R0;
LCALL BCDZF ;将暂存XSTMP转换为BCD码送存储到DISMx中
;----------------------------------------------------------------------------------------
;函数名称: WWDISM
;函数功能:将输入缓冲区转换的二进制数据(在XTMP中)根据窗口号存入相应寄存器
; WW0: step=XSTMPL WW1: ZDJCQ=XSTMPL WW2: DSCHDSCL = XSTMPH XSTMPL,DSJCQH DSJCQL = XSTMPH XSTMPL
; WW3: HASENH/L=XSTMPH/L WW4: TOTAH/L=XSTMPH/L WW5: SUMH/L = XSTMPH/L
;----------------------------------------------------------------------------------------
LCALL WWDISM;将XSTMPH,XSTMPL写入各逻辑窗口对应的寄存器中;
JMP XF;
;--------------------------------------------------------------------------------------------
;转换键处理(切换键处理)
;--------------------------------------------------------------------------------------------
K02CL:
CLR C
MOV A,#13
CPL A
ADD A,WINDOWS
JC K02CLERR
JMP K02CLOK
K02CLERR:
;窗口号错误,不处理
ljmp K02CLret
K02CLOK:
MOV A,DJBEG
JZ K02CLOK_0
;电机运行状态下
LJMP K02CLret
K02CLOK_0:
MOV A,WINDOWS
CLR C
RRC A;
MOV R1,A;
RL A;
ADD A,R1; (A)*3
MOV DPTR,#TABK02C;
JMP @A+DPTR;
TABK02C:
LJMP XZSWITCH ;校正值窗口切换
LJMP ZDSWITCH ;针头窗口切换
LJMP DRPSWITCH ;滴速窗口切换
LJMP HSQRNSWITCH ;流速(毫升/小时)窗口切换
LJMP TOTALSWITCH ;输液设定量窗口切换;
LJMP SUMSWITCH ;输液总累计窗口窗口切换
LJMP STEPSIGNSWITCH ;校正符号窗口切换
K02CLret:
LJMP XF
;校正值窗口切换
XZSWITCH:
MOV A,WINDOWS
XRL A,#00H
JZ XZSWITCH0
;窗口1的切换
JMP XZSWITCH1
XZSWITCH0:
;窗口0的切换
inc WINDOWS
JMP XZSWITCH2
XZSWITCH1 :
;切换到窗口4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -