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

📄 xdxhfsq.asm

📁 为了让广大的工科大学生理解单片机应用系统的开发方法
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	LCALL  L0763H		;调L0763H子程序	:D/A模块
	INC    R3		;加1指向下一个通道
	DJNZ   R2, L05F4H	;若8个通道没处理完成,循环至L05F4H
	CLR    P3.5		;
	SETB   P3.5		;给D/A芯片的LDA引脚发一个控制负脉冲
	CLR    06H		;清除定标信号处理标志
	CLR    12H		;清除过渡器波形檫除标志
	RET			;返回
;===============================;
;其它子程序模块群                ;
;===============================;
L0605H: 			;
	MOV    B, 5BH		;将增益值5BH的内容送B,例如x1.0是128,x2.0是255
	MUL    AB		;A与B相乘,高8位送B,低8位送A,要防止溢出,A的值应该小于128(无符号数)
	RLC    A		;准备无符号数除2,低字节A带CY循环左移1位
	MOV    A, B		;将高字节B送A
	RLC    A		;高字节A带CY循环左移1位,则增益修正后的值在A中,此
	CLR    C		;CY清0
	SUBB   A, 5BH		;不溢出的话A<128,A=A-(5BH),可能够减,也可能不够减,与增益值有关
	ADD    A, #80H		;A=A+128,数据平移128
	RET			;返回
L0613H: 			;
	MOV    DPTR, #0D5DH	;送表首地址0D5DH
	MOV    A, R1		;将R1的内容送A
	MOV    B, #10H		;00010000B送B
	MUL    AB		;A与B相乘,高8位送B,低8位送A
	ADD    A, DPL		;A=A+DPL
	MOV    DPL, A		;将A值送DPL
	MOV    A, B		;将B值送A
	ADDC   A, DPH		;A=A+DPH+CY
	MOV    DPH, A		;将A值送DPH
	CLR    A		;A清0
	MOVC   A, @A+DPTR	;取出表中DPTR的字符给A
	RET			;返回
L0628H: 			;
	MOV    DPTR, #0D5DH	;送表首地址0D5DH
	MOV    A, R1		;将R1的内容送A
	MOV    B, #10H		;00010000B送B
	MUL    AB		;A与B相乘,高8位送B,低8位送A
	ADD    A, DPL		;A=A+DPL
	MOV    DPL, A		;将A值送DPL
	MOV    A, B		;将B值送A
	ADDC   A, DPH		;A=A+DPH+CY
	MOV    DPH, A		;将A值送DPH
L063AH: 			;
	MOV    A, R6		;将R6的内容送A
	MOVC   A, @A+DPTR	;取出取出表中DPTR偏移(R6)的字符给A
	MOV    @R0, A		;将A值送(R0)所指地址
	INC    R0		;R0的内容加1
	INC    R6		;R6的内容加1
	DJNZ   R7, L063AH	;若R7的内容减1不为0,则跳转至L063AH
	RET			;返回
L0642H: 			;
	MOV    DPTR, #0988H	;送表首地址0988H
	MOV    A, R2		;将R2的内容送A
	RL     A		;A循环左移1位
	RL     A		;A循环左移1位
	ADD    A, R6		;A=A+(R6)
	MOV    R6, A		;将A值送R6
L064AH: 			;
	MOV    A, R6		;将R6的内容送A
	MOVC   A, @A+DPTR	;取出取出表中0988H偏移(R6)的字符给A
	MOV    @R0, A		;将A值送(R0)所指地址
	INC    R0		;R0的内容加1
	INC    R6		;R6的内容加1
	DJNZ   R7, L064AH	;若R7的内容减1不为0,则跳转至L064AH
	RET			;返回
L0652H: 			;
	MOV    DPTR, #08E8H	;送表首地址08E8H
	MOV    A, R3		;将R3的内容送A
	MOV    B, #0CH		;00001100B送B
	MUL    AB		;A与B相乘,高8位送B,低8位送A
	ADD    A, R6		;A=A+(R6)
	MOV    R6, A		;将A值送R6
L065CH: 			;
	MOV    A, R6		;将R6的内容送A
	MOVC   A, @A+DPTR	;取出取出表中08E8H偏移(R6)的字符给A
	MOV    @R0, A		;将A值送(R0)所指地址
	INC    R0		;R0的内容加1
	INC    R6		;R6的内容加1
	DJNZ   R7, L065CH	;若R7的内容减1不为0,则跳转至L065CH
	RET			;返回
L0664H: 			;
	MOV    DPTR, #0B1DH	;送表首地址0B1DH
	MOV    A, 55H		;将55H的内容送A
	MOV    B, #10H		;00010000B送B
	MUL    AB		;A与B相乘,高8位送B,低8位送A
	ADD    A, DPL		;A=A+DPL
	MOV    DPL, A		;将A值送DPL
	MOV    A, B		;将B值送A
	ADDC   A, DPH		;A=A+DPH+CY
	MOV    DPH, A		;将A值送DPH
	MOV    A, 56H		;将56H的内容送A
	MOVC   A, @A+DPTR	;取出取出表中DPTR偏移(56H)的字符给A
	RET			;返回
