📄 xdxhfsq.asm
字号:
;===============================;
;硬件资源分配 ;
;===============================;
;某型号型心电信号发生器硬件和软件说明
;硬件部分资源如下:
;AT89C51--24MHz单片机,但可降低速度用于12MHz情况
;12MHz晶体
;不允许用外部程序存储器(EA=1)
;P0.0~P0.7对应地址数据复用线,当访问外部端口或读取ROM芯片中的各种心电波形数据时,分别传送低8位地址或数据。
;P1.0~P1.7是键盘接口,外部还有10K上拉电阻,若按键不按,输入高电平,按键按下,输入接地,相当于输入低电平,其中个输入对于功能键为:
;P1.0对应“MENU”键
;P1.1对应“GAIN”键
;P1.2对应“∩”键
;P1.3对应“TYPE”键
;P1.4对应“↓”键
;P1.5对应“NOIS”键
;P1.6对应“↑”键
;P1.7对应“A”键
;P2.6~P2.7对应A14~A15地址线,由74HC139译码:
; 对应于0000H~3FFFH,均有A15~A14=00B,Y0有效,无具体用;
; 对应于4000H~7FFFH,均有A15~A14=01B,Y1有效,用于读波形数据,即芯片27C1001片选,其中A13~A0直接连27C1001芯片的地址A13~A0,A16~A14由页锁存器74HC273提供;
; 对应于8000H~BFFFH,均有A15~A14=10B,Y2有效,用于锁存EPROM芯片27C1001页地址,即74HC273片选,写的数据位于D2~D0中,锁存后送27C1001的快地址A16~A14;
; 对应于C000H~FFFFH,均有A15~A14=11B,Y3有效,子译码Y0有效,用于读写操作均是对液晶显示模块操作,其端口常用奇端口C001H,偶端口C000H;
;P2.0~P2.5对应A8~A13地址线,
;P3.0、P3.1没有用到。
;P3.2~P3.5用于与D/A转换器接口。其中:P3.2连LOD;P3.3连CLK;P3.4连DAT;P3.5连LDA。
;保留RD和WR功能
;===============================;
;存储资源分配:变量及标志定义 ;
;===============================;
;00H ;0区R0 ;通用
;01H ;0区R1 ;通用
;02H ;0区R2 ;通用
;03H ;0区R3 ;通用
;04H ;0区R4 ;通用
;05H ;0区R5 ;通用
;06H ;0区R6 ;通用
;07H ;0区R7 ;通用
;------------------------------------
;中断中键扫描及主程序中键处理(参数设置)模块专用区
;08H ;1区R0 ;通用
;09H ;1区R1 ;波形类型码寄存器,如7是正常心电80BPM
;0AH ;1区R2 ;增益码寄存器,初始化时送09H,表示增益是X1.0
;0BH ;1区R3 ;定标信号或正弦信号作用通道码寄存器,初始化是0
;0CH ;1区R4 ;主菜单光标位置码寄存器,0是ECG,1是ARRHY,2是WAVE
;0DH ;1区R5 ;键处理的20mS防抖定时计数器(4*5mS/24*0.833mS)
;0EH ;1区R6 ;通用
;0FH ;1区R7 ;通用
;------------------------------------
;闪烁显示处理模块专用区
;10H ;2区R0 ;通用
;11H ;2区R1 ;心脏字符闪烁显示周期计时器,该计时器乘以10mS作为周期,初始化是30
;12H ;2区R2 ;类型字符串或增益倍率字符串闪烁显示周期计时器,该计时器乘以10mS作为周期,初始化没见,例如0.4S显示,0.4S不显示
;13H ;2区R3 ;通用
;14H ;2区R4 ;通用
;15H ;2区R5 ;通用
;16H ;2区R6 ;通用
;17H ;2区R7 ;通用
;------------------------------------
;定时器中断服务程序中的L0449子程序专用区
;18H ;3区R0 ;通用
;19H ;3区R1 ;通用
;1AH ;3区R2 ;把各个通道进行一次D/A转换的循环次数计数器,定时器中断服务程序中的L0449子程序专用
;1BH ;3区R3 ;D/A输出时存D/A通道,定时器中断服务程序中的L0449子程序专用
;1CH ;3区R4 ;D/A输出时存D/A数据,定时器中断服务程序中的L0449子程序专用
;1DH ;3区R5 ;通用
;1EH ;3区R6 ;通用
;1FH ;3区R7 ;通用
;20H ;标志寄存器
;00HBIT EQU 20H.0 防抖处理标志,=0,根本没按过键;=1按过键,等待防抖动处理
;01HBIT EQU 20H.1 键值有效标志,=0,5AH中的值无效;=1,5AH中的值是键值
;02HBIT EQU 20H.2 =1是TYPE波形类型选择状态,=0非TYPE波形类型选择状态
;03HBIT EQU 20H.3 =1是GAIN设置状态,=0非GAIN设置状态
;04HBIT EQU 20H.4 =1是因波形类型修改后要处理的内容;=0无因波形类型修改后要处理的内容
;05HBIT EQU 20H.5 =1是启用NOIS功能,=0关闭NOIS功能
;06HBIT EQU 20H.6 =1是启用标记信号处理;=0关闭标记信号处理
;07HBIT EQU 20H.7 =1是标记作用时间到标志置1,准备关闭标记信号;=0时间未到或未启用标记
;21H ;
;08HBIT EQU 21H.0 在09H=1的前提下:=1是正常心电ECG;=0非正常心电ARRHY
;09HBIT EQU 21H.1 存在ECG类或绝大多数ARRHY波形输出,具体哪类有08H决定
;0AHBIT EQU 21H.2 =1是50Hz正弦输出波D/A输出标志(刷新率1200SPS,24点/周),级别低于12HBIT
; =0且12HBIT=0时是正常D/A输出,刷新率200SPS,级别最低
;0BHBIT EQU 21H.3 未定义
;0CHBIT EQU 21H.4 =1,存在非定标信号输出,信号大类由09H、08H来决定
;0DHBIT EQU 21H.5 未定义
;0EHBIT EQU 21H.6 =1脉冲定标波形输出有效标志;=0脉冲定标波形输出无效标志
;0FHBIT EQU 21H.7 =1不存在的波形输出
;22H ;
;10HBIT EQU 22H.0 =1是定标信号作用电极更换后置1,=0未更换
;11HBIT EQU 22H.1 未定义
;12HBIT EQU 22H.2 =1是其他波形向50Hz正弦输出的过渡期,刷新率200SPS,级别最高
;13HBIT EQU 22H.3 =1是主菜单状态;=0非主菜单
;14HBIT EQU 22H.4 正常心电时14H置1,ARRHY时置为0,WAVE状态,14H清0
;15HBIT EQU 22H.5 正常心电时15H置1,ARRHY时置为1,WAVE状态,15H清0
;16HBIT EQU 22H.6 未定义
;17HBIT EQU 22H.7 未定义
;23H ;未定义
;24H ;未定义
;25H ;未定义
;26H ;未定义
;27H ;当前定标信号或正弦信号作用通道,初始化时是0
;28H ;标记波形参数1a,初始化时从表08E8H中调入参数80H
;29H ;标记波形参数1b,初始化时从表08E8H中调入参数8DH
;2AH ;标记波形参数2a,初始化时从表08E8H中调入参数80H
;2BH ;标记波形参数2b,初始化时从表08E8H中调入参数21H
;2CH ;原始波形类型寄存器,如07H表示正常心电80BPM
;2DH ;定时器T0中断次数软件计数器
;2EH ;一个大类波形中波形类型下限(波形类型选择时用)
;2FH ;一个大类波形中波形类型上限(波形类型选择时用)
;30H ;显示缓冲区上行首字符
;31H ;显示缓冲区上行二字符
;32H ;显示缓冲区上行三字符
;33H ;显示缓冲区上行四字符
;34H ;显示缓冲区上行五字符
;35H ;显示缓冲区上行六字符
;36H ;显示缓冲区上行七字符
;37H ;显示缓冲区上行八字符
;38H ;显示缓冲区上行九字符
;39H ;显示缓冲区上行十字符
;3AH ;显示缓冲区上行十一字符
;3BH ;显示缓冲区上行十二字符
;3CH ;显示缓冲区上行十三字符
;3DH ;显示缓冲区上行十四字符
;3EH ;显示缓冲区上行十五字符
;3FH ;显示缓冲区上行末字符
;40H ;显示缓冲区下行首字符
;41H ;显示缓冲区下行二字符
;42H ;显示缓冲区下行三字符
;43H ;显示缓冲区下行四字符
;44H ;显示缓冲区下行五字符
;45H ;显示缓冲区下行六字符
;46H ;显示缓冲区下行七字符
;47H ;显示缓冲区下行八字符
;48H ;显示缓冲区下行九字符
;49H ;显示缓冲区下行十字符
;4AH ;显示缓冲区下行十一字符
;4BH ;显示缓冲区下行十二字符
;4CH ;显示缓冲区下行十三字符
;4DH ;显示缓冲区下行十四字符
;4EH ;显示缓冲区下行十五字符
;4FH ;显示缓冲区下行末字符
;50H ;一个字节,查五字节表09D8H,心脏符号闪烁周期
;52H_51H;一个指针,查五字节表09D8H,第2、3字节构成波形数据首地址
;54H_53H;一个指针,查五字节表09D8H,第4、5字节构成波形数据末地址
;55H ;是波形类型码计数器0是40BPM正常心电,7是80BPM正常心电,35是正弦定标信号,共计36种波形类型
;56H ;由多结构组合成波形时的波序计数器,0是首个波形结构,1是第2个波形结构,依次类推,当取到波形结构代号为空:FF时,复位到0
;58H_57H;一个指针,D/A时数据存放的地址指针
;59H ;记忆上次键盘口值,
;5AH ;有效键值(01HBIT=1时)
;5BH ;增益系数,1.0对应80H,2.0对应FFH,见
;5CH ;随机数-8~+7
;5DH ;标记时间计数器,启动标记信号时清0
;5EH ;随机数-4~+3
;5FH ;随机数-4~+3
;60H~7FH 是堆栈区,共计32字节
;===============================;
;27C1001中的存储波形规范 ;
;===============================;
;只读存储器(EPROM)芯片27C1001的存储能力是128KB,由A16~A0地址线来选择具体数据,存放的数据可以用周立功集成调试环境或伟福集成调试环境来观察,
;65组波形结构信息定义见程序后的数据定义中。
;===============================;
;主程序人口 ;
;===============================;
ORG 0000H
LJMP L0030H ;入口转到0030H
DB 7DH,08H,00H,00H,00H,07H,0EEH,00H ;没意义
ORG 000BH
LJMP L03E9H ;T0中断入口
DB 07H,72H ;没意义
JUMPTAB: ;为一散转表
DB 21H,0EH ;没意义
AJMP L0110H ;转TYPE键处理
AJMP L0150H ;转GAIN键处理
AJMP L0195H ;转↑键处理
AJMP L0202H ;转↓键处理
AJMP L026FH ;转NOIS键处理
AJMP L0290H ;转∩键处理
AJMP L02A2H ;转MENU键处理
DB 01H,0D3H,05H,02H,07H,1DH,61H,76H ;没意义
DB 65H, 5FH,52H,52H,56H,35H,01H,08H ;没意义
L0030H: ;初始化程序开始
MOV SP, #60H ;修改堆栈栈顶指针
MOV TMOD, #11H ;T1方式1,16位定时方式且不受外界引脚控制;T0方式1,16位定时方式且不受外界引脚控制
CLR TR0 ;禁止T0记数
CLR TR1 ;禁止T1记数
MOV TH0, #0ECH ;给T0送初值,T0定时为:4.993mS
MOV TL0, #7FH ;12MHz,1uS,[10000H-EC7FH]uS=1381HuS=4993uS=4.993mS
MOV TH1, #0D8H ;给T1送初值,T1定时为:9.993mS
MOV TL1, #0F7H ;12MHz,1uS,[10000H-D8F7H]uS=2709HuS=9993uS=9.993mS
MOV 20H, #00H ;某些标志位预清00000000B
;00HBIT=0,防抖动标志无效
;01HBIT=0,5AH中的键值无效
;02HBIT=0,非TYPE类型选择
;03HBIT=0,非GAIN选择
;04HBIT=0,无波形类型修改的处理要求
;05HBIT=0,非NOIS状态
;06HBIT=0,关闭标记状态
;07HBIT=0,未启用标记
MOV 21H, #13H ;某些标志位预置00010011B
;08HBIT=1,正常心电
;09HBIT=1,有心电波形输出要求
;0AHBIT=0,关闭50Hz正弦波输出
;0BHBIT=0,未定义
;0CHBIT=1,存在非定标信号输出
;0DHBIT=0,未定义
;0EHBIT=0,关闭脉冲定标波形输出
;0FHBIT=0,无不存在的波形类型
MOV 22H, #00H ;某些标志位预清00000000B
;10HBIT=0,无定标信号作用电极更换
;11HBIT=0,未定义
;12HBIT=0,非过渡波形状态
;13HBIT=0,非主菜单状态
;14HBIT=0,非正常心电状态
;15HBIT=0,非心电输出状态
;16HBIT=0,未定义
;17HBIT=0,未定义
MOV R0, #30H ;寄存器0区,将主菜单屏显示的信息拷贝到显示缓冲区30H~4FH中
MOV R7, #20H ;共2行,每行16个字符,2行32=20H
MOV R6, #00H ;不加偏移
LCALL L0694H ;调L0694H子程序:拷贝No1_SCREEN中偏移(R6)开始的(R7)个字节到@R0中
SETB 13H ;13H置1,设置主菜单有效
MOV PSW, #08H ;程序状态字的RS1、RS0=01B,即用1区:R0~R7=08H~0FH
MOV 55H, #07H ;当前波形类型码初始化为7,缺省是心电波形第七行,‘ NORMAL ECG 80’
MOV 56H, #00H ;波序计数器清0,
MOV R1, 55H ;波形类型寄存器存放当前波形类型码,即09H单元也暂存7
MOV 2CH, R1 ;记忆原始波形类型,即2CH单元也暂存7,即原始波形类型
MOV R0, #30H ;没意义
MOV R7, #0FH ;没意义
MOV R6, #01H ;没意义
LCALL L0664H ;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H),目前得06H
;该表共计14+19+3行,大部分是FFH,但首个元素一定不是FFH
MOV R0, #50H ;准备安装波形数据结构参数
MOV R7, #05H ;5个字节
MOV R6, #00H ;偏移0
LCALL L067BH ;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表09D8H送(R0)开始的RAM,送(R7)个
;80BPM次正常心电数据为50H=120个10毫秒;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
MOV 57H, 51H ;
MOV 58H, 52H ;波形数据起始地址送当前波形数据地址指针58H_57H
MOV R2, #09H ;增益寄存器初始化增益是X1.0,
MOV R0, #5BH ;增益系数地址
MOV R7, #01H ;取1个字节
MOV R6, #03H ;偏移3位
LCALL L0642H ;调L0642H子程序:拷贝0988H中偏移(R2)*4+(R6)开始的(R7)个字节到@R0中
;增益系数5BH=#128,即X1.0
MOV R3, #00H ;定标信号加在那里?
MOV 27H, R3 ;定标信号或正弦信号加在那里?
MOV R0, #28H ;
MOV R7, #04H ;4个字节
MOV R6, #04H ;偏移4位
LCALL L0652H ;调L0652H子程序:拷贝08E8H中偏移(R3)*12+(R6)开始的(R7)个字节到@R0中
;28H/29H/2AH/2BH=80H/8DH/80H/21H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -