⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 086.asm

📁 AVR液晶程序模块
💻 ASM
📖 第 1 页 / 共 5 页
字号:
							 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 + -