L067BH: 			;
	MOV    DPTR, #09D8H	;送表首地址09D8H
	MOV    B, #05H		;00000101B送B
	MUL    AB		;A与B相乘,高8位送B,低8位送A
	ADD    A, DPL		;A=A+DPL
	MOV    DPL, A		;将A值送DPL
	MOV    A, B		;将B值送A
	ADDC   A, DPH		;A=A+DPH+CY
	MOV    DPH, A		;将A值送DPH
L068CH: 			;
	MOV    A, R6		;将R6的内容送A
	MOVC   A, @A+DPTR	;取出取出表中DPTR偏移(R6)的字符给A
	MOV    @R0, A		;将A值送(R0)所指地址
	INC    R0		;R0的内容加1
	INC    R6		;R6的内容加1
	DJNZ   R7, L068CH	;若R7的内容减1不为0,则跳转至L068CH
	RET			;返回
L0694H: 			;
	MOV    DPTR, #No1_SCREEN	;送表首地址No1_SCREEN
L0697H: 			;
	MOV    A, R6		;将R6的内容送A
	MOVC   A, @A+DPTR	;取出取出表中DPTR偏移(R6)的字符给A
	MOV    @R0, A		;将A值送(R0)所指地址
	INC    R0		;R0的内容加1
	INC    R6		;R6的内容加1
	DJNZ   R7, L0697H	;若R7的内容减1不为0,则跳转至L0697H
	RET			;返回
L069FH: 			;
	MOV    DPTR, #08E5H	;送表首地址08E5H
	MOV    A, R4		;将R4的内容送A
	MOVC   A, @A+DPTR	;取出取出表中08E5H偏移(R4)的字符给A
	RET			;返回
L06A5H: 			;
	MOV    R0, #30H 	;从波形类型中提取显示提示字符串
	MOV    R7, #0FH 	;15个字符串放到首行显示缓冲区
	MOV    R6, #01H 	;
	LCALL  L0628H		;调L0628H子程序:拷贝0D5DH+(R1)*16中偏移(R6)开始的(R7)个字节到@R0中
	MOV    A, #80H		;80#指令:两行显示,首行DDRAM地址从00H开始
	MOV    R0, #30H 	;送液晶显示器显示这15个字符
	MOV    R7, #0FH 	;将从30H开始的15个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	MOV    A, #0C1H 	;C1#指令:两行显示,次行DDRAM地址从41H开始
	MOV    R7, #0DH 	;送液晶显示器显示第2行13个空格字符
	LCALL  L0723H		;调L0723H子程序:查询液晶状态BF,若为0则写入指令代码,再将(R7)个数据20H写入到数据寄存器中
	MOV    40H, #78H	;乘号x
	MOV    R0, #41H 	;根据增益代码调增益提示字符串*.*
	MOV    R7, #03H 	;例如1.0
	MOV    R6, #00H 	;
	LCALL  L0642H		;调L0642H子程序:拷贝0988H中偏移(R2)*4+(R6)开始的(R7)个字节到@R0中
	MOV    A, #0C0H 	;C0#指令:两行显示,次行DDRAM地址从40H开始
	MOV    R0, #40H 	;送液晶显示器增益倍率提示字符串
	MOV    R7, #04H 	;将从40H开始的4个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	MOV    R0, #46H 	;从显示缓冲区第2行第6位开始
	MOV    R7, #04H 	;4个字符
	MOV    R6, #00H 	;定标信号偏移为0
	CJNE   R4, #02H, L06DEH ;若R4的内容不等于2,则跳转至L06DEH
	MOV    R6, #08H 	;正弦信号偏移为8
L06DEH: 			;
	LCALL  L0652H		;调L0652H子程序:拷贝08E8H中偏移(R3)*12+(R6)开始的(R7)个字节到@R0中
				;根据定标信号通道和波形大类信号类型决定将定标信号或正弦信号提示信息送显示缓冲区
	MOV    A, #0C6H 	;C6#指令:两行显示,次行DDRAM地址从46H开始
	MOV    R0, #46H 	;显示缓冲区第2行第6字符开始的4个字符调入液晶显示器显示
	MOV    R7, #04H 	;将从46H开始的4个字符写入到数据寄存器中
	LCALL  L0718H		;调L0718H子程序:查询液晶状态BF,若为0则写入指令代码,再写入数据到数据寄存器中
	MOV    4BH, #4EH	;N送4BH
	MOV    4CH, #4FH	;I送4CH
	MOV    4DH, #49H	;O送4DH
	MOV    4EH, #53H	;S送5EH
	MOV    4FH, #45H	;E送4FH
	CLR    13H		;离开主菜单显示
	RET			;返回
L06FCH: 			;
	LCALL  L070CH		;调L070CH子程序:查询液晶状态BF
	MOV    DPTR, #0C001H	;选中液晶模块,LCDCS为1,RS为1,即写入数据
	MOVX   @DPTR, A 	;将数据写入数据寄存器中
	RET			;返回
L0704H: 			;
	LCALL  L070CH          ;调L070CH子程序:查询液晶状态BF
	MOV    DPTR, #0C000H	;选中液晶模块,LCDCS为1,RS为0,即写入指令代码
	MOVX   @DPTR, A 	;将指令代码写入指令寄存器中
	RET			;返回
L070CH: 			;
	PUSH   ACC		;
	MOV    DPTR, #0C002H	;选中液晶模块,LCDCS为1,RS为0,即写入指令代码
L0711H: 			;
	MOVX   A, @DPTR 	;将BF及AC的值送A
	RLC    A		;A带CY循环左移1位
	JC     L0711H		;若CY为1,则跳转至L0711H。即若BF=1,则继续查询BF直至为0
;        NOP
;        NOP
;        DB      40H,0FCH
	POP    ACC		;
	RET			;返回
L0718H: 			;
	LCALL  L0704H		;调L070CH子程序:查询液晶状态BF
L071BH: 			;
	MOV    A, @R0		;将(R0)所指地址的数据送A
	LCALL  L06FCH		;调L06FCH子程序:查询液晶状态BF为0后将数据写入数据寄存器中
	INC    R0		;R0的内容加1
	DJNZ   R7, L071BH	;若R7的内容减1不为0,则跳转至L071BH
	RET			;返回
L0723H: 			;
	LCALL  L0704H		;调L070CH子程序:查询液晶状态BF
L0726H: 			;
	MOV    A, #20H		;将00100000B送A
	LCALL  L06FCH		;调L06FCH子程序:查询液晶状态BF为0后将空格写入数据寄存器中
	DJNZ   R7, L0726H	;若R7的内容减1不为0,则跳转至L0726H
	RET			;返回
L072EH: 			;
	MOV    A, @R0		;取存放的定标波形数组中的数据,将(R0)所指地址的数据送A
	JNB    08H, L0746H	;非正常心电,则跳转至L0746H
	PUSH   DPH		;正常心电波形类型
	PUSH   DPL		;暂存波形数据指针
	MOV    DPTR, #08DDH	;送表首地址08DDH
	MOV    B, A		;暂存到B
	MOV    A, R3		;将27H的内容送A
	MOVC   A, @A+DPTR	;取出表中08DDH偏移(R3)的修正数据
	ADD    A, B		;正常心电数据要修正,A=A+B修正
	POP    DPL		;
	POP    DPH		;恢复波形数据指针
	LCALL  L0605H		;调L0605H子程序,只有正常心电数据才有增益处理,增益等处理
L0746H: 			;
	PUSH   ACC		;A值入栈
	MOV    A, 5DH		;将定标计时器送A
	CLR    C		;CY清0
	SUBB   A, #2AH		;A=A-2AH-0,42*5mS=0.21S
	JC     L075BH		;未到0.21秒,则跳转至L075BH
	MOV    A, 5DH		;到了0.21秒,继续判断
	SUBB   A, #3AH		;A=A-3AH-0,58*5mS=0.29S
	JNC    L075BH		;超过0.29秒,则跳转至L075BH
	POP    ACC		;在0.21秒~0.29秒之间,要进一步进行叠加修正,先恢复A值
	INC    R0		;R0的内容加1,指向下一个单元
	ADD    A, @R0		;A=A+((R0))叠加起来
	PUSH   ACC		;A值入栈
L075BH: 			;
	POP    ACC		;恢复A值
	CPL    A		;A值按位取反(因为模拟电路存在反相放大)
	MOV    R4, A		;规定D/A数据送3区的R4
	LCALL  L0763H		;调L0763H子程序	:D/A模块
	RET			;返回
L0763H: 			;L0763H子程序为D/A模块:在P3.3为下降沿时将12数据(|P4.0|P4.1|P4.2|P4.3|P4.4|P4.5|P4.6|P4.7|1|P3.5|P3.6|P3.7|)送入P3.4
	MOV    A, R3		;将R3的内容送A
	RR     A		;A循环右移1位
	RR     A		;A循环右移1位
	RR     A		;A循环右移1位
	ORL    A, #10H		;置A.7为1(液晶模块的RNG=1)
	MOV    R7, #04H 	;0000010B送R7
L076BH: 			;
	SETB   P3.3		;P3.3置1             (P3.3连CLK,下降沿有效)
	RLC    A		;A带CY循环左移1位
	MOV    P3.4, C		;将CY送P3.4          (P3.4连DATA,数据串行口)
	CLR    P3.3		;P3.3清0
	DJNZ   R7, L076BH	;若R7的内容件1不为0,则跳转至L076BH
	MOV  

⌨️ 快捷键说明

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