📄 带(- . )输入健自动左移程序4字节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 + -