📄 11.txt
字号:
ORG 0000H
AJMP START
ORG 0003H
AJMP E_INT0
ORG 000BH
AJMP INT_T0
START: ACALL INSTALL
MOV SP,#1FH
SETB EA
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SETB ET0
SETB EX0
SETB IT0
SETB PX0
MOV TMOD,#1
MOV TH0,#0FEH
MOV TL0,#0BFH
MOV STOP,#0 ;设定一个标志,表示当前状态是正在记时还是等待触发?'0'表示等待.
MOV R1,#N
MOV @R1,#0
INC R1
MOV @R1,#5
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ACALL CU
AG:ACALL SHOW_N ;用100000去除以'N',将结果放到 je_go 单元中。
ACALL M_KM ;将结果*3.6后保存到je_go1中去.
ACALL TEST ;将结果bcd转换后送入bcd缓冲区,再取三位有效数送显存。
;######################
ACALL TEST_N
ACALL SCREEN ;送出到p1口显示。
ACALL TEST_KEY
AJMP AG
;******************************************************************
;******************************************************************
BUFFER: DS 3
JE_GO: DS 4
DOT: DS 1 ;小数点的位置。
SUM: DS 6
KMM: DS 1
N: DS 2 ;记数器的记数结果。
STOP: DS 1 ;外部中断的启动/停止(记数器)标志。
;******************************************************************
CU: MOV KMM,#0
MOV R1,#N
MOV @R1,#0FEH
INC R1
MOV @R1,#0FEH
RET
SHOW_N:
ACALL LOAD_N
ACALL DIVD
MOV R1,#JE_GO
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A ;将结果存放在je_go的存储单元中。
RET
LOAD_N: MOV R2,#0H
MOV R3,#01H
MOV R4,#086H
MOV R5,#0A0H
MOV R1,#N
MOV A,@R1
MOV R6,A
INC R1
MOV A,@R1
MOV R7,A
RET
SCREEN:
MOV R1,#BUFFER ;可送入0---F显示,送17显示黑屏.
MOV DPTR,#TAB ;小数点由dot的数值决定。=0无小
MOV A,@R1 ;数点,=1有一位小数,=2有二位小
MOVC A,@A+DPTR ;数。
MOV P1,A
CLR P3.3
MOV A,DOT
CJNE A,#2,SCR_NEXT0
CLR P1.0
SCR_NEXT0: ACALL DELAY1
INC R1
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
SETB P3.3
CLR P3.4
MOV A,DOT
CJNE A,#1,SCR_NEXT1
CLR P1.0
SCR_NEXT1: ACALL DELAY1
INC R1
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
SETB P3.4
CLR P3.5
ACALL DELAY1
SETB P3.5
RET
;******************************************************************
TEST_KEY: MOV A,KMM
JNZ KEY_NT0
SETB P3.7
AJMP KEY_NT1
KEY_NT0:
CLR P3.7
KEY_NT1: SETB P3.0
SETB P3.1
JNB P3.0,KEY_KM
JNB P3.1,CLEAR
RET
KEY_KM: ACALL DELAY1
ACALL DELAY1
JNB P3.0,KEY_KMNT0
RET
KEY_KMNT0:
MOV A,KMM
CPL ACC.0
MOV KMM,A
KEY_LP0:
JNB P3.0,KEY_LP0
ACALL DELAY1
ACALL DELAY1
JNB P3.0,KEY_LP0
ACALL TEST
RET
CLEAR: ACALL DELAY1
ACALL DELAY1
JNB P3.1,CLEAR_NT1
RET
CLEAR_NT1:
MOV R1,#N
MOV @R1,#0FEH
INC R1
MOV @R1,#0FEH
MOV R1,#JE_GO
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
MOV STOP,#0
CLR TR0
;ACALL TEST_N ;对N测试,如果N<5或N>0FEH,显示E00,N=FC显示000.
CLEAR_NT0:
JNB P3.1,CLEAR_NT0
ACALL DELAY1
ACALL DELAY1
JNB P3.1,CLEAR_NT0
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TEST: ACALL BCD_CODE
ACALL DSP_DATA ;从6位数的结果中取出三位有效数,(前三位不为0的数)
NOP ;送入显示缓冲区中.
RET
DSP_DATA: MOV R1,#SUM
MOV R0,#BUFFER
INC R1
MOV A,@R1
JNZ DSP_NT0
INC R1
MOV A,@R1
JNZ DSP_NT0
INC R1
DSP_NT2: MOV R7,#3
DSP_LP2: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,DSP_LP2
RET
DSP_NT1: MOV R7,#3
DSP_LP1: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,DSP_LP1
RET
DSP_NT0: MOV R7,#3
DSP_LP0: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,DSP_LP0
RET
;(7) 标号: DIVD 功能:双字节二进制无符号数除法
;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD:
MOV A,R6
INC A
JNZ DIV_NEXT0
MOV A,R7
INC A
JNZ DIV_NEXT0
ACALL EROO
RET
DIV_NEXT0:
CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
ACALL EROO
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
;以下程序为追加。
RET
BCD_CODE:
MOV R1,#JE_GO
MOV A,KMM
JZ JEGO1 ;检测km/m的状态,如果为m(f0=0)则往下执行,为km(f0-1)则je_go=je_go*3.6
INC R1
INC R1
JEGO1:
MOV A,@R1
MOV R6,A
INC R1
MOV A,@R1
MOV R7,A
ACALL CG_BCD ;转换成bcd码
MOV R1,#SUM ;将转换后的bcd数存放在sum的六个单元内.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -