?? keytobcd.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 + -