?? plusbeta.asm
字號(hào):
;************************************************************
; 簡(jiǎn)單計(jì)算器 可實(shí)現(xiàn)255以內(nèi)加減乘除運(yùn)算
; 30H: 數(shù)據(jù)1寄存器
; 31H: 數(shù)據(jù)2寄存器
; 32H: 結(jié)果寄存器
; 33H: 運(yùn)算符寄存器
; 34H-36H: 結(jié)果ASCII碼
; 37H: 結(jié)果十分位ascii碼寄存器
; 38H: 結(jié)果符號(hào)寄存器
; R0 : 接收數(shù)據(jù)地址寄存器
; R1 : 顯示地址寄存器
; R3 : 顯示內(nèi)容寄存器
; R4 : 顯示起始地址寄存器
; R5 : 數(shù)制轉(zhuǎn)換遞增寄存器
;************************************************************
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 數(shù)制轉(zhuǎn)換 (R1)內(nèi)的十六進(jìn)制數(shù)轉(zhuǎn)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 接收數(shù)據(jù) 累加鍵值 K7輸入 R0存儲(chǔ)地址寄存 需預(yù)置
;*****************************************************************
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 ;送顯示數(shù)據(jù)的地址
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 實(shí)現(xiàn)函數(shù)功能
;*****************************************************************
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 ;數(shù)據(jù)1
MOV A,#11000100B
LCALL Write_instruction
MOV DPTR,#SIGN
MOV A,33H
MOVC A,@A+DPTR
LCALL WriteLCDData ;'運(yùn)算符'
MOV A,#11000101B
LCALL Write_instruction
MOV R1,#31H
LCALL DISP ;數(shù)據(jù)2
MOV A,#11001000B
LCALL Write_instruction
MOV A,#3DH
LCALL WriteLCDData ;'='
MOV A,#11001001B
LCALL Write_instruction
MOV A,38H
LCALL WriteLCDData ;'符號(hào)'
MOV A,#11001010B
LCALL Write_instruction
MOV R1,#32H
LCALL DISP ;結(jié)果整數(shù)部分
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 輸入數(shù)據(jù)是否超出范圍
;*****************************************************************
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 長(zhǎng)延時(shí)
;*****************************************************************
LDELAY:
MOV R5,#3
D2: MOV R6,#0FFH
D3: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -