📄 12.asm
字号:
MOV A,R3
ANL A,#0F0H
ACALL RRA
MOV @R1,A
INC R1
MOV A,R3
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,R4
ANL A,#0F0H
ACALL RRA
MOV @R1,A
INC R1
MOV A,R4
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,R5
ANL A,#0F0H
ACALL RRA
MOV @R1,A
INC R1
MOV A,R5
ANL A,#0FH
MOV @R1,A
;*************
DEC R3
CJNE R3,#255,POINT0 ;根据6位bcd数的结果,可以求出小数点的位置,
MOV A,R4 ;如果r3的值大于0,则结果没有小数点.(01****)
ANL A,#11110000B ;如果第三位的值大于0,则有一位小数.
SUBB A,#00010000B ;除此之外有二位小数.
JNC POINT1
MOV DOT,#2
RET
POINT1: MOV DOT,#1
RET
POINT0: MOV DOT,#0
RET
RRA: RR A
RR A
RR A
RR A
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CG_BCD: NOP
;功能:双字节十六进制整数转换成双字节BCD码整数
; 入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
M_KM: NOP
MOV R1,#JE_GO
MOV A,@R1
MOV R2,A
INC R1
MOV A,@R1
MOV R3,A
MOV R6,#0H
MOV R7,#36
;(5) 标号: MULD 功能:双字节二进制无符号数乘法
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
;*#############向右移动一位后送入je_go中。
MOV R6,#0H
MOV R7,#0AH
ACALL DIVD
MOV R1,#JE_GO
INC R1
INC R1
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
RET
EROO: MOV R1,#BUFFER
MOV @R1,#0EH
INC R1
MOV @R1,#16
INC R1
MOV @R1,#16
RET
;********************************************
INSTALL: SETB P3.1 ;安装程序,当int0端有底电平时,led亮.
JNB P3.1,INST_LP1
RET
INST_LP1: ACALL DELAY1
JNB P3.1,INST_LP3
RET
INST_LP3: MOV R1,#5
INST_LP4: CPL P3.7
ACALL DELAY2
DJNZ R1,INST_LP4
INST_LP2:SETB P3.7
SETB P3.2
JB P3.2,INST_LP2
MOV R7,#020H
INST_LP5: MOV R6,#0FFH
INST_LP6: JB P3.2,INST_LP2
DJNZ R6,INST_LP6
DJNZ R7,INST_LP5
INST_LP0: CLR P3.7
JNB P3.2,INST_LP0
AJMP INST_LP2
RET
;********************************************
;********************************************
TEST_N:
MOV A,N
INC A
JNZ TESTN_LP1
MOV DOT,#0
MOV R1,#BUFFER
MOV @R1,#0EH
INC R1
MOV @R1,#17
INC R1
MOV @R1,#17
CLR TR0
RET
TESTN_LP1:INC A
JZ TESTN_LP0
RET
TESTN_LP0: MOV R1,#BUFFER
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
MOV DOT,#2
RET
;********************************************
DELAY1: MOV R7,#1H
DELAY1_LP1: MOV R6,#0FFH
DELAY1_LP0: DJNZ R6,DELAY1_LP0
DJNZ R7,DELAY1_LP1
RET
DELAY2: MOV R7,#0FFH
DELAY2_LP1: MOV R6,#0FFH
DELAY2_LP0: DJNZ R6,DELAY2_LP0
DJNZ R7,DELAY2_LP1
RET
E_INT0: CLR EA
PUSH ACC ;外部中断,第一次触发时(stop=1)启动计数,第二次触发时(stop=0)停止记数。
MOV A,R1
PUSH ACC
MOV A,STOP
DEC A
JZ INT0_NT0
MOV STOP,#1
MOV R1,#N
MOV @R1,#0
INC R1
MOV @R1,#5
SETB EA
SETB ET0
SETB TR0
POP ACC
MOV R1,A
POP ACC
RETI
INT0_NT0:
CLR TR0
CLR TF0
CLR ET0
MOV STOP,#0
ACALL SHOW_N ;用100000去除以'N',将结果放到 je_go 单元中。
ACALL M_KM ;将结果*3.6后保存到je_go1中去.
ACALL TEST ;将结果bcd转换后送入bcd缓冲区,再取三位有效数送显存。
SETB EA
POP ACC
MOV R1,A
POP ACC
RETI
INT_T0: PUSH ACC ;定时中断,每1ms(1000us)中断一次,N=N++.
MOV A,R1
PUSH ACC
CLR TR0
MOV TH0,#0FEH ;TH0=#0FEH,TL0=#0C6H,定时为1ms.
MOV TL0,#0C6H
MOV R1,#N
INC R1
MOV A,@R1
INC A
JZ INT_LP0
MOV @R1,A
SETB TR0
POP ACC
MOV R1,A
POP ACC
RETI
INT_LP0: MOV @R1,A
DEC R1
INC @R1
SETB TR0
POP ACC
MOV R1,A
POP ACC
RETI
;******************************************************************
TAB: DB 05H,0DDH,083H,091H,59H,031H,021H,09DH,001H,011H,009H,61H,027H,0C1H,023H,02BH,0FFH,0E1H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -