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

📄 屏幕显示(51).asm

📁 这是一个有关于单片机屏幕显示的的源代码。真的不很不错。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	ANL A,#0F0H
	JNZ CMV0
	CLR DMO
CMV0:
	RET

;-----取得乘数----
;出口: TDD,存放乘以10X的被转换数据,与100万比较,比较结果为A
GETIER:
	MOV A,#4
	CALL GPSD
	JNB HD,GIER1
	ADD A,MHZD
GIER1:
	JNB MT,GIER2
	CLR MT
	MOV R1,B
	CJNE R1,#2,GIER2	;非测量大电压无关
	CLR C
	SUBB A,#4
GIER2:
	MOV DPTR,#SATC
	MOV R1,#TDD
	CALL GETROMF
	MOV R0,#TFD
	CALL FML4		;测量值乘对应的转换系数
	MOV R0,#TDD
	CALL FST4
	RET

;***********特性数据表格***********
;各UNIT的属性数据列表:
PSTAB:
;特性数据共13项:
;0	小数点位置(从右边算起)(分辨力)
;1	定值输出显示位数
;2	定值输出最大值(正)
;3	定值输出数值转换用除数偏移量
;MV,1000000; V,10000; MA,1000000; K,10,S,10; OHM,100; PT100,100; CU50,100; HZ,100

;4	测量值转换用乘数偏移量
;MV,1000000; V,10000; MA,1000000; KPa,10; MPa,1; OHM,100; PT100,100; CU50,100; HZ,1000

;5	设定值数符,1(压流,热电阻)允许为负
;6	步进值显示(非修改位)后缀零个数
;7	步进修改台阶
;8	步进值转化为浮点数用乘数的偏移量
;9	选定步进值最大值
;10	选定步进值小值

;(0)
	DB 3,4,3,1,4,2,2,2,2,2,2,2,2,2,2
;(1)
	DB 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
;(2)
	DB 0,0,25H,11H,16H,0,60H,15H,10H,12H,40H,18H,17H,15H,0
;(3)
	DB 28,20,28,8,8,12,12,12,8,8,12,8,8,12,12
;(4)
	DB 28,20,28,8,8,4,12,12,8,8,12,8,8,12,4
;(5)
	DB 1,1,1,1,0,0,1,1,1,1,1,0,0,1,0
;(6)
	DB 1,0,0,2,2,2,1,1,2,2,2,2,2,1,2
;(7)
	DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
;(8)
	DB 0,4,32,12,12,12,8,8,12,12,12,12,12,8,12
;(9)
	DB 138,138,153,139,144,138,188,143,138,140,132,146,145,143,138
;(10)
	DB 118,118,103,128,128,128,123,123,126,126,126,128,128,123,128

;-----------常数表格--------------
SATC:
	DB 07AH,0A3H,0D7H,00AH	;0.01 7AA3D70A
D5TTAB:
	DB 001H,080H,000H,000H	;1 01800000
	DB 004H,0A0H,000H,000H	;10
	DB 007H,0C8H,000H,000H	;100
	DB 00AH,0FAH,000H,000H	;1000
	DB 00EH,09CH,040H,000H	;10000
	DB 011H,0C3H,050H,000H	;100000
	DB 014H,0F4H,024H,000H	;1000000
	DB 077H,083H,012H,06FH	;0.001 7783126F

;------时间处理,处理一些与时间有关的位-----
TIMP:
	SETB DR
	INC STM
	MOV A,STM	;可被10整除,5秒到,发步进命令
	MOV B,#10
	DIV AB
	MOV A,B
	JNZ TMP3
	JBC SAS,TMP2
	MOV C,CP	;步进已中断或步进未处于标准步进中或步进台阶最大时,
	ORL C,SAO	;步进已超出设定范围10/100,
	ORL C,/LP	;或无确定步进命令,不再自动产生步进命令位
	ORL C,HS
	JC TMP2
	SETB SA
	MOV B,#DSB1		;P1页为输出?
	MOV A,UNTB1
	JB PA1,TMP1
	MOV B,#DSB2		;P2页为输出?
	MOV A,UNTB2
	JNB PA2,TMPE
TMP1:
	MOV R1,#UNTB		;保存UNIT和显存地址
	MOVX @R1,A
	MOV R1,#DSBA
	MOV A,B
	MOVX @R1,A
	CALL CNSH	;计算新的台阶值

TMP2:
	MOV A,RSDT	;恢复设定值计时器已为零,不再处理
	JZ TMP3
	JB TPD,TMP3
	MOV A,PNM	;当前页非定值页
	CJNE A,#0,TMP21
	JNB PA1,TMP3
	SJMP TMP22
TMP21:
	CJNE A,#1,TMP3
	JNB PA2,TMP3
TMP22:
	DJNZ RSDT,TMP3	;10秒内未操作键盘,恢复原设定值
	SETB RN
TMP3:
	MOV A,STM
	CJNE A,#120,$+3
	JC TMP4
	MOV STM,#0	;1分钟到,刷新屏幕,>=120*25*20MS
	SETB RF
TMP4:
	JNB KPP,TMP5	;P键被按住2秒钟,显示变送页
	INC KPT
	MOV A,KPT
	CJNE A,#4,$+3
	JC TMPE
	JB ITP,TMP6
	CPL TPD
	JB TPD,TMP41
	CLR TCA
	CLR TOO
TMP41:
	SETB KV
	SETB RF
	JMP TMP6
TMP5:
	JNB KPR,TMP6	;RIGHT键被按住2秒钟,显示内部温度标定输出测量电压基准使用
	INC KRT
	MOV A,KRT
	CJNE A,#4,$+3
	JC TMPE
	CPL HTI
	SETB KV
	SETB RF
	JMP TMP6
TMP6:	
	CLR KPP
	CLR KPC
	CLR KPR
	MOV KPT,#0
	MOV KRT,#0
TMPE:
	RET

;******************系统初始化**************
SETUP:
	MOV IE,#0
	MOV R0,#SPB		;内部RAM先全清零
CLRRAM:
	MOV @R0,#0
	DJNZ R0,CLRRAM

	MOV AUXR,#0		;清外部RAM
	MOV R0,#0
	CLR A
CXRP:
	MOVX @R0,A
	DJNZ R0,CXRP

	SETB UNT
	MOV CSN,#80H
	MOV CMN,#80H

	MOV UNTB1,#4		;页1初始化测量压力,页2初始化输出MV
	SETB K4B
	CLR PA1
	CLR PE1
	MOV UNTB2,#1
	SETB PA2
	SETB PE2
	MOV R0,#DPN1
	MOV A,#4
	MOVX @R0,A
	MOV R0,#DPN2
	MOV A,#3
	MOVX @R0,A

	MOV LAD,#3		;步进速率为0.05/100
	SETB HS
	MOV PNM,#0		;显示第一页
	MOV US,#1
	MOV KBV,#118
	MOV KEV,#138
	SETB XTK		;外通信引脚置高
	SETB XTD

	CLR RLP			;上电初始背光亮
	CALL CLS
	MOV A,#10
	CALL WTN10MS
	SETB RF

	MOV TL1,#251		;X=T1定时初值
	MOV TH0,#88H
	MOV TL0,#0

SYSSET:				;系统设置
;定时器及串口设置
	MOV TMOD,#21H		;T1,方式2(8位常数自动装入)作波特率发生器; T0,16位定时器
	MOV TH1,#251		;9600 BPS,18.432 MHZ晶振; BPS=FOSC*(2^SMOD)/[384*(256-X)]
	MOV PCON,#0		;SMOD=0
	MOV AUXR,#0		;指定MOVX指令访问内部增强RAM
	MOV AUXR1,#0		;特殊功能寄存器

	CLR SM0
	SETB SM1
	CLR SM2
	SETB TR1
	SETB TR0
	SETB PX0		;设为高级中断
	SETB IT0		;外部中断0程控为边沿触发方式,启动T1,T0计数

;开中断允许
	CLR IE0
	SETB EX0
	SETB ES
	SETB ET0
	SETB REN
	SETB TEN
	SETB EA

	RET


;----------- WATCH DOG END--------
;延时N*10MS,使用了,R6,R7,PSW,XCS
;ACC=N
WTN10MS:
	MOV	R7,#30
	CLR	XCS
	NOP
	SETB	XCS
WTN10MS1:
	MOV	R6,#00H
	DJNZ	R6,$
	DJNZ	R7,WTN10MS1
	DEC	A
	JNZ	WTN10MS
	RET


;********发送PC命令到两下位模块*******
;(1)	若PC命令为'进入标定'命令,置标志位,发'开始标定'命令给下位模块
;(2)	命令为0FFH,退出标定
;(2)	其他命令,将数据完全传递
TC2M:
	MOV R0,#CDA
	MOV A,@R0
	CJNE A,#2,$+3
	JNC TC00
	JMP TCE
TC00:
	MOV R0,#CMD
	MOV A,@R0
	JNZ TC1			;进入标定
	SETB ID
	SETB RF
	MOV R3,#2		;模块个数
	MOV R2,#2		;地址
	JMP TC0
TC01:
	MOV R2,#3
TC0:
	MOV A,#':'
	CALL SDBIN
	MOV A,R2
	CALL SDHEX
	MOV A,#1
	CALL SDHEX
	CLR A
	CALL SDHEX
	DJNZ R3,TC01
	CALL T2PC1
	JMP TCE
TC1:				;退出标定
	CJNE A,#0FFH,TC2
	CLR ID
	CALL T2PC1
	SETB RF
	JMP TCE
TC2:				;传送数据
	CALL TCDM		;发送命令+数据给工作模块

	CLR DDT			;确定显示UNIT
	MOV R0,#CDA
	MOV A,@R0
	INC R0
	INC R0
	CJNE A,#2,TC3		;电信号测量模块
	MOV A,@R0		;测量模块的电压标定特殊处理
	CJNE A,#1,TC4		;电压标定命令,数据为1个量程位
	INC R0
	MOV B,@R0
	MOV A,#1
	JNB B.0,TCE1		;量程位区分
	MOV A,#2
	JMP TCE1
TC4:
	CJNE A,#2,TCE		;电流MA
	MOV A,#3
	JMP TCE1
TC3:				;输出模块
	MOV A,@R0
	CJNE A,#1,TC6		;电压根据被标定值大小确定UNIT=MV或V
	INC R0
	MOV A,@R0
	CLR ACC.7
	MOV @R0,A
	MOV TFD,#7EH		;与160MV比较,确定正在标定小量程(MV)或大量程(V)
	MOV TFD+1,#0A3H
	MOV TFD+2,#0D7H
	MOV TFD+3,#0AH
	MOV R1,#TFD
	CALL FCOMP
	MOV B,A
	MOV A,#1		;小电压
	JB B.0,TCE1
	MOV A,#2		;大电压
	JMP TCE1
TC6:
	CJNE A,#2,TCE		;电流
	MOV A,#3
TCE1:
	MOV R0,#UNTB
	MOVX @R0,A
	SETB DDT
	SETB DR
TCE:
	RET

;------将命令和数据发送给工作模块------
;入口:	CDA,CDL,等
;使用:	A,B,R0,R1等
TCDM:
	MOV A,#':'	;将命令发送给工作模块
	CALL SDBIN
	MOV R0,#CDL
	MOV A,@R0
	ADD A,#2
	MOV R1,A
	MOV R0,#CDA
TC1LP:
	MOV A,@R0
	CALL SDHEX
	INC R0
	DJNZ R1,TC1LP
	RET

;********汇报数据给PC机*******
;(1)	对于长接收,将数据分段发送给PC
;	第一段,须发送地址长度命令和一段数据等信息,第二段以后只发数据
;(2)	短接收,一次性传递给PC
T2PC:
	CALL T2PC1

;未校准标定数据转换以显示:
	JNB DDT,TPCE
	CLR DDT
	SETB DR		;刷新显示
	MOV A,#DSB1
	MOV R1,#DSBA
	MOVX @R1,A
	MOV R1,#UNTB
	MOVX A,@R1
	MOV B,A
	CLR A
	CALL GPSD
	MOV R1,#DPN
	MOVX @R1,A
	MOV R0,#CDB
	CLR MT
	MOV R1,#CDA
	MOV A,@R1
	CJNE A,#2,TPC1
	SETB MT			;测量模块测量电压转换特殊处理
TPC1:
	CALL CTMV	;转换输出模块未标定值

TPCE:
	RET

;------发送数据到PC机-----
T2PC1:
	MOV A,#'$'
	CALL SD8B
	MOV R0,#CDL
	MOV A,@R0
	ADD A,#2
	MOV R3,A
	MOV R0,#CDA	;待发数据起始地址
TPCL:
	MOV A,@R0
	CALL SD8B
	INC R0
	DJNZ R3,TPCL
	CLR IE0
	RET

;-----------发送一个字节数据----------
SD8B:
	MOV R1,#8	;八位
	SETB XTK
SDDAT:
	NOP
	RLC A		;下降沿前将数据位移入数据线
	MOV XTD,C
	CALL XCDEL
	CLR XTK
	NOP
	CALL XCDEL
	SETB XTK	;CK 上升沿使该位数据移入输入寄存器
	DJNZ R1,SDDAT
	SETB XTD
	RET

;============移位时钟脉宽==========
XCDEL:
	MOV R2,#30
	DJNZ R2,$
	RET

;***************浮点运算子程序************
;-------------四字节浮点数加法 FAD4 7-9 BYTES----------------
;功能:		(R0)指向数+(R1)指向数--R4(阶)R5R6R7
;使用:		A,位X38H,X39H,X3AH,F0和现行工作寄存器,不改变R0
FAD4:
	CLR   X3AH
	CALL FLD4
	CALL FAB4
	RET

;---------三字节整数转换为四字节浮点数---------
;BFTURN   BIN TO FD
;                R0        R0+1      R0+2
; IN: R0指向BIN:HHHHHHHH  MMMMMMMM  LLLLLLLL
;		 R1         R1+1     R1+2     R1+3
;OUT: R1指向FD : 数符阶符阶 尾数 一  尾数 二  尾数 三
;USE: A
BFTURN: MOV A,#18H
	MOV @R1,A
	MOV A,@R0
	INC R1
	MOV @R1,A
	INC R0
	MOV A,@R0
	INC R1
	MOV @R1,A
	INC R0
	MOV A,@R0
	INC R1
	MOV @R1,A
	INC R0
	DEC R1
	DEC R1
	DEC R1

	PUSH 1
	MOV A,R1
	MOV R0,A
	CALL FDLS4
	POP 1

	RET

;-------四字节浮点数转换为三字节整数--------
;FBTURN   FD TO BIN
;		 R1         R1+1     R1+2     R1+3
; IN: R1指向FD : 数符阶符阶 尾数 一  尾数 二  尾数 三
;               R0        R0+1      R0+2
;OUT: R0指向BIN:HHHHHHHH  MMMMMMMM  LLLLLLLL
;     X3CH 是符号位
;USE: X3CH, A,C,F0 IF F0=1 THEN R1 IS TOO LARGE TO TURN
FBTURN: INC R1
	MOV A,@R1
	MOV @R0,A
	INC R0
	INC R1
	MOV A,@R1
	MOV @R0,A
	INC R0
	INC R1
	MOV A,@R1
	MOV @R0,A
	DEC R0
	DEC R1
	DEC R0
	DEC R1
	DEC R1
	CLR F0
	MOV A,@R1
	MOV C,ACC.7
	MOV X3CH,C
	CLR ACC.7
	JNB ACC.6,FIN1
	MOV A,#0
	MOV @R0,A
	INC R0
	MOV @R0,A
	INC R0
	MOV @R0,A
	DEC R0
	DEC R0
	RET
FIN1:	CJNE A,#25,FIN6
FIN6:	JC FIN3
	SETB F0
	MOV A,#0FFH
	MOV @R0,A
	INC R0
	MOV @R0,A
	INC R0
	MOV @R0,A
	DEC R0
	DEC R0
	RET
FIN3:	CJNE A,#24,FIN4
	RET
FIN4:	CLR C
	XCH A,@R0
	RRC A
	XCH A,@R0
	INC R0
	XCH A,@R0
	RRC A
	XCH A,@R0
	INC R0
	XCH A,@R0
	RRC A
	XCH A,@R0
	INC A
	DEC R0
	DEC R0
	JMP FIN3
FBTEND: NOP

;---------3字节二进数转换为7位压缩十进制子程序NIBTD-------
;精度为7位
;入口:	R0	R0+1	R0+2
;		H	 M  L
;出口:	R1	R1+1	R1+2	R1+3
;BCD:	0 000 XH	XXH	XXH	XXH
NIBTD:	MOV A,R0	;
	INC A
	INC A
	MOV R5,A
	MOV A,R7
	INC A
	MOV R3,A
	CLR A		;
NBD0:	MOV @R1,A
	INC R1
	DJNZ R3,NBD0
	MOV A,R1
	DEC A
	MOV R6,A

	MOV A,R7
	MOV B,#08H
	MUL AB
	MOV R3,A
NBD4:	MOV A,R5
	MOV R0,A
	MOV A,R7
	MOV R2,A
	CLR C
NBD1:	MOV A,@R0	;N字节二进制数左移一位,高位移入CY
	RLC A
	MOV @R0,A
	DEC R0
	DJNZ R2,NBD1
	MOV A,R6
	MOV R1,A
	MOV A,R7
	MOV R2,A
	INC R2
NBD3:	MOV A,@R1	;
	ADDC A,@R1	;
	DA A		;
	MOV @R1,A
	DEC R1
	DJNZ R2,NBD3
	DJNZ R3,NBD4	;循环N*8次
	RET

;---------四字节浮点数除法 FDV4 85 BYTES----------
;四字节浮点数除法 FDV4 85 BYTES
;功能:		(R0)指向数/(R1)指向数--R4(阶)R5R6R7
;使用:		A,位X38H,X39H,F0和现行工作寄存器,不改变R0,R1
;出口:		C=0 正常,C=1 除数=0
FDV4:	CALL FLD4
	MOV   A,@R0
	XRL   A,@R1
	MOV   C,0E7H
	MOV   X38H,C
	CLR   A
	MOV   R5,A
	MOV   R6,A
	MOV   R7,A
	INC   R1
	CJNE  @R1,#00H,FDV23H
	INC   R1
	CJNE  @R1,#00H,FDV22H
	INC   R1
	CJNE  @R1,#00H,FDV21H
	DEC   R1
	DEC   R1
	DEC   R1
	SETB  C
	RET
FDV21H: DEC   R1
FDV22H: DEC   R1
FDV23H: DEC   R1
	MOV   A,@R0
	XCH   A,R0
	INC   R1
	PUSH  ACC
FDV29H:
	MOV   A,R4
	INC   R1
	INC   R1
	SUBB  A,@R1
	MOV   A,R3
	DEC   R1
	SUBB  A,@R1
	MOV   A,R2
	DEC   R1
	SUBB  A,@R1
	JC    FDV42H
	CLR   0D5H
	CLR   X39H
	CALL FSD4
	MOV   A,R5
	RRC   A
	MOV   R5,A
	CLR   C
	SJMP  FDV29H
FDV42H:
	MOV   A,R0
	PUSH  ACC
	CALL DDV3
	POP   ACC
	DEC   R1
	XCH   A,R0
	POP   ACC
	XCH   A,R0
	CLR   C
	SUBB  A,@R1
	MOV   C,X38H
	MOV   0E7H,C
	MOV   R4,A
;WEN INSERT IN 16:54 98-7-23 FORMAT 0=0*^(-64)
	CJNE R5,#00,DVNOT0
	CJNE R6,#00,DVNOT0
	CJNE R7,#00,DVNOT0
	MOV R4,#40H
;WEN INSERT END
DVNOT0:
	CLR   C
	RET
;四字节浮点数送操作数 FLD4 13 BYTES
FLD4:	INC   R0
	MOV   A,@R0
	MOV   R2,A
	INC   R0
	MOV   A,@R0
	MOV   R3,A
	INC   R0
	MOV   A,@R0
	MOV   R4,A
	DEC   R0
	DEC   R0
	DEC   R0
	RET

;--------三字节定点小数原码除法-------------
;DDV3 55 BYTES
;功能:		(R2R3R4)*((R1))((R1)+1)((R1)+2)--R5R6R7R2R3R4
;使用:		A和现行工作寄存器,不改变R1
DDV3:	MOV   R0,#18H
	INC   R1
	INC   R1
DDV07H: CLR   C
	MOV   A,R7
 	RLC   A
	MOV   R7,A
	MOV   A,R6
	RLC   A
	MOV   R6,A
	MOV   A,R5
	RLC   A

⌨️ 快捷键说明

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