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

📄 xdxhfsq.asm

📁 为了让广大的工科大学生理解单片机应用系统的开发方法
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	LCALL  L0704H		;调L0704H子程序
	MOV    A, #0EH		;执行0E#指令:显示开,光标显示,光标不闪烁
	LCALL  L0704H		;调L0704H子程序
L026DH: 			;
	AJMP   L0330H		;转闪烁显示处理
;-------------------------------;
;NOIS键处理                     ;
;-------------------------------;
L026FH: 			;NOIS键处理
	JB     13H, L028EH	;主菜单没有NOIS键处理要求,则跳转闪烁显示处理
	JNB    15H, L028EH	;非主菜单但在WAVE状态下也无需NOIS处理要求,则跳转闪烁显示处理
	JBC    05H, L0285H	;若NIOS功能已经打开,则本次按NIOS键关闭该功能,故清零0且转
	SETB   05H		;若前面没打开NIOS功能,则现在启用该功能,设置标志
	MOV    A, #0CBH 	;CB#指令:次行DDRAM地址从4BH开始
	MOV    R0, #4BH 	;5个NIOS有关提示字符送液晶显示器
	MOV    R7, #05H 	;将从4BH开始的5个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	AJMP   L028EH		;短跳转至L028EH
L0285H: 			;
	MOV    A, #0CBH 	;CB#指令:次行DDRAM地址从4BH开始
	MOV    R7, #05H 	;5个空格写入液晶显示器
	LCALL  L0723H		;调L0723H子程序:查询液晶状态BF,若为0则写入指令代码,再将(R7)个空格写入到数据寄存器中
	AJMP   L028EH		;短跳转闪烁显示处理
L028EH: 			;
	AJMP   L0330H		;短跳转闪烁显示处理
;-------------------------------;
;∩键处理程序                    ;
;-------------------------------;
L0290H: 			;∩键处理程序
	JB     13H, L02A0H	;主菜单下没∩键处理要求,则跳转闪烁显示处理
	JNB    0CH, L02A0H	;不存在非定标信号处理,不可能加定标脉冲,则跳转闪烁显示处理
	JB     06H, L02A0H	;若已经启用∩键处理,则跳转闪烁显示处理
	MOV    5DH, #00H	;标记时间记时器清0
	SETB   06H		;设置启用∩键处理标记标志
	AJMP   L02A0H		;短跳转至L02A0H
L02A0H: 			;
	AJMP   L0330H		;短跳转至L0330H
;-------------------------------;
;MENU键处理                     ;
;-------------------------------;
L02A2H: 			;MENU键处理
	JB     13H, L02EEH	;若是在主菜单状态,则跳转至L02EEH
	MOV    R0, #30H 	;其它状态下按MENU键,要回到主菜单,
	MOV    R7, #20H 	;将主菜单屏显示的信息拷贝到显示缓冲区30H~4FH中
	MOV    R6, #00H 	;
	LCALL  L0694H		;调L0694H子程序:拷贝No1_SCREEN中偏移(R6)开始的(R7)个字节到@R0中
	SETB   13H		;设置主菜单标志
	MOV    A, #80H		;80#指令:两行显示,首行DDRAM地址从00H开始
	MOV    R0, #30H 	;显示首行
	MOV    R7, #10H 	;将从30H开始的16个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	MOV    A, #0C0H 	;C0#指令:两行显示,次行DDRAM地址从40H开始
	MOV    R0, #40H 	;显示第2行
	MOV    R7, #10H 	;将从40H开始的16个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	MOV    R4, #00H 	;光标位置设置为0,光标在正常心电ECG
	LCALL  L069FH		;调L069FH子程序:取表08E5H偏移(R4)的字符给A,光标在正常心电ECG处显示
	LCALL  L0704H		;调L0704H子程序
	MOV    A, #0EH		;执行0E#指令:显示开,光标显示,光标不闪烁
	LCALL  L0704H		;调L0704H子程序
	MOV    R1, #07H 	;波形类型计数器缺省为7
	MOV    A, R1		;R1的内容送A
	CJNE   A, 2CH, L02D7H	;若A的值不等于原始波形类型值,则跳转至L02D7H
	AJMP   L02DBH		;短跳转至L02DBH
L02D7H: 			;
	SETB   04H		;还有因波形类型修改后要处理的内容
	MOV    2CH, R1		;把回到主菜单的缺省心电波形类型代码7作为原始波形类型计数器
L02DBH: 			;
	MOV    R2, #09H 	;增益代码重新设置为9(x1.0)
	MOV    R0, #5BH 	;获得增益值
	MOV    R7, #01H 	;
	MOV    R6, #03H 	;
	LCALL  L0642H		;调L0642H子程序:拷贝0988H中偏移(R2)*4+(R6)开始的(R7)个字节到@R0中
	CLR    02H		;取消TYPE波形类型选择功能
	CLR    03H		;取消GAIN增益设置功能
	CLR    05H		;取消NOIS功能
	AJMP   L0330H		;短跳转闪烁显示处理
L02EEH: 			;主菜单是MENU键处理
	MOV    A, #0CH		;执行0C#指令:显示开,光标不显示,光标不闪烁
	LCALL  L0704H		;调L0704H子程序
	CJNE   R4, #00H, L0305H ;若光标位置不在正常心电ECG,则跳转至L0305H
	LCALL  L06A5H		;是在正常心电状态,调L06A5H子程序,把正常心电的显示信息送显示缓冲区,包括x*.*、脉冲作用位置和NOISE信息
	MOV    2EH, #0		;00000000B送2EH
	MOV    2FH, #13		;正常心电波形类型码在0~13范围,下限2EH是0,上限送13
	SETB   14H		;正常心电14H置1
	SETB   15H		;正常心电15H置1
	AJMP   L0330H		;短跳转闪烁显示处理
L0305H: 			;不是正常心电
	CJNE   R4, #01H, L031DH ;若也不是ARRHY,则是WAVE,则跳转至L031DH
	MOV    R1, #16	 	;是ARRHY状态,波形类型缺省起点16送波形类型,即提示信息是PVCS 10/min 80的波形
	MOV    2CH, R1		;原始波形类型记忆为16
	SETB   04H		;因波形类型修改后有要处理的内容
	LCALL  L06A5H		;是ARRHY,调L06A5H子程序,
	MOV    2EH, #14		;ARRHY波形类型码范围是14~32,故下限送14
	MOV    2FH, #32		;上限送32
	CLR    14H		;ARRHY时14H清0
	SETB   15H		;ARRHY时15H置1
	AJMP   L0330H		;短跳转闪烁显示处理
L031DH: 			;光标在WAVE位置时MENU键按下时的处理
	MOV    R1, #33	 	;波形类型计数器设置为33
	MOV    2CH, R1		;并且记忆为原始波形类型代码
	SETB   04H		;因波形类型修改后有要处理的内容
	LCALL  L06A5H		;WAVE状态,调L06A5H子程序
	MOV    2EH, #33		;WAVE状态,下限送33
	MOV    2FH, #35		;WAVE状态,上限送35
	CLR    14H		;WAVE状态,14H清0
	CLR    15H		;WAVE状态,15H清0
;===============================;
;闪烁显示处理模块                ;
;===============================;
L0330H: 			;闪烁显示处理由此开始
	JNB    TF1, L03A3H	;若T1计时未溢出,即不到10mS,则跳转至L03A3H
	CLR    TR1		;10mS到了,禁止T1计时
	MOV    A, #0F7H 	;11110111B送A
	ADD    A, TL1		;A=A+TL1
	MOV    TL1, A		;A送TL1
	MOV    A, #0D8H 	;11011000B送A
	ADDC   A, TH1		;A=A+TH1+CY
	MOV    TH1, A		;冲装定时9.993mS
	SETB   TR1		;允许T1计时
	CLR    TF1		;溢出标志TF1清0
	MOV    PSW, #10H	;改用2区,准备处理闪烁显示问题
	INC    R1		;定时计时器加1(+10mS)
	CJNE   R1, #20, L035BH	;不到0.2秒,则跳转至L035BH
	JB     13H, L036EH	;若主菜单状态,则跳转至L036EH
	MOV    A, #8FH		;到0.2秒时,不在主菜单的情况,8F#指令:两行显示,首行DDRAM地址从0FH开始
	LCALL  L0704H		;调L0704H子程序
	MOV    A, #20H		;实现心脏闪烁,目前换成显示空格
	LCALL  L06FCH		;调L06FCH子程序:将空格数据写入数据寄存器中
	AJMP   L036EH		;短跳转至L036EH
L035BH: 			;
	MOV    A, R1		;R1的内容送A
	CJNE   A, 50H, L036EH	;未计时到闪烁显示周期记时器的10mS倍数,则跳转至L036EH
	JB     13H, L036CH	;主菜单状态,则跳转至L036CH
	MOV    A, #8FH		;计时到50H存放10mS的倍数,8F#指令:两行显示,首行DDRAM地址从0FH开始
	LCALL  L0704H		;调L0704H子程序
	MOV    A, #00H		;红心字符送显示,与前面的空格形成闪烁的效果。
	LCALL  L06FCH		;调L06FCH子程序:将数据写入数据寄存器中
L036CH: 			;
	MOV    R1, #00H 	;R1计时器清0
L036EH: 			;
	INC    R2		;R2在TYPE波形类型选择状态时设置为20,R2计时器加1
	CJNE   R2, #40, L0386H	;若R2的内容不等于400mS,则跳转至L0386H
	JNB    02H, L037CH	;若不在波形类型选择状态,则跳转至L037CH
        MOV    A,#80H           ;R2计时到400mS时,在波形类型选择状态,
        MOV    R7,#0FH          ;波形类型选择显示提示先送15个空格,达到闪烁显示的目的
	LCALL  L0723H		;调L0723H子程序:查询液晶状态BF,若为0则写入指令代码,再将(R7)个数据空格20H写入到数据寄存器中
L037CH: 			;
	JNB    03H, L0386H	;若不在增益选择状态,则跳转至L0386H
	MOV    A, #0C1H 	;在增益选择状态,C1#指令:两行显示,次行DDRAM地址从41H开始
	MOV    R7, #03H 	;应该在增益提示显示处先送空格
	LCALL  L0723H		;调L0723H子程序:查询液晶状态BF,若为0则写入指令代码,再将(R7)个数据空格20H写入到数据寄存器中
L0386H: 			;
	CJNE   R2, #80, L03A3H	;若R2的内容不等于800mS,则跳转至L03A3H
	JNB    02H, L0395H	;不在波形类型选择状态,则跳转至L0395H
	MOV    A, #80H		;在波形类型选择期间,R2计时到800mS,80#指令:两行显示,首行DDRAM地址从00H开始
	MOV    R0, #30H 	;将显示缓冲区首行的15个字符,送液晶显示器显示。
	MOV    R7, #0FH 	;将从30H开始的15个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
L0395H: 			;
	JNB    03H, L03A1H	;若不在增益选择状态,则跳转至L03A1H
	MOV    A, #0C1H 	;在增益选择状态,C1#指令:两行显示,次行DDRAM地址从41H开始
	MOV    R0, #41H 	;将显示缓冲区2行增益字符送液晶显示器显示
	MOV    R7, #03H 	;将从41H开始的3个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
L03A1H: 			;
	MOV    R2, #00H 	;计时器R2重新清0,闪烁显示处理完毕
L03A3H: 			;无论10mS到与否,均会到此。
	MOV    A, 5CH		;5CH中的内容送A
	ADD    A, TL0		;A=A+TL0
	ANL    A, #0FH		;取A的低4位,值为0~7H、8~FH
	CLR    C		;CY清0
	SUBB   A, #08H		;A=A-08H,结果原来在0~7H,结果是F8H~FFH,原来是8~FH,结果则为0~7H
	MOV    5CH, A		;A值送5CH,特点是-8~+7,即绝对值较小。
	MOV    C, ACC.7 	;将A.7送CY
	MOV    ACC.2, C 	;将CY送A.2,符号位送第2位,
				;意味着F8H~FFH符号位是1,结果FCH\FDH\FEH\FFH\FCH\FDH\FEH\FFH\
				;意味着00H~07H符号位是0,结果00H\01H\02H\03H\00H\01H\02H\03H\
	MOV    5EH, A		;将A送5EH,特点是-4~+3,即绝对值更小。
	MOV    A, 5FH		;5FH的内容送A
	SUBB   A, TL0		;A=A-TL0-CY
	ANL    A, #07H		;取的低3位,00H~07H
	CLR    C		;CY清0
	SUBB   A, #04H		;A=A-04H-CY,得到-4~+3
	MOV    5FH, A		;将A值送5FH,FDH~03H
	JNB    07H, L03C6H	;若07为0,则跳转至L03C6H
	CLR    06H		;07H标志为1的话,关闭定标信号处理标志。
	CLR    07H		;07H清0
L03C6H: 			;
	JNB    10H, L03E1H	;若定标信号作用电极未更换,则跳转至L03E1H
	JB     06H, L03E1H	;若标记信号处理标志有效的话,则跳转至L03E1H
	CLR    10H		;定标信号处理标志无效且无标记,则10H清0
	JNB    0AH, L03D3H	;无50Hz正弦输出波D/A输出标志,则跳转至L03D3H
	SETB   12H		;50Hz正弦输出波D/A输出标志有效,则一定要先行过渡期处理有效
L03D3H: 			;
	MOV    PSW, #08H	;回到1区
	MOV    27H, R3		;记忆定标信号或正弦信号加的位置
	MOV    R0, #28H 	;依据定标信号作用导联位置提取标记修正参数,28H~2BH四个字节从表格08E8H拷贝数据
	MOV    R7, #04H 	;四个字节
	MOV    R6, #04H 	;偏移4个字节
	LCALL  L0652H		;调L0652H子程序:拷贝08E8H中偏移(R3)*12+(R6)开始的(R7)个字节到@R0中
L03E1H: 			;
	DJNZ   2DH, L03E7H	;中断不止一次,继续处理,则跳转至L03E7H
	ORL    PCON, #01H	;仅中断一次,则CPU进入空闲工作方式
L03E7H: 			;
	AJMP   L00FAH		;短跳转至L00FAH
;===============================;
;中断服务处理模块                ;
;===============================;
L03E9H: 			;
	PUSH   PSW		;
	PUSH   ACC		;
	PUSH   B		;
	PUSH   DPH		;
	PUSH   DPL		;保护现场
	JB     12H, L0403H	;是其他波形向50Hz正弦输出的过渡期,刷新率200SPS,级别最高,先判断转至L0403H
	JB     0AH, L03FEH	;是正弦波输出的D/A转换,1200SPS,级别第2,则跳转至L03FEH
	LCALL  L0449H		;是其他波形的正常D/A输出,200SPS,调L0449H子程序
	AJMP   L0406H		;短跳转至L0406H
L03FEH: 			;
	LCALL  L0550H		;调L0550H子程序
	AJMP   L0406H		;短跳转至L0406H
L0403H: 			;
	LCALL  L05DDH		;调L05DDH子程序
;-------------------------------;
;键扫描及防抖处理模块            ;
;-------------------------------;
L0406H: 			;
	DJNZ   R5, L043CH	;R5的内容减1不为0,防抖定时没到,则跳转至L043CH
	JB     0AH, L040FH	;定时到了,若是WAVE下的正弦定标输出期间,则跳转至L040FH
	MOV    R5, #04H 	;其他波形输出期间,防抖动定时重新定4个5毫秒=20毫秒
	AJMP   L0411H		;短跳转至L0411H
L040FH: 			;
	MOV    R5, #18H 	;正弦定标输出期间,防抖动定时重新送24个0.833毫秒=20毫秒
;最初01_00H=00B;59H=FFH(无键按下)
;首次按下某键,59H=键盘口值(!=FFH),01_00H=01B
;20mS后,该按键抖动为无效,!=59H,01_00H=00B,59H=FFH
;20mS后,该按键稳定,且上次不是初次按键,从来就没有按键,01_00H=00B,59H=FFH
;20mS后,该按键稳定,且有初次按键,但现在键值是没按键,01_00H=00B
;20mS后,该按键稳定=59H,且有00H=1初次按键,但现在键值!=FFH,,01H=0B,则01H=1B
L0411H: 			;
	MOV    A, P1		;键盘口P1送A
	CJNE   A, 59H, L0430H	;若目前键盘口值不等于20mS前的键盘口值59H,则跳转至L0430H
	JNB    00H, L043CH	;相同,若00H为0,则跳转至L0430H,无键盘要求转
	CJNE   A, #0FFH, L0420H ;有读按键要求,若A值有按键,则跳转至L0420H
	CLR    01H		;没按键A=FFH,清除01H清0
	AJMP   L042CH		;短跳转至L042CH
L0420H: 			;
	JB     01H, L042CH	;若01H为1,则跳转至L042CH
	SETB   01H		;01H置1
	MOV    DPTR, #07DDH	;送表首地址07DDH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -