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

📄 屏幕显示(51).asm

📁 这是一个有关于单片机屏幕显示的的源代码。真的不很不错。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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 + -