⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plusbeta.asm

📁 用汇编语言编写的简单计算器
💻 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 + -