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

📄 keytobcd.asm

📁 51的汇编,只须输入健值led段码自动向左移位回车后输出bcd浮点数格式,径调试ok,付详细说明
💻 ASM
字号:
QQ   BIT   01H    ;回车置0显存空
QB   BIT   02H    ;小数点
QA   BIT   03H    ;有(X. )数 
QC   BIT   04H    ;有"-"
QS   BIT   05H    ;有"-0"
GG   BIT   06H    ;显存满
QDE  EQU   21H    ;整数长度
QDB  EQU   22H    ;小数长度
QQQ  EQU   23H	  ;总长6字节显示段码(徐最高字节符号位)
QSS  EQU   24H    ;输入的健值
ODB  EQU   25H 	  ;记录区指针
OBB  EQU   26H    ;用户定义
;***********************************

;入口:QSS健值; 回车输出3字节十进制浮点数在3AH符号位...38H

;显示段码在36H(符号位).....30H共7字节

;-----复位------OK!-----经验证------------
   	ORG   00H      
	LJMP  ASDA
	ORG   30H

;	上电复位初始化

ASDA:	MOV   QSS, #00H
   	MOV   QQQ, #00H    
	MOV   QDB, #00H
	MOV   QDE, #00H
	MOV   20H, #00H	   ;清标志
	MOV   R0,  #36H    ;清段码区
	MOV   R2,  #7      ;7字节(每位显示占1字节)
xx:	MOV  @R0,  #0FFH   
	DEC   R0
	DJNZ  R2,  XX	   ;清段码区
	MOV   R0,  #3EH	   ;清记录数据区与阶.尾数区
	MOV   R2,  #8
XC:	MOV  @R0,  #00H
	DEC   R0
	DJNZ  R2,  XC
	MOV   ODB, #3EH	   ;初始记录区指针
	MOV   R0,  #30H    ;弟1位显示0
   	MOV   @R0, #0C0H   ;0C0H=0
	
;*********************************
;	输入健值:
	mov  qss, #1	  ;显示
	Acall  key
	MOV  QSS, #0
	ACALL  KEY
	MOV  QSS, #1
	ACALL  KEY
	MOV  QSS, #12
	ACALL  KEY
	MOV  QSS, #0
	ACALL  KEY
	MOV  QSS, #1
	ACALL  KEY
	MOV  QSS, #5
	ACALL  KEY
	MOV QSS, #10	;ENTER回车
	ACALL  KEY	

AA:     MOV R4, 3AH
	MOV R5, 39H
	MOV R6, 38H
	MOV R7, 37H
	sjmp   $
;*************************************
KEY:	MOV   A,  QSS      ;健值QSS
	CJNE  A, #10, DDL  ;不是回车
	ACALL  CCSA	   ;转4字节十进制浮点数
	ACALL  FIL2        ;回车清显存区
	RET

DDL:	JB    QQ,   OPA    ;显存不空         
	CJNE  A,  #11, DDS ;是"-"健?
	SETB  QC	   ;有"-"
	MOV   @R0, #0BFH   ;弟1位上显"-" 
	RET

DDS:	CJNE  A,  #0, FVC  ;是0健?
	JNB   QC,  MMX     ;无"-"标志返回
	JNB   QS, BEC	   ;无"-0"
	ACALL  DDIP	   ;不移动,显示当前
	SETB  QS	   ;有"-0"
	RET 

BEC:    ACALL  XXM	   ;左移动1次
	SETB   QS	   ;有"-0"
	ACALL  DDIP	   ;显示当前数
MMX:    RET

FVC:	CJNE  A, #12, OPK  ;是"."健?
	SETB  QB	   ;有"."标志
	SETB  QA	   ;"X."
	SETB  QQ	   ;置显存不空 
	ACALL  JJJ	   ;弟1位加小数点
	RET

OPK:	JNB  QC, BBD	   ;无"-"标志
	JNB  QS, JJKB	   ;有"-0"?
	SETB  QQ	   ;置显存不空不移动 
	ACALL  DDIP	   ;显示当前数
	INC   QDE	   ;整数长度加1
	INC   QQQ	   ;总长加1
	ACALL  CABS	   ;记录数据
	RET

JJKB:	ACALL  XXM	   ;左移动1次
	INC  QDE	   ;整数长度加
	INC   QQQ	   ;总长加1
	SETB  QQ	   ;置显存不空 
	ACALL  DDIP	   ;显示当前数
	ACALL  CABS	   ;记录数据
	RET

BBD:    INC  QDE	   ;整数长度加1
	INC   QQQ	   ;总长加1
	SETB  QQ	   ;置显存不空 
	ACALL  DDIP	   ;显示当前数
	ACALL  CABS	   ;记录数据
	RET 
;-----------------------------------------	
OPA:	JB  GG,  FFX	  ;显存满不再输入
	CJNE  A, #12, DDE ;不是小数点移动1次
;-------是小数点-不移动------------------
CVC:	JB   QB,FFX       ;有"."返回
	SETB  QB          ;置有小数点
	SETB  QA          ;置有(X. )数 
	ACALL  JJJ	  ;弟1位加小数点
FFX:	RET
           
DDE:    ACALL  XXM	   ;左移动1次	
ASD:    JNB  QA,  XZA      ;有(X. ) ?
        INC  QDB	   ;小数长度加1
        INC   QQQ	   ;总长加1
        ACALL  DDIP        ;显示当前数
        ACALL  CABS        ;记录数据
        MOV  A,  QQQ       ;判总长度
        CJNE A, #4,  LLK   ;未够4字节
        SETB   GG	   ;满
LLK:    RET		  
		
XZA:	INC  QDE	   ;整数长度加1
     	INC   QQQ	   ;总长加1
    	ACALL  DDIP        ;显示当前数
    	ACALL  CABS        ;记录数据  
     	MOV  A,  QQQ       ;判总长度
    	CJNE A, #4,BBB     ;未够4字节
    	SETB  GG           ;满 
BBB:	RET

;*******************************************
;---------左移1次显示数据----------------------
XXM:	MOV  R0,  #36H      ;左移
DKE1:	DEC  R0             ;指向下个显存单元(左移动)
     	MOV  A,	@R0         ;取显示数
     	INC  R0             ;显示左移1位
     	MOV  @R0, A         ;35H-->36H...
    	DEC  R0             ;指向显存35H单元...
    	CJNE R0,#30H,DKE1   ;左移完7位显示
     	RET
;----------在弟1位加小数点-----------------
JJJ:	MOV  R0,  #30H      ;在弟1位加小数点
	MOV  A,  @R0
	CLR  ACC.7        
	MOV  @R0, A
	RET
;-----------显示当前数------------
DDIP:	MOV  R0,  #30H     ;显示当前数
	MOV  A,  QSS
	MOV  DPTR, #TAB
	MOVC A, @A+DPTR
	MOV  @R0,  A	   ;在弟1位
	RET
;---------记录健值------------
CABS:	MOV  A, QSS	   ;健值
	CJNE A, #12, PCAD
	SJMP	SOUT	   ;不记录
PCAD:	CJNE A, #11, ASDB
	SJMP	SOUT	   ;不记录
ASDB:	CJNE A, #10, PPUT
	SJMP    SOUT	   ;不记录
PPUT:	MOV R1, ODB	   ;指针
	CJNE R1,#3AH,MNP   ;判界
	MOV ODB, #3EH	   ;初始记录区指针
MNP:	MOV @R1, A	   ;记录健值
	DEC  R1
	MOV ODB, R1	   ;保存指针
SOUT:	RET
;***************************************	
;---------阶符-阶码--尾数---------------
CCSA:	JB  QB, SDA	;小数点
	JB  QC, KKD	;"-"
	MOV A, QDE	;整数长
	CLR ACC.7	;阶符=0
	MOV  3AH, A	;存阶码
	SJMP  EEEE

KKD:	MOV A, QDE	;整数长
	SETB ACC.7	;阶符=1
	MOV 3AH, A	;存阶码
	SJMP  EEEE

SDA:	MOV A, QDE
	JZ	GDK	;整数长=0
	JB  QC, PSA	;有"-"
	MOV A, QDE
	CLR  ACC.7	;阶符=0
	MOV 3AH, A	;存阶码
	SJMP  EEEE

PSA:	MOV A, QDE
	SETB ACC.7	;阶符=1
	MOV 3AH, A	;存阶码
	SJMP  EEEE

GDK:	ACALL  DDAK	;计算小数点后面0个数
	JB  QC, JDS	;有"-"
	MOV A, #80H
	SUBB A, B	;80H-点后面0个数
	CLR ACC.7	;阶符=0
	MOV  3AH, A	;存阶码
	SJMP  EEEE

JDS:	MOV A, #80H
	SUBB A, B	;80H-点后面0个数
	SETB ACC.7	;阶符=1
	MOV 3AH, A	;存阶码
	SJMP  EEEE
;*******************************************
;--------压宿3字节尾数----------------------
EEEE:	MOV  R1, #3EH	;记录区指针
	MOV  R4, #0
	MOV  R0, #39H	;尾数指针
SADE:	MOV  A, @R1	;取记录区数
	JNZ  PBA 	;数不为0开始记录
	DEC  R1	 	;再查下个
	INC  R4		;0个数
	MOV  A, R1
	CJNE A,#3AH,SADE;直致不为0为止
	RET	 	;尾数全为0
;---------------------------------------
PBA:	CJNE R4,#4,VKF	;有1~3个数
	RET		;尾数全为0
VKF:	MOV A, R4	;0个数
	JZ   BNS	;有4个字节数
;用地址比较法找到可以合并字节数
SSS:	MOV A, R1	;乘下有1或3字节数
	CJNE A,#3DH,HHD
	MOV R2, #1	;合并1字节
	ACALL NNN	
AAA:	MOV A, @R1      ;处理半字节
	SWAP  A
	MOV @R0, A
	RET		;合并半字节

HHD:	MOV A, R1
	CJNE A,#3CH,BBM
	MOV R2, #1	;合并1字节
	ACALL  NNN
	RET
;-------只有1字节数--------
BBM:	ACALL AAA
	RET
;-------全部为有效数-------------------					
BNS:	MOV R2, #2	;4字节
	ACALL NNN	
BOUT:	RET
;--------------------------
NNN:	MOV A, @R1	;合并成1字节
	SWAP  A
	MOV B, A	;放高位哲存
	DEC  R1
	MOV A, @R1
	ORL A, B	;合并
	MOV @R0, A
	DEC  R0
	DEC  R1
	DJNZ R2,NNN
	RET
;****************************************		
;------计算小数点后面0个数----OK-----------
DDAK:	MOV DPTR, #TAB0
	MOV  R6, #00
	MOV A, QDB	;小数长度
	ADD A, #2FH	;指向小数最高位
	MOV R0, A
	MOV B, A	;最高位址
OPE:	MOV A, @R0	;取小数区段码
	MOV OBB, A 	;哲存
JKB:	MOV A, #0	;由段码译数字
    	MOVC A,@A+DPTR	;固定查表法
	CJNE A,OBB,BBMC ;与段码较
	MOV  A, R6
	SJMP LDX	;找到
BBMC:	INC  DPTR	;查下1个
	INC  R6	  ;记下的位置孰是这段码BCD数
	SJMP JKB	
LDX:	JZ  VCX		;是0
	MOV A, B	;遇到不是0为止
	SUBB A, R0	;最高位址-现址=0个数
	SJMP OUT
VCX:	DEC  R0
	CJNE R0,#2FH,OPE	
OUT:	MOV B, A
	RET
	
TAB0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;         
;**************************************************	
;----------清显区-所有标志-记录区-阶.尾数区---------     
FIL2:	MOV  R2,  #7
	MOV  R0,  #36H
PPH:	MOV  @R0, #0FFH  
	DEC   R0
	DJNZ  R2, PPH	 ;清段码区
	MOV   R0,  #3EH	 ;清记录健值区--与阶.尾数区
	MOV   R2,  #4
XCV:	MOV  @R0,  #00H
	DEC   R0
	DJNZ  R2,  XCV
	MOV   20H, #00   ;清所有标志位
	MOV   21H, #00	 ;整数长度
	MOV   22H, #00	 ;小数长度
	MOV   23H, #00	 ;总长
	MOV   24H, #00	 ;输入的健值
	MOV   ODB, #40H  ;记录健值区指针初始
	RET
TAB: 
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H, 0FFH, 0BFH,7FH;共阳
;显示 0    1    2    3   4    5   6    7   8   9  回车  -    .    
;健值 0    1    2    3   4    5   6    7   8   9  10   11   12  
;**************************************************************** 
;-------------扫描4位显示-----------------------------------------
DISP:	MOV	R0,	#30H	;显示单元指针
	MOV	R2,	#0F7H   ;位
LOP1:	MOV	P0,	#0FFH   ;关显示
	MOV	A,	@R0     ;取数
	MOV	P0,	A       ;送段
	MOV	P1,	R2      ;送位 
	ACALL	D1MS
	INC	R0              ;调显示单元指针
	MOV	A,	R2      ;调位
	RR 	A
     	MOV  R2, A              ;左移,保存位
	JB ACC.7, LOP1          ;扫描完4位
	RET
;--------------延时1MS----------------
D1MS:  MOV R7,#0AH              ;1MS    
LOOP1: MOV R6,#32H
LOOP2: DJNZ R6,LOOP2
       DJNZ R7,LOOP1
       RET
       END	

⌨️ 快捷键说明

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