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

📄 zuizhongwanmeichengxu.txt

📁 在Keil里面编写的可以运行于80C51单片机上的计算器程序。可以实现简单的加减乘除运算。
💻 TXT
字号:
     ORG    0000H
     AJMP   START
     ORG    000BH
     AJMP   ERROR
START: 
     ACALL  CLEARALL
     MOV    SP, #50H 
     ACALL  WATCHDOG
CAQULATER:
     ACALL  FEEDDOG
     ACALL  DISPLAY
     ACALL  KEYREAD
     MOV    A,22H
     ANL    A,#0F0H
     JZ             NUMPROCESS_SLECT
     JB     22H.4,  ASMDPROCESS_SLECT 
     JB     22H.5,  CLEARALL_SLECT
     JB     22H.6,  RESULTOUT_SLECT
     JB     22H.7,  NOKEYDOWN_SLECT
NUMPROCESS_SLECT:
     ACALL  NUMPROCESS
     AJMP   CAQULATER
ASMDPROCESS_SLECT:           
     ACALL  ASMDPROCESS
     AJMP   CAQULATER
CLEARALL_SLECT:     
     ACALL  CLEARALL
     AJMP   CAQULATER
RESULTOUT_SLECT:
     ACALL  RESULTOUT
     AJMP   CAQULATER
NOKEYDOWN_SLECT:
     AJMP   CAQULATER

;读键子程
      NEW_KEY	EQU	22H
      OLD_KEY	EQU	23H
KEYREAD:
	CLR	PSW.5
KEY_AGAIN:
	ACALL	KEY_INPUT
	JNB	PSW.5,	KEY_OVER
	ACALL	KEY_DELAY
	ACALL	KEY_INPUT
	JNB	PSW.5,	KEY_OVER
	MOV	A,	NEW_KEY
	CJNE	A,	OLD_KEY,KEY_OVER
UPKEY:
	ACALL	KEY_INPUT
	JB	PSW.5,	UPKEY
	ACALL	KEY_INPUT
	JB	PSW.5,	UPKEY
	MOV	R0,NEW_KEY
	RET
KEY_INPUT:
        MOV  A,    #00H		;显示0
        MOV   DPTR, #9000H
        MOVX  @DPTR, A	;ZIXING
	CLR	F0
	MOV	R1,	#00H
	MOV	R2,	#04H
	MOV	R3,	#01H
KEY_LOOP:
	MOV	A,	R3
	MOV	DPTR,	#8000H
	MOVX	@DPTR,	A
	MOVX	A,	@DPTR
        MOV	R4,	#04H
KEY_LOOP1:
	RRC	A
	JNC	NEXT_KEY
	MOV	OLD_KEY,NEW_KEY
	MOV	A,	R1
	MOV     DPTR, #KEY_TABLE_BCD
	MOVC    A,    @A+DPTR
	MOV	NEW_KEY, A
	SETB	F0
	AJMP	KEY_OVER_OK
NEXT_KEY:
	INC	R1
	DJNZ	R4,KEY_LOOP1
	MOV	A, R3
	RL	A
	MOV	R3, A
	DJNZ	R2, KEY_LOOP
	AJMP	KEY_OVER_OK
KEY_OVER:
	MOV	22H, #80H
KEY_OVER_OK:
	RET
KEY_DELAY:
	MOV	R0, #0FFH
	DJNZ	R0, $			
	RET
KEY_TABLE_BCD:
      DB  	07H,08H,09H,11H
      DB	04H,05H,06H,12H
      DB	01H,02H,03H,14H
      DB	00H,20H,40H,18H    

;显示子程
DISPLAY:
	CALL    DISPNUM
        MOV     R5,  2DH
        MOV     R2,  #01H
        MOV     R0,  #48H
  DISP1:MOV     DPTR,#8FFFH
        MOV     A,   R2 
	MOVX    @DPTR,A
	MOV     A,   @R0
  DISP2:MOV     DPTR,#SHOWTABLE
        MOVC    A,   @A+DPTR
	MOV     DPTR,#9FFFH
	MOVX    @DPTR,A
	;ACALL   DEL0
	;ACALL   DEL0
        ;ACALL   DEL0
	ACALL   DEL0
        ACALL   DEL0
	MOV     A,   R2
	RL      A
	MOV     R2,  A
	INC     R0
	DJNZ    R5,  DISP1
      RET
SHOWTABLE:
        DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
  DEL0: MOV     R6,  #00H
    TM: MOV     R7,  #01H
        DJNZ    R7,  $
	DJNZ    R6,  TM
      RET
;显示数字位数字程
DISPNUM:
     JNB     20H.4, YYY
     MOV     A,21H
     JZ      NUM5_SLECT
 YYY:MOV     A,   4CH
     ORL     A,   21H
     MOV     2EH, A
     JB     2EH.3,  NUM4_SLECT
     JB     2EH.2,  NUM3_SLECT     
     JB     2EH.1,  NUM2_SLECT
     JB     2EH.0,  NUM1_SLECT
NUM1_SLECT:
     MOV    2DH, #1
     AJMP   RETURN2
NUM2_SLECT:           
     MOV    2DH, #2
     AJMP   RETURN2
NUM3_SLECT:     
     MOV    2DH, #3
     AJMP   RETURN2
NUM4_SLECT:
     MOV    2DH, #4
     AJMP   RETURN2
NUM5_SLECT:
     MOV    2DH,4DH
     AJMP   RETURN2
RETURN2:MOV 4DH,2DH
    RET

;数字键处理子程
NUMPROCESS:
      MOV   4CH,#0H
      MOV   A, 20H
      JZ    BCD1
 BCD2:MOV   A, 21H
      CJNE  A, #2, BCD2IN
      AJMP  RETURN 
BCD2IN:MOV  37H, 36H
      MOV   36H, 22H
      INC   21H
      MOV   48H, 36H
      MOV   49H, 37H
      AJMP  RETURN
 BCD1:MOV   A, 21H
      CJNE  A, #2, BCD1IN
      AJMP  RETURN
BCD1IN:MOV  31H, 30H
      MOV   30H, 22H
      INC   21H
      MOV   48H, 30H
      MOV   49H, 31H
RETURN:RET
     
;清RAM子程
CLEARALL:
         MOV  R5,  #2EH
         MOV  R0,  #20H
CLEARRAM:MOV  @R0, #00H
         INC  R0
         DJNZ R5,  CLEARRAM
       RET

;运算键处理子程
ASMDPROCESS:
       MOV  A, 31H
       SWAP A
       ORL  A, 30H
       MOV  34H,A
       MOV  20H,22H
       MOV  21H,#0H
     RET

;等于键处理子程
RESULTOUT:
      JNB   20H.4,RETURN3 
      MOV  A, 37H 
      SWAP A
      ORL  A, 36H
      MOV  3AH,A
     JB     20H.0,  BCDADD_SLECT 
     JB     20H.1,  BCDSUB_SLECT
     JB     20H.2,  BCDMUL_SLECT
     JB     20H.3,  BCDDIV_SLECT
BCDADD_SLECT:
     ACALL  BCDADD
     AJMP   RESULTPROCESS
BCDSUB_SLECT:           
     ACALL  BCDSUB
     AJMP   RESULTPROCESS
BCDMUL_SLECT:     
     ACALL  BCDMUL
     AJMP   RESULTPROCESS
BCDDIV_SLECT:
     ACALL  BCDDIV
     AJMP   RESULTPROCESS
RESULTPROCESS:
     MOV   4CH, #0H
     MOV   A,  3CH
     ANL   A,  #0FH
     MOV   48H,A
     SETB  2FH.0
     MOV   A,  3CH
     SWAP  A
     ANL   A,  #0FH
     JZ    SETTEN
     SETB  2FH.1
SETTEN:MOV   49H,A
     MOV   A,  3DH
     ANL   A,  #0FH
     JZ    SETHUN
     SETB  2FH.2  
 SETHUN:MOV   4AH,A 
     MOV   A,  3DH
     SWAP  A
     ANL   A,  #0FH
     JZ    SETTHO
     SETB  2FH.3
SETTHO:MOV   4BH,A 
     MOV  4CH,2FH
     MOV   R5,  #20H
     MOV   R0,  #20H
CLEARRAM2:
     MOV  @R0, #00H
     INC  R0
     DJNZ R5,  CLEARRAM2
RETURN3:
    RET   

;加法运算子程
BCDADD:
	CLR   C
	MOV   A,  34H
	ADDC  A,  3AH
	DA    A
	MOV   3CH, A
	MOV   A,  #00H
	RLC   A
	MOV   3DH,A
     RET

;减法运算子程
BCDSUB:

	MOV	A,	34H
	CJNE	A,	3AH,	BCDSUB_NEQ
	MOV	3CH,	#00H
	AJMP	BCDSUB_BACK
BCDSUB_NEQ:
	JNC	BCDSUB_SUB
	CLR	C
	XCH	A,34H
	XCH	A,3AH
	MOV	34H,	A
	MOV	3DH,	#0AH
BCDSUB_SUB:
	MOV	A,#9AH
	SUBB	A,	3AH
	ADD	A,	34H
	DA	A
	MOV	3CH,	A
BCDSUB_BACK:
	RET	






;乘法运算子程
BCDMUL:

	MOV	A,	34H
	ACALL	BCD_BIN
	MOV	R2,A

	MOV	A,	3AH
	ACALL	BCD_BIN
	MOV	B,R2
	MUL	AB

	MOV	R6,B
	MOV	R7,A

	ACALL	BIN_BCD	
	MOV	3CH,R5	
	MOV	3DH,R4	
	MOV	3EH,R3	
	RET	


;压缩	BCD
;入口为A,出口为A
BCD_BIN:
	MOV	R1,A
	ANL	A,#0FH
	MOV	R0,A
	MOV	A,R1
	ANL	A,#0F0H
	SWAP	A
	MOV	B,#0AH
	MUL	AB
	ADD	A,R0
	RET


;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
BIN_BCD:
	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 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;除法运算子程
BCDDIV:
	MOV	A,	3AH
	JZ	BCDDIV_EERO
	ACALL	BCD_BIN
	MOV	R2,A

	MOV	A,	34H
	ACALL	BCD_BIN
	MOV	B,R2
	DIV	AB

	MOV	R6,#00H
	MOV	R7,A

	ACALL	BIN_BCD	
	MOV	3CH,R5	
	MOV	3DH,R4	
	MOV	3EH,R3
	AJMP	BCDDIV_END
BCDDIV_EERO:
	MOV	3CH,#00H	
BCDDIV_END:
	RET


;WATCHINGDOG的软件实现子程
;看门狗设置与启动
WATCHDOG:
     MOV  TMOD, #01H
     MOV  TH0,  #00H
     MOV  TL0,  #01H
     MOV  IE,   #82H
     SETB  TR0
    RET 
;喂狗
FEEDDOG:
     MOV  TH0,  #00H
     MOV  TL0,  #01H    
    RET
;程序跑飞处理子程
ERROR:
     AJMP START   
    RETI  
 END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -