📄 屏幕显示(51).asm
字号:
KEY7:
MOV R2,#7
MOV R3,#10
SETB K7B
CALL KNUP
RET
;-----------8/CU5 键-------------
KEY8:
MOV R2,#8 ;选择UNIT为CU50
MOV R3,#13
SETB F0
MOV C,K8B
MOV KNB,C
CALL KNUP
MOV C,KNB
MOV K8B,C
RET
;-----------9/HZ 键-------------
KEY9:
MOV R2,#9
MOV R3,#15
CLR F0
CALL KNUP
RET
;---------输入键------------
KEY0:
MOV R2,#0
CLR F0
CALL KNUP
KI0:
RET
;-----页1测量压力信号或电信号处理-----
PEJ1:
JNB PE2,PEJ12
CLR PE1
MOV A,UNTB1
CJNE A,#4,$+3
JC PEJ11
CJNE A,#15,PEJ10
PEJ11:
MOV UNTB1,#4 ;P2页正在测量电信号,P1页转为测量压力信号
SJMP PEJ10
PEJ12:
SETB PE1
MOV A,UNTB1
CJNE A,#4,$+3
JC PEJ14
CJNE A,#15,PEJ13
SJMP PEJ14
PEJ13:
MOV UNTB1,#1 ;P2页正在测量压力信号,P1页转为测量电信号
PEJ14:
MOV A,#10H
ADD A,UNTB1
MOV CMN,A
PEJ10:
RET
;-----页1测量压力信号或电信号处理-----
PEJ2:
JNB PE1,PEJ22
CLR PE2
MOV A,UNTB2
CJNE A,#4,$+3
JC PEJ21
CJNE A,#15,PEJ20
PEJ21:
MOV UNTB2,#4 ;P2页正在测量电信号,P1页转为测量压力信号
SJMP PEJ20
PEJ22:
SETB PE2
MOV A,UNTB2
CJNE A,#4,$+3
JC PEJ24
CJNE A,#15,PEJ23
SJMP PEJ24
PEJ23:
MOV UNTB2,#1 ;P2页正在测量压力信号,P1页转为测量电信号
PEJ24:
MOV A,#10H
ADD A,UNTB2
MOV CMN,A
PEJ20:
RET
;---------输入/输出键-----------
;定义当前页为测量页或输出页,进入UNIT选择状态,等待选择UNIT或输入输出
KEYIO:
JNB ITP,KIO1
JNB ITM,IO0J
CPL MIO
MOV R1,#TMC
CLR A
MOVX @R1,A
SETB KV
SETB DR
IO0J:
JMP KIO0
KIO1:
JB TPD,IO0J ;在模拟变送页按键无效
MOV A,PNM
CJNE A,#0,KIO2 ;P1页
SETB KV
SETB RF
CPL PA1
JNB PA2,KIO11
CLR KV
CLR PA1 ;页2为输出页1只可为测量
JMP KIO0
KIO11:
JNB PA1,KIO12
SETB UNT
CLR NUM
MOV CSN,#80H
MOV A,UNTB1
CJNE A,#15,KIO12
CLR PNC1 ;输出频率只可为正
KIO12:
MOV R0,#DSB1
CALL CLRMD
JB PA1,KIO13
JB PA2,KIO14
CALL PEJ1
SJMP KIO14
KIO13:
CALL PEJ12 ;P1页输出UNIT转为电信号
KIO14:
CLR A
MOV B,UNTB1
CALL GPSD
MOV R0,#DPN1
MOVX @R0,A
SJMP KIO0
KIO2:
CJNE A,#1,KIO3 ;P2页
SETB KV
SETB RF
CPL PA2
JNB PA1,KIO21
CLR KV
CLR PA2 ;页2为输出页1只可为测量
JMP KIO0
KIO21:
JNB PA2,KIO22
SETB UNT
CLR NUM
MOV CSN,#80H
MOV A,UNTB2
CJNE A,#15,KIO22
CLR PNC2 ;输出频率只可为正
KIO22:
MOV R0,#DSB2
CALL CLRMD
JB PA2,KIO23
JB PA1,KIO24
CALL PEJ2
SJMP KIO24
KIO23:
CALL PEJ22 ;P1页输出UNIT转为电信号
KIO24:
CLR A
MOV B,UNTB2
CALL GPSD
MOV R0,#DPN2
MOVX @R0,A
SJMP KIO0
KIO3:
KIO0:
RET
;=======将5字节十进制转换为4字节浮点数======
B5TF:
PUSH 1
CALL D5TF
; DB 077H,083H,012H,06FH ;.001 7783126F
MOV R0,#TFD
MOV R1,#UNTB
MOVX A,@R1
CJNE A,#1,BTF1 ;MV,MA毫安信号/1000
SJMP BTF2
BTF1:
CJNE A,#3,BTF3
BTF2:
MOV R1,#TBD
MOV TBD,#77H
MOV TBD+1,#83H
MOV TBD+2,#12H
MOV TBD+3,#6FH
CALL FML4
CALL FST4
BTF3:
POP 1
CALL FMOV
MOV C,IOP
MOV A,@R1
MOV ACC.7,C
MOV @R1,A
RET
;--------读取小数位数--------
RDPN:
MOV R0,#DPN1
MOV R1,UNTB1
JNC RPN1
MOV R0,#DPN2
MOV R1,UNTB2
RPN1:
MOVX A,@R0
MOV R0,#DPN
MOVX @R0,A
MOV B,A
MOV A,R1 ;保存UNIT
MOV R1,#UNTB
MOVX @R1,A
RET
;-------------确认键--------------
;按该键会立即产生新命令:
;(3)在步进输出页: 按确认键启动1次新的步进输出,置位LP
;(2)在定值输出页: UNIT状态则结束UNIT状态,确认UNIT,进入数字状态;
; 数字状态则确认本次设定,启动一次定值输出
;(1)在测量页: 选定UNIT,启动一次测量
KENT:
JNB ITP,KENT1
CLR ITM
SETB DR
MOV C,PA1 ;读取测量的小数位数
CALL RDPN
MOV R0,#TIRA
MOV R1,#FIA
MOV C,IPA
MOV IOP,C
CALL B5TF
MOV C,PA1
CALL RDPN
MOV R0,#TIRB
MOV R1,#FIB
MOV C,IPB
MOV IOP,C
CALL B5TF
MOV C,PA2
CALL RDPN
MOV R0,#TORA
MOV R1,#FOA
MOV C,OPA
MOV IOP,C
CALL B5TF
MOV C,PA2
CALL RDPN
MOV R0,#TORB
MOV R1,#FOB
MOV C,OPB
MOV IOP,C
CALL B5TF
MOV C,DIW
MOV TIW,C
MOV C,DOW
MOV TOW,C
MOV R0,#FIA
MOV R1,#FIB
CALL FCOMP
SETB KV
SETB TCA
CLR LP
JNB ACC.1,KENT00
CLR KV ;测量量程两端相等设置无效,输入量程清零
CLR TCA
MOV R0,#TIRA
MOV R1,#10
XRCP: ;内部增强RAM清零
CLR A
MOVX @R0,A
INC R0
DJNZ R1,XRCP
JMP KENT00
KENT1:
JB TPD,KENT00
MOV A,PNM
CJNE A,#0,KENT2
MOV C,PNC1
MOV PO,C
MOV C,PA1
MOV R0,#DSB1
MOV R1,#UNTB1
CALL KNT1
JMP KENT00
KENT2:
CJNE A,#1,KENT3 ;在定值输出页
MOV C,PNC2
MOV PO,C
MOV C,PA2
MOV R0,#DSB2
MOV R1,#UNTB2
CALL KNT1
JMP KENT00
KENT3:
KENT00:
RET
KNT1:
MOV B,R1
MOV A,@R1
MOV R1,#UNTB ;保存UNIT和显存地址
MOVX @R1,A
MOV A,R0
MOV R1,#DSBA
MOVX @R1,A
MOV R1,B
JC KNT11
JMP KENT0
KNT11:
JB VC,KNT13
JNB NUM,KNT12
PUSH 1
CALL SKD ;保存(SAVE)键入(KEY IN)数据(DATA),且将数据转换为浮点数
POP 1
JB SO,KNT10
SETB KV
MOV CSR,#0 ;光标复位
MOV A,@R1
ADD A,#10H
MOV CSN,A ;新的定值输出命令
SETB FO
CLR LP
CLR OL
CLR CP
SETB DR
JMP KENT0
KNT12:
JNB UNT,KNT10 ;在UNIT状态,确认UNIT,结束UNIT状态,进入数字状态
SETB KV
CLR UNT
SETB NUM
SETB DR
MOV CSR,#0
KNT10:
JMP KENT0
KNT13:
MOV A,@R1
MOV US,A
MOV A,KEV
CJNE A,KBV,KNT14
MOV KBV,#128 ;头尾相等,错误
MOV KEV,#128
SETB DR
CLR KV
JMP KENT0
KNT14: ;步进命令确定
SETB KV
SETB HS ;确认命令为手动状态
MOV CIT,#3 ;为便于操作,将光标置于步进速率项
SETB DR
MOV A,@R1
ADD A,#30H
MOV CSN,A
MOV R0,#KBV ;将步进起始值和终止值转换为浮点数保存
MOV R1,#FSB
CALL LBLAT
MOV R0,#KEV
MOV R1,#FSE
CALL LBLAT
MOV R0,#FSB ;保存起点为当前步进值
JNB SB,KNT15
MOV R0,#FSE
KNT15:
MOV R1,#FCS
CALL FMOV
CALL CSH2 ;将当前步进值转换为十进制显示并计算步进比例
SETB LP ;产生确定的步进命令,清定值命令,开步进锁定
CLR FO
CLR CP
CLR OL
CLR SAO
SETB SAS
CLR UNT
JMP KENT0
KENT0:
RET
;======5字节十进制转化为浮点数=====
D5TF:
PUSH B
MOVX A,@R0
MOV TDD,A
MOV R1,#TDD+1
MOV R2,#2
CBCD:
INC R0
MOVX A,@R0
SWAP A
MOV B,A
INC R0
MOVX A,@R0
ORL A,B
MOV @R1,A
INC R1
DJNZ R2,CBCD
CALL DTOB
MOV R0,#TBD
MOV R1,#TFD
CALL BFTURN
POP ACC
JZ D5TF0
MOV B,#4
MUL AB
MOV DPTR,#D5TTAB
MOV R1,#TBD
CALL GETROMF
MOV R0,#TFD
CALL FDV4
CALL FST4
D5TF0:
RET
;***********将1字节步进头或尾转换为4字节浮点数******
;LENGTH BY LENGTH,转换步进起始值
;入口: R0,被转换量; R1,浮点值存放区
;出口: R0=R1,R1=#TFD
LBLAT:
MOV A,@R0 ;保存被转换量的极性
RLC A
CPL C
MOV SZ,C
MOV TBD,#0 ;将被转换量送入TBD区
MOV TBD+1,#0
MOV A,@R0 ;取绝对值
JB ACC.7,LBL1
CPL A
INC A
LBL1:
ADD A,#80H
MOV TBD+2,A
MOV R0,#TBD
CALL BFTURN ;转为浮点数,存于R1指定区
MOV A,R1
MOV R0,A
MOV A,@R0
MOV C,SZ
MOV ACC.7,C ;恢复输出量极性(浮点数数符)
MOV @R0,A
CALL FDLS4 ;进行左规格化
MOV A,#8 ;读出乘数偏移量
MOV B,US
CALL GPSD
MOV DPTR,#SATC ;步进值转换常数
MOV R1,#TFD ;暂借
CALL GETROMF
CALL FML4
CALL FST4
RET
;-----------保存键入数据----------
;显存数据-->压缩BCD码-->二进制整数-->浮点数
;入口: DISBUF---DISBUF+5; 5位十进制数格式设定值
;出口: FFS---FFS+3; 浮点数格式设定值
;占用寄存器: R0,R1,R2,A,B,DPTR,R5-R7
SKD:
CLR OKB
;判断输入数据是否超量程
CALL LMTDAT
JB SO,SVDEND
;5位十进制数转换为三字节压缩BCD码
;****************数值转换******************
;-----------设定值转换为浮点数------
MOV R1,#STB
MOV R2,#5
CALL COPY2 ;内部RAM COPY
MOV C,PO
MOV SPO,C
MOV RSDT,#0
CLR RN
MOV A,R0
CLR C
SUBB A,#5
MOV R0,A
SDTF: ;将设置的十进制数转换为浮点数
MOV A,@R0
MOV TDD,A
INC R0
MOV R1,#TDD+1
MOV R2,#2
COMPV: ;压缩
MOV A,@R0
ANL A,#0FH
SWAP A
INC R0
MOV B,@R0
ANL B,#0FH
ORL A,B
MOV @R1,A
INC R0
INC R1
DJNZ R2,COMPV
CALL DTOB ;压缩BCD码转换为二进制整数
MOV R0,#TBD ;二进制格式设定值存区高字节
MOV R1,#FFS ;浮点数格式设定值存区高字节
CALL BFTURN ;二进制整数转换为浮点数
CALL INT2FRC ;整数转换为小数
SVDEND:
RET
;-------5连续字节内部RAM COPY------
IRCOPY:
MOV R0,#STB
MOV R2,#5
MOV R1,#DSB1
JB PA1,COPY1
MOV R1,#DSB2
COPY1:
MOVX A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,COPY1
RET
;-------多字节十进制整数转换为二进制整数子程序DTOB----------
;R0:BCD码起始地址(高位) R1:二进制数起始地址(高位)
;R6:BCD码字节数 R5:二进制字节数 R7:二进制位数
;
DTOB:
MOV R7,#18H
LOOP1:
CLR C
MOV R0,#TDD ;十进制数据高字节
MOV R6,#03H
LOOP2:
MOV A,@R0
RRC A
PUSH PSW
JNB ACC.3,LOOP3
CLR C
SUBB A,#03H
LOOP3:
JNB ACC.7,LOOP4
CLR C
SUBB A,#30H
LOOP4:
MOV @R0,A
INC R0
POP PSW
DJNZ R6,LOOP2
MOV R5,#03H
MOV R1,#TBD ;二进制数据高字节
CLR A
LOOP5:
MOV A,@R1
RRC A
MOV @R1,A
INC R1
DJNZ R5,LOOP5
DJNZ R7,LOOP1
RET
;-----------限制输入数值--------
;若设定超量程,则显区清零,本次设定无效
LMTDAT:
CLR SO
MOV A,@R1
CJNE A,#3,LMTEND
MOV A,@R0
CJNE A,#2,LDT1
INC R0
MOV A,@R0
DEC R0
CJNE A,#6,$+3
LDT1:
JC LMTEND
SETB SO ;超量程,输入无效,清显存
CALL CDSB
MOV RSDT,#0
LMTEND:
RET
;-------------设定值浮点整数转换为浮点小数------------
;除以1000,或100,或10
;入口: FFS; 出口: FFS
;USED: A,B,DPTR,TDD,PO,C,R0-R7
INT2FRC:
MOV A,#3
MOV B,UNTB1
JB PA1,I2F1
MOV B,UNTB2
I2F1:
CALL GPSD
MOV DPTR,#SATC
MOV R1,#TDD
CALL GETROMF
MOV R0,#FFS ;计算出设定值的真值
CALL FDV4
CALL FST4
MOV R0,#FFS
CALL FDLS4 ;四字节浮点数规格化
MOV A,FFS ;设定值的极性
MOV C,PO
MOV ACC.7,C
MOV FFS,A
RET
;-------------四字节浮点数左规格化----------
;WRBY: WHOAMI
;FUNCTION: 对R0(最高字节)指定的四字节浮点数进行左规格化
;USED: R1,(阶)R5,R6,R7,X3CH(数符位)
FDLS4:
MOV A,@R0 ;保存数符
MOV C,ACC.7
MOV X3CH,C
ANL A,#7FH
MOV R1,A ;取阶码
INC R0 ;尾数
MOV A,@R0
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
SETB C ;左规格化
CLR F0 ;左移时第一次移入值(以后移入值为0)
CALL FSD4
MOV A,R7 ;规格化后数据回送
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
DEC R0
MOV A,R5
MOV @R0,A
DEC R0
MOV A,R1
MOV C,X3CH ;恢复数符
MOV ACC.7,C
MOV @R0,A
RET
;-------转换测量值---------
CTMV:
MOV R1,#TFD
CALL FMOV
MOV A,TFD ;保存符号
RLC A
MOV PNC0,C
MOV R0,#UNTB
MOVX A,@R0
CLR HD
CJNE A,#15,CMV1
SETB HD
MOV MHZD,#8
MOV R0,#TFD
MOV R1,#TDD
MOV DPTR,#SATC
MOV A,#16 ;测量频率值<1000
CALL GETROMF
CALL FCOMP
JB ACC.0,CMV1
MOV MHZD,#4
MOV A,#20 ;测量频率<10000
CALL GETROMF
CALL FCOMP
JB ACC.0,CMV1
MOV MHZD,#0 ;测量频率>10000
CMV1:
MOV R0,#UNTB
MOVX A,@R0
MOV B,A
CALL GETIER
CALL FTD0
MOV R1,#DSBA ;取出显存地址
MOVX A,@R1
MOV R1,A
MOV R0,#TDD+1
MOV A,@R0 ;保存最高位
ANL A,#0FH
MOV @R1,A
INC R1 ;分解BCD码保存低4位
INC R0
MOV R2,#2
CMV2:
MOV A,@R0
SWAP A
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
INC R0
DJNZ R2,CMV2
SETB DMO ;判断测量值是否超量程
MOV A,TDD
ANL A,#0FH
JNZ CMV0
MOV A,TDD+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -