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

📄 带(- . )输入健自动左移程序4字节bcd码版.asm

📁 日用计算器输入健值显示自动左移输出bcd码格式
💻 ASM
字号:
QQ   BIT   01H    ;回车置0显存空
QB   BIT   02H    ;小数点
QA   BIT   03H    ;有(X. )数 
QC   BIT   04H    ;有"-"
QS   BIT   05H    ;有"-0"
GG   BIT   06H    ;显存满
ST   BIT   07H    ;整数够长
QDE  EQU   21H    ;整数长度
QDB  EQU   22H    ;小数长度
QQQ  EQU   23H	  ;总长6字节显示段码(徐最高字节符号位)
QSS  EQU   24H    ;输入的健值
ODB  EQU   25H 	  ;记录区指针
OBB  EQU   26H    ;用户定义
;***********************************

;入口:QSS健值;输出十进制BCD数在42H(千百)41H(十个).43H-44H(4位小数)
;		45H(符号正00H,负0FFH)
;显示段码在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,  #38H    ;清段码区
	MOV   R2,  #9      ;9字节(每位显示占1字节)
xx:	MOV  @R0,  #0FFH   
	DEC   R0
	DJNZ  R2,  XX	   ;清段码区
	MOV   R0,  #45H	   ;清记录数据区
	MOV   R2,  #13
XC:	MOV  @R0,  #00H
	DEC   R0
	DJNZ  R2,  XC
	MOV   ODB, #40H	   ;初始记录区指针
	MOV   R0,  #30H    ;弟1位显示0
   	MOV   @R0, #0C0H   ;0C0H=0
	
;*********************************
;	输入健值:
	mov  qss, #0	  ;显示
	Acall  key
	MOV  QSS, #5
	ACALL  KEY
	MOV  QSS, #0
	ACALL  KEY
	MOV  QSS, #2
	ACALL  KEY
	MOV  QSS, #12
	ACALL  KEY
	MOV  QSS, #0
	ACALL  KEY
	MOV  QSS, #3
	ACALL  KEY
	MOV  QSS, #0	
	ACALL  KEY
	MOV  QSS, #5
	ACALL  KEY
	MOV  QSS, #6
	ACALL  KEY
	MOV  QSS, #2
	ACALL  KEY
	MOV  QSS, #9
	ACALL  KEY
	MOV  QSS, #10
	ACALL  KEY	

AA:
	MOV R0, 42H
	MOV R1, 41H

	MOV R2, 43H
	MOV R3, 44H
	sjmp   $
;*************************************
KEY:	MOV   A,  QSS      ;健值QSS
	CJNE  A, #10, DDL  ;不是回车
	ACALL  CCSA	   ;转十进制BCD数
	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,  QDB       ;判小数长度
        CJNE A, #4,  LLK   ;未够4字节
        SETB   GG	   ;满
LLK:    RET		  
		
XZA:	INC  QDE	   ;整数长度加1
     	INC   QQQ	   ;总长加1
    	ACALL  DDIP        ;显示当前数
    	ACALL  CABS        ;记录数据  
     	MOV  A,  QDE       ;判整数长度
    	CJNE A, #4,BBB     ;未够4字节
    	SETB  ST           ;整数满 
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,#38H,MNP   ;判界
	MOV ODB, #40H	   ;初始记录区指针
MNP:	MOV @R1, A	   ;记录健值
	DEC  ODB
SOUT:	RET
;***************************************	
CCSA:	MOV  R1, #40H	   ;记录区指针
	MOV  R0, #41H	   ;BCD区41H.42H整数区
	MOV  R2, #2H
	MOV  A,  QDE	   ;整长
	JZ	FDS	   ;全为小数
;--------整数+小数---------------------
	MOV  A, #41H
	SUBB A, QDE	  ;得到整数最尾位址
	MOV  OBB, A
	CJNE A, #40H,DAS
;----只有1位数据-------------	
	MOV  R1, #40H	  ;地址
	MOV  A, @R1	  ;取数
	MOV @R0, A	  ;存入整数区41H
	SJMP  OKP
;----有2位数据--------------
DAS:	CJNE A, #3FH,FSS ;可合1字节
	MOV  R1, #40H    
	ACALL  GBKS	 ;合1字节
	SJMP  OKP
;-------有3位数据-----------
FSS:	CJNE A, #3EH,DES 
	MOV  R0, #41H
	MOV  R1, OBB    ;可合1.5字节
	MOV  A, @R1
	MOV  B, A
	INC  R1
	MOV  A, @R1
	ORL  A, B
	MOV  @R0, A
	INC  R0
	INC  R1
	MOV  A, @R1      ;取数
	MOV  @R0, A
	SJMP  OKP
;--------有4位数据----------
DES:	MOV  R4, #2	;可以合2字节
	MOV  R1, #40H
	MOV  R0, #42H
FFD:	ACALL  GBKS	;合1字节
	DEC  R0
	DEC  R0
	DJNZ  R4, FFD   
	
OKP:	MOV  A, OBB
	DEC  A		;指向最高位小数
	MOV  R1, A	;小数指针
	SJMP  FDS	;处理小数
	
GBKS:   MOV  A, @R1	;合1字节 
	SWAP A
	MOV  B, A
	DEC  R1
	MOV  A, @R1      ;取数
	ORL  A, B       
	MOV  @R0, A      
	INC  R0
	DEC  R1
	RET
			
;-------------处理小数------------------
FDS: 	MOV R0, #43H
FDC:	MOV  A, @R1	  ;处理小数
	SWAP A
	MOV  B, A
	DEC  R1
	MOV  A, @R1
	ORL  A, B	  ;合1字节
	MOV  @R0, A	  ;存(43H..44H)是小数
	DEC  R1
	INC  R0
	DJNZ R2, FDC
	JNB  QC, XDD	  ;无" -"
	MOV  45H, #0FFH
XDD:	RET
        
;**************************************************	
;----------清显区-所有标志---------     
FIL2:	MOV  R2,  #9
	MOV  R0,  #38H
PPH:	MOV  @R0, #0FFH  
	DEC   R0
	DJNZ  R2, PPH	 ;清段码区
	MOV   R0,  #40H	 ;清记录健值区
	MOV   R2,  #8
XCV:	MOV  @R0,  #00H
	DEC   R0
	DJNZ  R2,  XCV
	MOV   20H, #00   ;清所有标志位
	MOV   21H, #00	 ;整数长度
	MOV   22H, #00	 ;小数长度
	MOV   23H, #00	 ;总长
	MOV   24H, #00	 ;输入的健值
	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 + -