📄 plusbeta.asm
字号:
;************************************************************
; 简单计算器 可实现255以内加减乘除运算
; 30H: 数据1寄存器
; 31H: 数据2寄存器
; 32H: 结果寄存器
; 33H: 运算符寄存器
; 34H-36H: 结果ASCII码
; 37H: 结果十分位ascii码寄存器
; 38H: 结果符号寄存器
; R0 : 接收数据地址寄存器
; R1 : 显示地址寄存器
; R3 : 显示内容寄存器
; R4 : 显示起始地址寄存器
; R5 : 数制转换递增寄存器
;************************************************************
RS BIT P3.4
R_W BIT P3.5
ENABLE BIT P3.3
DB0_DB7 DATA P1
;************************************************************
ORG 00H
LJMP START
ORG 50H
START:
MOV SP,#60H
LCALL Initial
LCALL CLS
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV 36H,#0
MOV 37H,#20H
MOV 38H,#20H
MOV R0,#30H
CALCU:
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE1
LCALL PR_STRING
MOV R0,#30H
LCALL REC
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE2
LCALL PR_STRING
MOV R0,#31H
LCALL REC
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE3
LCALL PR_STRING
MOV A,#11000000B
LCALL Write_instruction
MOV DPTR,#LINE4
LCALL PR_STRING
LCALL FUNC
LCALL BEGIN
ANYKEY: MOV A,P0
CPL A
JZ ANYKEY
RESTR: LJMP START
LINE1: DB '1st No. :',00H
LINE2: DB '2nd No. :',00H
LINE3: DB 'select a func:',00H
LINE4: DB '1:+ 2:- 3:* 4:/',00H
LINE5: DB 'The result is:',00H
LINE6: DB 'DATA ERROR!',00H
SIGN: DB 2BH,2DH,2AH,2FH
;*****************************************************************
;Initial
;*****************************************************************
Initial:
MOV A,#00111000B
LCALL Write_instruction
MOV A,#00001100B
LCALL Write_instruction
MOV A,#00000110B
LCALL Write_instruction
RET
;*****************************************************************
;CheckBusy
;*****************************************************************
CheckBusy:
PUSH ACC
CheckBusyLoop:
CLR RS
SETB R_W
CLR ENABLE
SETB ENABLE
MOV A,DB0_DB7
CLR ENABLE
; JB ACC.7,CheckBusyLoop
POP ACC
LCALL DELAY
RET
;*****************************************************************
;Write_instruction
;*****************************************************************
Write_instruction:
LCALL CheckBusy
CLR ENABLE
CLR RS
CLR R_W
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
;WriteLCDData
;*****************************************************************
WriteLCDData:
LCALL CheckBusy
CLR ENABLE
SETB RS
CLR R_W
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
;cls
;*****************************************************************
CLS:
MOV A,#01H
LCALL Write_instruction
RET
;*****************************************************************
;PR_STRING
;*****************************************************************
PR_STRING:
PUSH ACC
PR_LOOP:
CLR A
MOVC A,@A+DPTR
JZ END_PR
LCALL WriteLCDData
INC DPTR
JMP PR_LOOP
END_PR:
POP ACC
RET
;*****************************************************************
;CONV 数制转换 (R1)内的十六进制数转BCD码 存(36H)递减的空间
;*****************************************************************
CONV:
MOV A,@R1
MOV R3,A
MOV R0,#34H
LOOP1: MOV A,R3
MOV B,#10
DIV AB
MOV R3,A
MOV A,B
ADD A,#30H
MOV @R0,A
INC R0
CJNE R0,#37H,LOOP1
RET
;*****************************************************************
;PLUS 加
;*****************************************************************
PLUS:
MOV A,30H
ADD A,31H
MOV 32H,A
RET
;*****************************************************************
;MINUS 减
;*****************************************************************
MINUS:
MOV A,30H
SUBB A,31H
MOV 32H,A
JC FU
MOV 38H,#20H
SJMP RETM
FU: MOV 38H,#2CH
RETM: RET
;*****************************************************************
;CROSS 乘
;*****************************************************************
CROSS:
MOV A,30H
MOV B,31H
MUL AB
JB PSW.2,ERRC
MOV 32H,A
SJMP RETC
ERRC: LJMP ERR
RETC: RET
;*****************************************************************
;DIVID 除
;*****************************************************************
DIVID:
MOV A,30H
MOV B,31H
DIV AB
JB PSW.2,ERRD
SJMP GOON
ERRD: LJMP ERR
GOON: MOV 32H,A
MOV A,B
MOV B,#10
MUL AB
MOV B,31H
DIV AB
ADD A,#30H
MOV 37H,A
RET
;*****************************************************************
;REC 接收数据 累加键值 K7输入 R0存储地址寄存 需预置
;*****************************************************************
REC:
MOV A,P0
CPL A
JZ REC
CJNE A,#80H,NEXT
LJMP ENTER1
NEXT:
ADD A,@R0
MOV @R0,A
MOV A,R0
MOV R1,A ;送显示数据的地址
MOV A,#11000110B
LCALL Write_instruction
LCALL DISP
LCALL DELAY
SJMP REC
ENTER1:
RET
;*****************************************************************
;DISP 显示地址为R1
;*****************************************************************
DISP:
MOV A,R0
PUSH ACC
LCALL CONV
MOV R0,#36H
LOOP: MOV A,@R0
LCALL WriteLCDData
DEC R0
CJNE R0,#33H,LOOP
POP ACC
MOV R0,A
RET
;*****************************************************************
;FUNC 实现函数功能
;*****************************************************************
FUNC:
MOV A,P0
CPL A
FADD: CJNE A,#2,FSUB
MOV 33H,#0
SJMP RETF
FSUB: CJNE A,#4,FMUL
MOV 33H,#1
SJMP RETF
FMUL: CJNE A,#8,FDIV
MOV 33H,#2
SJMP RETF
FDIV: CJNE A,#16,FUNC
MOV 33H,#3
RETF: RET
;*****************************************************************
;BEGIN
;*****************************************************************
BEGIN:
MOV A,30H
LCALL CHECK1
MOV A,31H
LCALL CHECK1
MOV A,33H
CJNE A,#0,F2
LCALL PLUS
SJMP FDIS
F2: CJNE A,#1,F3
LCALL MINUS
SJMP FDIS
F3: CJNE A,#2,F4
LCALL CROSS
SJMP FDIS
F4: LCALL DIVID
FDIS:
LCALL CLS
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE5
LCALL PR_STRING ;'The result is:'
MOV A,#11000001B
LCALL Write_instruction
MOV R1,#30H
LCALL DISP ;数据1
MOV A,#11000100B
LCALL Write_instruction
MOV DPTR,#SIGN
MOV A,33H
MOVC A,@A+DPTR
LCALL WriteLCDData ;'运算符'
MOV A,#11000101B
LCALL Write_instruction
MOV R1,#31H
LCALL DISP ;数据2
MOV A,#11001000B
LCALL Write_instruction
MOV A,#3DH
LCALL WriteLCDData ;'='
MOV A,#11001001B
LCALL Write_instruction
MOV A,38H
LCALL WriteLCDData ;'符号'
MOV A,#11001010B
LCALL Write_instruction
MOV R1,#32H
LCALL DISP ;结果整数部分
MOV A,#11001101B
LCALL Write_instruction
MOV A,#2EH
LCALL WriteLCDData ;'.'
MOV A,#11001110B
LCALL Write_instruction
MOV A,37H
LCALL WriteLCDData ;'十分位'
RETB: RET
;*****************************************************************
;CHECK1 输入数据是否超出范围
;*****************************************************************
CHECK1:
SUBB A,#128
JC RETCH1
LCALL ERR
RETCH1: RET
;*****************************************************************
;ERR ERROR
;*****************************************************************
ERR:
LCALL CLS
MOV A,#10000000B
LCALL Write_instruction
MOV DPTR,#LINE6
LCALL PR_STRING
LJMP ANYKEY
;*****************************************************************
;DELAY
;*****************************************************************
DELAY:
MOV R6,#F0
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
;*****************************************************************
;LDELAY 长延时
;*****************************************************************
LDELAY:
MOV R5,#3
D2: MOV R6,#0FFH
D3: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -