📄 xdxhfsq.asm
字号:
CPL A ;A取反
MOVC A, @A+DPTR ;取出表中07DDH偏移A值的键值
MOV 5AH, A ;将A值送5AH
L042CH: ;
CLR 00H ;00H清0
AJMP L043CH ;短跳转至L043CH
L0430H: ;
JBC 00H, L0439H ;不同,说明按键有改变,若00H为1,则跳转至L0439H,且清零00H
MOV 59H, A ;初次按键,将A送59H
SETB 00H ;00H置1
AJMP L043CH ;短跳转至L043CH
L0439H: ;
MOV 59H, #0FFH ;初次按键是抖动,11111111B送59H
L043CH: ;
INC 2DH ;2DH内容加1
POP DPL ;
POP DPH ;
POP B ;
POP ACC ;
POP PSW ;恢复现场
RETI ;T0中断返回
;===============================;
;中断服务子程序模块群 ;
;===============================;
L0449H: ;
CLR TR0 ;禁止T0计时
MOV A, #7FH ;
ADD A, TL0 ;
MOV TL0, A ;
MOV A, #0ECH ;
ADDC A, TH0 ;时间常数是10000H-EC7FH=4993
MOV TH0, A ;设置定时值5mS
SETB TR0 ;允许T0计时,4.993mS发生中断
MOV PSW, #18H ;用3区
MOV R2, #08H ;循环计数器复赋初值8,表示循环8次(循环初始化)
MOV R3, #00H ;从0通道开始,循环初始化
L0460H: ;循环地址标号,循环体的开始
MOV DPTR, #8000H ;送波形数据存储器27C1001的页选端口地址8000H
MOV A, R3 ;将波形通道作为页选择码,共有8页:0页/1页/2页/3页/4页/5页/6页/7页/,每页16K波形数据
MOVX @DPTR, A ;将A的值送所选端口,即EPROM芯片27C1001选(R3)页
MOV DPL, 57H ;
MOV DPH, 58H ;将波形数据存放的地址指针58H_57H的内容送DPTR
MOVX A, @DPTR ;取出波形数据
JNB 08H, L0483H ;正常心电ECG是1,异常心电ARRHY和WAVE时是0,初始化时是1,非正常心电则跳转至L0483H
;正常心电波形修正
PUSH DPH ;正常心电波形D/A处理程序开始。
PUSH DPL ;暂存波形数据指针
MOV DPTR, #08DDH ;送表首地址08DDH
MOV B, A ;将A中波形数据暂存B
MOV A, R3 ;将波形通道R3的内容送A
MOVC A, @A+DPTR ;取出表中08DDH偏移(R3)的修正值: 23, -7, 20, 30, 10,-20,-40,-30
ADD A, B ;A=A+B(修正)
POP DPL ;
POP DPH ;取回波形数据指针
LCALL L0605H ;调L0605H子程序,修正后的值进行预处理,包括增益值一起考虑
L0483H: ;正常心电经过预处理到此,其它波形数据不用预处理就到此处
JB 0FH, L048CH ;若不存在的波形类型,0FH为1,则跳转至L048CH
JNB 09H, L049CH ;存在的波形类型,但又不若是正常心电ECG、也不是异常心电ARRHY,09H为0,则跳转至L049CH
JNB 05H, L049CH ;若是正常心电ECG和异常心电ARRHY,09H为1,若关闭了NIOS功能,则跳转至L049CH
;叠加噪声处理
L048CH: ;不存在的波形类型或是正常心电ECG和异常心电ARRHY,09H为1,若启用了NIOS功能均到此。
CJNE R3, #00H, L0493H ;若不是进行0通道的D/A转换,则跳转至L0493H
ADD A, 5EH ;A=A+随机数(5EH),范围-4~+3
AJMP L049CH ;短跳转至L049CH
L0493H: ;
CJNE R3, #01H, L049AH ;若不是进行1通道的D/A转换,则跳转至L049AH
ADD A, 5FH ;A=A+A+另外一个随机数(5FH),范围也是-4~+3
AJMP L049CH ;短跳转至L049CH
L049AH: ;
ADD A, 5CH ;2~7通道的D/A转换,A=A+随机数(5CH),范围-8~+7
L049CH: ;无论加不加NIOS信号均到此
JNB 0DH, L04C0H ;若是不存在的波形类型,0DH不为0,则跳转至L04C0H
MOV B, A ;是存在的波形类型,将波形数据A暂存到B
MOV A, P1 ;将键盘口P1的内容送A,按下为0,不按为1
CPL A ;A按位取反,按下为1,不按为0
ANL A, #04H ;保留∩键的值
JZ L04BEH ;∩键未按,则跳转至L04BEH
;增加定标信息
PUSH DPH ;∩键按下了
PUSH DPL ;DPTR入栈暂存
MOV DPTR, #0948H ;取表首地址0948H
MOV A, 27H ;将定标信号或正弦信号加在那里?0~7
RL A ;
RL A ;
RL A ;放大8倍
ADD A, R3 ;A=A+D/A通道号
MOVC A, @A+DPTR ;查出表中0948H偏移(R3)的脉冲波形数据
ADD A, B ;A=A+B叠加到波形中
MOV B, A ;将A值暂存B
POP DPL ;
POP DPH ;恢复DPTR
L04BEH: ;
MOV A, B ;将处理后的波形数据送A
L04C0H: ;
JNB 0EH, L04CDH ;若不处于定标波形类型,则跳转至L04CDH
;波形幅度修正
PUSH 5BH ;处于定标波形类型,暂存增益值
MOV 5BH, #80H ;假设增益是x1.0,128送5BH
LCALL L0605H ;调L0605H子程序,作波形数据处理(但不放大不压缩)
POP 5BH ;恢复正常的增益码
L04CDH: ;无论那种类型的波形,均已处理过
CPL A ;将波形数据反相(因为模拟电路带反相放大??)
MOV R4, A ;规定D/A数据存放到3区的R4,D/A通道在3区的R3中
LCALL L0763H ;调L0763H子程序 :D/A模块
INC R3 ;改到下一个通道
DJNZ R2, L0460H ;若R2的内容减1不为0,则跳转至L0460H继续调波形数据输出
JNB 06H, L04F6H ;若未启用标记信号处理,则跳转至L04F6H
INC 5DH ;启用了标记信号处理,标记时间计时器加1(5mS)
MOV A, 5DH ;将5DH的内容送A
CJNE A, #64H, L04E3H ;未到500mS,则跳转至L04E3H
;中断服务时置该标志,主程序才可能将06H、07H标志清0
SETB 07H ;定标作用时间到标志置1,准备关闭定标信号
AJMP L04F6H ;短跳转至L04F6H
L04E3H: ;启用了定标信号处理还需要进一步处理
MOV R0, #28H ;与定标信息有关的28H、29H中的数据送D/A输出,地址28H送R0
MOV R3, 27H ;具体通道由27H的内容决定 D/A通道
LCALL L072EH ;调L072EH子程序,修改成标记
MOV A, #01H ;1送A
CLR C ;CY清0
SUBB A, R3 ;A=A-(R3)-CY
JC L04F6H ;27H中存放的是2通道以上,即V1~V6若,则跳转至L04F6H
MOV R0, #2AH ;非V1~V6通道,与定标信息有关的2AH、2BH中的数据送D/A输出,地址2AH送R0
MOV R3, A ;27H中存放的是1通道,补0通道的定标波形输出;27H中存放的是0通道,补1通道的定标波形输出
LCALL L072EH ;调L072EH子程序,修改为标记
L04F6H: ;所有情况均要到此
CLR P3.5 ;P3.5清0
SETB P3.5 ;P3.5置1,给D/A芯片的LDA引脚发负脉冲
INC DPTR ;指向下一个波形数据
MOV A, DPL ;将DPL送A
CJNE A, 53H, L0549H ;不到波形数据末地址,则跳转至L0549H
MOV A, DPH ;将DPH送A
CJNE A, 54H, L0549H ;不到波形数据末地址,则跳转至L0549H
INC 56H ;到了波形数据末地址,由多结构组合成波形时的波序计数器加1
JNB 04H, L0524H ;没有出现因波形类型修改后要处理的内容,则跳转至L0524H
CLR 04H ;因波形类型修改后有要处理的内容,清除该标志,表示没有了因波形类型修改后要处理的内容
MOV PSW, #08H ;改到1区
MOV 55H, R1 ;将1区中的R1的内容送55H,是存放的波形类型代码。
MOV PSW, #18H ;回到3区,
MOV DPTR, #0F9DH ;送表首地址0F9DH
MOV A, 55H ;将波形类型代码送A
MOVC A, @A+DPTR ;取出表中0F9DH偏移(55H)的标志送标志组08H~0FH
MOV 21H, A ;将A值送21H
JNB 0AH, L0521H ;不是正弦波定标信号的话转,则跳转至L0521H
SETB 12H ;是正弦波定标信号,应该先进行过渡波形输出,故置12H标志
L0521H: ;
MOV 56H, #00H ;波形类型切换了,由多结构组合成波形时的波序计数器清0
L0524H: ;
LCALL L0664H ;调L0664H子程序:查0B1D表中1个字符:0B1DH+(波形类型55H)*16+(波序计数器56H),目前得06H
;注意55H这个变量是1区R1变量,查表时控制行,56H控制查表信息的列,
CJNE A, #0FFH, L0530H ;若A值不等于FFH(是存在的结构),则跳转至L0530H
MOV 56H, #00H ;得到的不存在的波形结构,由多结构组合成波形时的波序计数器清0
LCALL L0664H ;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
L0530H: ;已经得到一个有效的信息
MOV R0, #50H ;目的地址
MOV R6, #00H ;偏移0
MOV R7, #05H ;5个字节
LCALL L067BH ;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表09D8H送(R0)开始的RAM,送(R7)个
;80BPM次正常心电数据为50H=120*10mS;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
MOV 57H, 51H ;
MOV 58H, 52H ;58H_57H是波形起始地址
MOV PSW, #10H ;设置2区
MOV R1, #30 ;30送R1
MOV PSW, #18H ;回到3区
AJMP L054FH ;调L054FH子程序
L0549H: ;
MOV 57H, DPL ;
MOV 58H, DPH ;没到波形末端地址,回存当前波形数据实际地址
L054FH: ;
RET ;返回
L0550H: ;
CLR TR0 ;禁止T0计数
MOV A, #0C6H ;
ADD A, TL0 ;
MOV TL0, A ;
MOV A, #0FCH ;
ADDC A, TH0 ;时间常数是10000H-FCC6H=826
MOV TH0, A ;设置定时值0.833mS
SETB TR0 ;允许T0计数,0.833mS中断
MOV PSW, #18H ;改为3区
MOV DPTR, #8000H ;选中74HC273,即EPROM芯片的页选
MOV A, #03H ;选择第3页
MOVX @DPTR, A ;选中EPROM芯片的3页,地址范围是08000H~0BFFFH的16KB
MOV DPL, 57H ;
MOV DPH, 58H ;当前波形指针送DPTR
MOVX A, @DPTR ;取出表中DPTR指向的正弦波形数据
PUSH 5BH ;增益入栈暂存
MOV 5BH, #128 ;将增益值是x1.0,128送增益
LCALL L0605H ;调L0605H子程序
POP 5BH ;出栈恢复增益的系数值
CPL A ;A按位取反,考虑存在反相问题
MOV R4, A ;将A值送R4
MOV R3, 27H ;将正弦波作用通道取出送R3
LCALL L0763H ;调L0763H子程序 :D/A输出模块
CLR P3.5 ;
SETB P3.5 ;输出D/A芯片的LDA引脚一个负脉冲
CLR 06H ;清除启用定标信号标志
INC DPTR ;DPTR加1,指向下一次D/A的波形地址
MOV A, DPL ;将DPL送A
CJNE A, 53H, L05D6H ;不到波形数据末地址,则跳转至L05D6H
MOV A, DPH ;将DPH送A
CJNE A, 54H, L05D6H ;不到波形数据末地址,则跳转至L05D6H
INC 56H ;波序计数器56H的内容加1
JNB 04H, L05B1H ;若没有因波形类型修改后要处理的内容,即04H为0,则跳转至L05B1H
CLR 04H ;有因波形类型修改后要处理的内容,则现在处理,并且04H清0
MOV PSW, #08H ;变到1区
MOV 55H, R1 ;将1区R1的中存放的波形类型送55H
MOV PSW, #18H ;回到3区
MOV DPTR, #0F9DH ;送表首地址0F9DH
MOV A, 55H ;将55H的内容送A
MOVC A, @A+DPTR ;取出表中0F9DH偏移(55H)的标志送标志组08H~0FH
MOV 21H, A ;将A值送21H
JNB 0AH, L05AEH ;若不是正弦波定标期间,即0AH为0,则跳转至L05AEH
SETB 12H ;是正弦波定标期间,12H置1
L05AEH: ;
MOV 56H, #00H ;波序计数器从0开始
L05B1H: ;
LCALL L0664H ;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
CJNE A, #0FFH, L05BDH ;若A值是存在的波形结构代码,则跳转至L05BDH
MOV 56H, #00H ;是不存在的波形结构代码,波序计数器从0开始,一定可以得到存在的波形结构
LCALL L0664H ;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
L05BDH: ;
MOV R0, #50H ;
MOV R6, #00H ;
MOV R7, #05H ;
LCALL L067BH ;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表送(R0)开始的RAM,送(R7)个
;80BPM次正常心电数据为50H=01001011B;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
MOV 57H, 51H ;
MOV 58H, 52H ;重新安装新一轮的当前波形地址
MOV PSW, #10H ;设置2区
MOV R1, #1EH ;30送R1
MOV PSW, #18H ;回到3区
AJMP L05DCH ;短跳转至L05DCH
L05D6H: ;
MOV 57H, DPL ;
MOV 58H, DPH ;保存当前波形地址
L05DCH: ;
RET ;返回
L05DDH: ;
CLR TR0 ;禁止T0计数
MOV A, #7FH ;
ADD A, TL0 ;
MOV TL0, A ;
MOV A, #0ECH ;
ADDC A, TH0 ;时间常数是10000H-EC7FH=4993
MOV TH0, A ;设置定时值5mS
SETB TR0 ;允许T0计时,4.993mS发生中断
MOV PSW, #18H ;设置3区
MOV R2, #08H ;八个通道
MOV R3, #00H ;从0通道开始
L05F4H: ;
MOV R4, #7FH ;准备送7FH的数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -