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

📄 cdqulater加注释.txt

📁 在Keil里面编写的可以运行于80C51单片机上的计算器程序。可以实现简单的加减乘除运算。
💻 TXT
字号:
     ORG    0000H
     AJMP   START
     ORG    000BH
     AJMP   ERROR
START: 
     ACALL  CLEARALL
     MOV    SP, #50H       ;设置堆栈
     ACALL  WATCHDOG       ;T0置初值与启动(WATCHDOG的软件实现)
CAQULATER:
     ACALL  FEEDDOG        ;喂狗
     ACALL  DISPLAY        ;显示当前内容
     ACALL  KEYREAD        ;读键值,放入22单元
     MOV    A,22H          ;判断键值类型,以跳转到相应的处理程序
     ANL    A,#0F0H
     JZ             NUMPROCESS_SLECT   ;键值00H--09H,转入数字键处理子程
     JB     22H.4,  ASMDPROCESS_SLECT  ;键值10H--13H,转入运算键处理子程
     JB     22H.5,  CLEARALL_SLECT     ;键值20H,转入清零键处理子程
     JB     22H.6,  RESULTOUT_SLECT    ;键值40H,转入等于键处理子程
     JB     22H.7,  NOKEYDOWN_SLECT    ;没有按键,强制键值为80H,转入跳回指令
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           ;调用显示数字位数子程,待显示数据放2DH   
        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
  DEL0: MOV     R6,  #00H         ;延时子程 
    TM: MOV     R7,  #01H
        DJNZ    R7,  $
	DJNZ    R6,  TM
      RET
;显示数字位数字程
DISPNUM:
     JNB     20H.4, YYY             ;如果运算键已按下且数字键连按次数为零,
     MOV     A,21H                       ;说明BCD2还未按下,显示BCD1的位数
     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               ;根据运算键是否存在判断接收BCD1和BCD2
      JZ    BCD1
 BCD2:MOV   A, 21H                ;接收BCD2
      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               ;接收BCD1
      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           ;BCD1码的压缩
       SWAP A
       ORL  A, 30H
       MOV  34H,A
       MOV  20H,22H
       MOV  21H,#0H
     RET

;等于键处理子程
RESULTOUT:
      JNB   20H.4,RETURN3           ;无运算键按下则不予处理
      MOV  A, 37H            ;BCD2码的压缩
      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:

;乘法运算子程
BCDMUL:

;除法运算子程
BCDDIV:


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

⌨️ 快捷键说明

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