📄 op_test.asm
字号:
MOV A,'A'
LCALL SEND_D
RET
;******************************************************************************************
;******************************************************************************************
T_KCMR: MOV A,#01H ;清除显示
LCALL SEND_I
MOV DPTR,#TAB6
LCALL MV0
;MOV A,SIGN ;T0计时是否到
;ANL A,#00000010B
;JZ T_KCMR1
;CLR ACC.1
;MOV SIGN,A ;清标志位
SETB P3.0 ;操作I/O口,控制继电器
SETB P3.1
CLR P3.2
SETB P3.3
SETB P3.4
CLR P3.5
SETB P3.6
LCALL DELAY2
LCALL ADC
MOV A,VIO1
MOV R1,#VS1
LCALL VIO_DEAR ;处理输入失调电压AD采样值,存在[高]24H~[低]20H中(分离BCD码)
MOV R0,#FD1 ;出口 分离BCD码转浮点BCD
MOV R1,#VS1 ;入口
LCALL TOBCD ;
MOV R0,#FD1
LCALL LG ;出口为@R0往后三字节
NOP
NOP
ACALL BCDTO ;@R1=FD2分离BCD码首地址(3位)
MOV R1,#FD1
MOV A,#88H ;显示数据
LCALL SEND_I
MOV A,@R1
LCALL SEND_D
INC R1
MOV A,@R1
LCALL SEND_D
INC R1
MOV A,@R1
LCALL SEND_D
MOV A,#44H
LCALL SEND_D
MOV A,#42H
MOV DPTR,#TAB6
ACALL MV0
T_KCMR1:LCALL WORK
AJMP T_KCMR
RET
;**************************************************************************************
MV3:MOV A,#8EH ;显示==============DB
LCALL SEND_I
MOV A,'n'
LCALL SEND_D
MOV A,#8FH
LCALL SEND_I
MOV A,'A'
LCALL SEND_D
RET
;*************************************************************************************
;**************************************************************************************
MV0: MOV COUNT,#10H ;显示测量项目的字符
MOV A,#80H
LCALL SEND_I
MV01: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,MV01
RET
;******************************************************************************************
;******************************************************************************************
ADC:MOV R0,#05H
ADCLOOP:CLR START ;启动AD0809
SETB START
CLR START
MOV R6,#0AH
DLAY:NOP
NOP
NOP
DJNZ R6,DLAY
MOVX A,@DPTR
MOV VIO1,A
DJNZ R0,ADCLOOP
RET
;**************************************************************************************
WORK: JB KEY,WORK1 ;是否有键入
MOV SEND_BUF,#00010101B ;-----------读键盘数据
CALL SEND
CALL RECEIVE
SETB CS
MOV SEND_BUF,#80H ;-------------下载数据且按方式0译码,显示位1
CALL SEND
SETB CS
CALL LONG_DELAY
jnb key,$
MOV A,REC_BUF
CJNE A,#0FH,WORK ;是取消键吗?
LJMP LOOP
WORK1:RET
;******************************************************************************************
;*****************************************连续执行子程序***********************************
GOON:
LJMP LOOP
;**************************************************************************************************
;*******************************************************************调用前先赋给@R1首地址********
VIO_DEAR: ;处理输入失调电压AD采样值,存在[高]24H~[低]20H中(分离BCD码)
mov R0,#BUFF ;24H为整数部分
MOV R7,#00H ;取采样值,并转化为双字节
MOV R6,VIO1
MOV R5,#05H
MOV R4,#00H ;赋参数(纯小数0.0195)
LCALL MULT ;调用双字节乘法子程序
DEC R0
MOV A,@R0
MOV @R1,A ;存个位数
DEC R0
MOV A,@R0 ;取有效小数
MOV R2,A
DEC R0
MOV A,@R0
MOV R3,A
ACALL HBD2 ;入口条件:待转换的双字节十六进制小数在R2、R3中。
MOV A,R2 ;出口信息:转换后的双字节BCD码小数仍在R2、R3中
ANL A,#0F0H ;影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求: 6字节
SWAP A
DEC R1
MOV @R1,A ;存小数点后1位
DEC R1
MOV A,R2
ANL A,#0FH
MOV @R1,A ;存小数点后2位
MOV A,R3
ANL A,#0F0H
SWAP A
DEC R1
MOV @R1,A ;存小数点后3位
DEC R1
MOV A,R3
ANL A,#0FH
MOV @R1,A ;存小数点后4位
RET
;*******************************************************************************************
;****************************************************************************;显示汉字和字符
LGS1: MOV COUNT,#40H
MOV A,#80H
LCALL SEND_I
LGS11: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS11
RET
;*************************************************************************************************
;*************************************************************************************************
;PTT0:PUSH A
; MOV A,SIGN
; SETB ACC.1
; MOV SIGN,A
; POP A
; RETI
;**************************调用前先赋给R0出口(低地址),R1入口(高地址)地址的首地址**********************
;*************入口为@R1[高位地址],四位分离BCD,出口为@R0,三个字节浮点BCD******************************
TOBCD:NOP
MOV A,@R1
SWAP A
MOV R2,A
DEC R1
MOV A,@R1
ORL A,R2
PUSH A
SUBB A,#10
JC YI
ER:MOV @R0,#01H ;送阶数
AJMP EY
YI:MOV @R0,#00H
EY:POP A ;送尾数高8位
INC R0
MOV @R0,A
INC R0 ;送尾数低8位
DEC R1
MOV A,@R1
SWAP A
MOV R2,A
DEC R1
MOV A,@R1
ORL A,R2
MOV @R0,A
RET
;*****************************************************************************
;************@R0为浮点BCD码首地址(三位),@R1为分离BCD码首地址(3位)********
BCDTO:MOV A,@R0
CJNE A,#3,BCDTO1
AJMP BCDTO2
BCDTO1:MOV @R1,#00H
INC R0
MOV A,@R0
ANL A,#0F0H
SWAP A
mov @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
mov @R1,A
RET
BCDTO2:INC R0
MOV A,@R0
ANL A,#0F0H
SWAP A
mov @R1,A ;存百位,低地址
INC R1
MOV A,@R0
ANL A,#0FH
mov @R1,A ;存十位,
INC R0
INC R1
MOV A,@R0
ANL A,#0F0H
SWAP A
mov @R1,A ;存个位,高地址
RET
;****************************************************************************************
;****************************************************************************************
DSUM: MOV A,R4 ;[双字节加法子程序]:(R5R4)+(R3R2)-->(R7R6)
ADD A,R2
MOV R6,A
MOV A,R5
ADDC A,R3
MOV R7,A
RET
;****************************************************************************************
;****************************************************************************************
CPL1: MOV A,R2 ;[双字节求补子程序]:(R3R2)求补
CPL A
ADD A,#01H
MOV R2,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;****************************************************************************************
;****************************************************************************************
MULT1: MOV A,R7 ;[双字节有符号数乘法]:被乘数(R7R6),乘数(R5R4)
RLC A
MOV 5CH,C ;被乘数符号C1-->5CH位
JNC POS1 ;为正数则转
MOV A,R6 ;为负数则求补
CPL A
ADD A,#01H
MOV R6,A
MOV A,R7
CPL A
ADDC A,#00H
MOV R7,A
POS1: MOV A,R5 ;取乘数
RLC A ;乘数符号C2-->5DH位
MOV 5DH,C
JNC POS2 ;为整数则转
MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R5
CPL A
ADDC A,#00H
MOV R5,A
POS2: ACALL MULT ;调双字节无符号数乘法子程序
MOV C,5CH
ANL C,5DH
JC TPL ;负负相乘则转
MOV C,5CH
ORL C,5DH
JNC TPL ;正正相乘则转
DEC R0
MOV A,@R0
CPL A
ADD A,#01H
MOV @R0,A
INC R0
MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
TPL: RET
;****************************************************************************************
;****************************************************************************************
MULT: MOV A,R6 ;[无符号双字节数乘法子程序]
MOV B,R4 ;取低位相乘
MUL AB
MOV @R0,A
MOV R3,B
MOV A,R4
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
MOV A,B
ADDC A,#00H
MOV R2,A
MOV A,R6
MOV B,R5
MUL AB
ADD A,R3
INC R0
MOV @R0,A
CLR 5BH
MOV A,R2
ADDC A,B
MOV R2,A
JNC LAST
SETB 5BH ;置进位标志
LAST: MOV A,R7
MOV B,R5
MUL AB
ADD A,R2
INC R0
MOV @R0,A ;存积的第二字节
MOV A,B
ADDC A,#00H
MOV C,5BH
ADDC A,#00H
INC R0
MOV @R0,A
RET
;****************************************************************************************
;****************************************************************************************
;****************************************************************************************
;****************************************************************************************
HBD2: MOV R4,#4 ;四位十进制码
HBD3: MOV A,R3 ;原小数扩大十倍
MOV B,#10
MUL AB
MOV R3,A
MOV R5,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R5
MOV R2,A
CLR A
ADDC A,B
PUSH ACC ;保存溢出的一位十进制码
DJNZ R4,HBD3 ;算完四位十进制码
POP ACC ;取出万分位
MOV R3,A
POP ACC ;取出千分位
SWAP A
ORL A,R3 ;拼装成低字节BCD码小数
MOV R3,A
POP ACC ;取出百分位
MOV R2,A
POP ACC ;取出十分位
SWAP A
ORL A,R2 ;拼装成高字节BCD码小数
MOV R2,A
RET
;************************************************************************************
;入口地址@R0,其中@R0放该数在小数点前的位数,@R0+1和@R0+2中放四位BCD码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -