📄 compulater.txt
字号:
;********************** subtration funtion *******************************
; 07-funtion*****************SUB_PREPARE****************
SUB_FUN NOP ;减法准备函数
CLRF DATA0
CLRF DATA1
CLRF DATA2
CLRF DATA3 ;DATA清零
CLRF DATB0
CLRF DATB1
CLRF DATB2
CLRF DATB3 ;DATB清零
CALL ADDER_B ;把显示缓存区的内容‘被减数’给DATB
CALL GET_NUM ;取‘减数’
CALL ADDER_A ;把显示缓存区的内容‘减数’给DATA
CALL INI_ADDER ;清屏
CALL SUB_A_B ;计算DATB-DATA
CALL RES_ADDER ;把结果ANSER给显示缓存区
RETURN
; 08-funtion********************** SUBTRATION *************************
SUB_A_B NOP ;计算DATB-DATA
MOVF DATA0,0
SUBWF DATB0,0 ;计算个位数相减
MOVWF ANSER0
BTFSC STATUS,DC ;ANSER0=DATB0-DATA0
GOTO S_UB2 ;DC=1,没有借位FLAGA=0,算十位
MOVLW 06H
SUBWF ANSER0,1 ;有借位,则ANSER0=ANSER0-6
MOVLW 01H
MOVWF FLAGA ;FLAGA=1
MOVF ANSER0,W
ANDLW 0FH
MOVWF ANSER0 ;保证ANSER0中存放的是非压缩BCD码
GOTO JIAN_1 ;继续进行十位数的相减
S_UB2 MOVLW 00H
MOVWF FLAGA
JIAN_1 MOVF FLAGA,0 ;十位数相减(原理同个位数)
ADDWF DATA1,0
SUBWF DATB1,0 ;DATB1-(DATA1+FLAGA)=ANSER1
MOVWF ANSER1
BTFSC STATUS,DC
GOTO S_UB3 ;DC=1
MOVLW 06H
SUBWF ANSER1,1
MOVLW 01H
MOVWF FLAGA
MOVF ANSER1,W
ANDLW 0FH
MOVWF ANSER1
GOTO JIAN_2
S_UB3 MOVLW 00H
MOVWF FLAGA
JIAN_2 MOVF FLAGA,0 ;百位数相减(原理同个位数)
ADDWF DATA2,0
SUBWF DATB2,0
MOVWF ANSER2
BTFSC STATUS,DC
GOTO S_UB4 ;DC=1
MOVLW 06H
SUBWF ANSER2,1
MOVLW 01H
MOVWF FLAGA
MOVF ANSER2,W
ANDLW 0FH
MOVWF ANSER2
GOTO JIAN_3
S_UB4 MOVLW 00H
MOVWF FLAGA
JIAN_3 MOVF FLAGA,0 ;千位数相减(原理同个位数)
ADDWF DATA3,0
SUBWF DATB3,0
MOVWF ANSER3
BTFSC STATUS,DC
GOTO S_UB5 ;DC=1
MOVLW 06H
SUBWF ANSER3,1
MOVLW 01H
MOVWF FLAGA
MOVF ANSER3,W
ANDLW 0FH
MOVWF ANSER3
GOTO JIAN_4
S_UB5 MOVLW 00H
MOVWF FLAGA
JIAN_4 RETURN
; 09-funtion*********************** multiplation funtion **********************
MULT_FUN ;乘法准备函数
CLRF DATA0
CLRF DATA1
CLRF DATA2
CLRF DATA3 ;DATA清零
CLRF DATB0
CLRF DATB1
CLRF DATB2
CLRF DATB3 ;DATB清零
CLRF DATC0
CLRF DATC1
CLRF DATC2
CLRF DATC3 ;DATC清零
CLRF DATD0
CLRF DATD1
CLRF DATD2
CLRF DATD3 ;DATD清零
CALL ADDER_C ;把显示缓存区的内容‘被乘数’给DATC
CALL GET_NUM ;取‘乘数’
CALL ADDER_D ;把显示缓存区的内容‘乘数’给DATD
CALL INI_ADDER ;清屏
CALL MULT_C_D ;计算DATC*DATD
BTFSC FLAGA,0 ;乘法溢出FLAGA=1 则结束
GOTO MM_1
CALL DATE_ADDER ;把结果DATE给显示缓存区
MM_1 RETURN
; 10-funtion********************** C*D ***************
MULT_C_D NOP ;计算DATC*DATD
CLRF DATE0
CLRF DATE1
CLRF DATE2
CLRF DATE3 ;DATE清零
CALL D_ZERO ;检测DATD初值是否为零
BTFSS FLAGB,0
GOTO CCRET ;DATD=0则结束
CCDD CALL TRAN_E_A
CALL TRAN_C_B
CALL ADD_A_B ;计算DATE=DATE+DATC(DATD次结束,实现乘运算)
BTFSS FLAGA,0 ;如果中间结果超过四位,则返回
GOTO CC1
GOTO CCRET
CC1 CALL ANS_DATE ;传递每次加的结果给DATE
CALL TRAN_D_B
CALL TRAN_01_A
CALL SUB_A_B ;运算一次,则DATD减1,
CALL ANS_DATD
CALL D_ZERO ;DATD=0则结束
BTFSC FLAGB,0
GOTO CCDD
CCRET RETURN
; 11-funtion************************ division funtion ****************************
DIVI_FUN NOP ;除法准备函数
CLRF DATA0
CLRF DATA1
CLRF DATA2
CLRF DATA3 ;DATA清零
CLRF DATB0
CLRF DATB1
CLRF DATB2
CLRF DATB3 ;DATB清零
CLRF DATC0
CLRF DATC1
CLRF DATC2
CLRF DATC3 ;DATC清零
CLRF DATD0
CLRF DATD1
CLRF DATD2
CLRF DATD3 ;DATD清零
CALL ADDER_C ;把显示缓存区的内容‘被除数’给DATC
CALL GET_NUM ;取‘除数’
CALL ADDER_D ;把显示缓存区的内容‘除数’给DATD
CALL INI_ADDER ;清屏
CALL DIVI_C_D ;计算DATC/DATD=DATE...DATD
BTFSC FLAGA,0 ;除数为零,FLAGA=1 则结束
GOTO DDRET
CALL DATE_ADDER ;把结果DATE给显示缓存区
CALL PLAY
CALL EQU_Y_N ;检测,如有等号按下
CALL DATC_ADDER ;把余数DATD存在显示缓存区
DDRET RETURN
; 12-funtion************** C/D *******************************
DIVI_C_D ;计算DATC/DATD=DATE...DATD
CLRF DATE0
CLRF DATE1
CLRF DATE2
CLRF DATE3 ;DATE清零
DIV_22 CALL TRAN_C_B
CALL TRAN_D_A
CALL D_ZERO ;检测除数DATD如果为零则强行报错,返回
BTFSS FLAGB,0
GOTO DIV_33
CALL SUB_A_B ;DATC=DATC-DATD
BTFSC FLAGA,0
GOTO DIV_11 ;有借位(减后得负)结束
CALL ANS_DATC
CALL TRAN_E_A
CALL TRAN_01_B
CALL ADD_A_B ;每减一次,DATE加1
CALL ANS_DATE
GOTO DIV_22
DIV_33 MOVLW 01H ;除数DATD为零时,令FLAGA=1
MOVWF FLAGA ;制造溢出错误,返回
RETURN
DIV_11 CLRF FLAGA ;结束,清FLAGA=0
RETURN
; 13-funtion*****************************************
ADD_DOTT ;小数点加法准备程序
CLRF DATA0
CLRF DATA1
CLRF DATA2
CLRF DATA3
CLRF DATC0
CLRF DATC1
CLRF DATC2
CLRF DATC3
CLRF DATB0
CLRF DATB1
CLRF DATB2
CLRF DATB3
CLRF DATD0
CLRF DATD1
CLRF DATD2
CLRF DATD3
CALL ADDER_A ;将ADDER中的键值给DATA
CALL BREAK_AC ;将DATA中的整数和小数部分分放在DATA、DATC中
CALL GET_NUM ;再次取键值,得到第二个加数,放在ADDER中
CALL ADDER_B ;将ADDER中的键值给DATB
BTFSS FG_DOT,0 ;检测第二个加数是否含小数点
GOTO YY_W ;若FG_DOT=0,表明是整数,则直接加运算
CALL BREAK_BD ;若FG_DOT=1,表明含小数,
;则将DATB中的整数和小数部分分在DATB、DATD中
YY_W CALL ADD_DOT ;调用含小数点的加法程序
RETURN
; 14-funtion***************************************
ADD_DOT
CALL TRAN_A_G
CALL TRAN_B_F
CALL TRAN_C_B
CALL TRAN_D_A
CALL ADD_A_B ;实现小数部分相加
CALL ANS_DATE ;小数部分结果存放在DATE中
BTFSC FLAGA,0 ;检测是否有进位
GOTO CA_1 ;有的话将FLAGA加到整数部分的个位
GOTO CA_2 ;没有的话直接跳过执行下面的程序
CA_1 MOVF FLAGA,0
ADDWF DATG0,1
CA_2 CALL TRAN_G_A
CALL TRAN_F_B
BCF DATA0,7 ;执行加法前将小数点位清掉
BCF DATB0,7
CALL ADD_A_B ;实现整数部分相加
BSF ANSER0,7 ;置整数部分的小数点位
CALL RES_ADDER ;整数部分结果存放在ADDER中
CALL RE_DOT_P ;调用显示最终结果的准备子程序
RETURN
; 15-funtion*****************************************
SUB_DOTT
CLRF DATA0
CLRF DATA1
CLRF DATA2
CLRF DATA3
CLRF DATC0
CLRF DATC1
CLRF DATC2
CLRF DATC3
CLRF DATB0
CLRF DATB1
CLRF DATB2
CLRF DATB3
CLRF DATD0
CLRF DATD1
CLRF DATD2
CLRF DATD3
CALL ADDER_A ;将ADDER中的键值给DATA
CALL BREAK_AC ;将DATA中的整数和小数部分分放在DATA、DATC中
CALL GET_NUM ;再次取键值,得到减数,放在ADDER中
CALL ADDER_B ;将ADDER中的键值给DATB
BTFSS FG_DOT,0 ;检测第二个加数是否含小数点
GOTO YY_Q ;若FG_DOT=0,表明是整数,则直接减运算
CALL BREAK_BD ;若FG_DOT=1,表明含小数,
;则将DATB中的整数和小数部分分放在DATB、DATD中
YY_Q CALL SUB_DOT ;调用含小数点的减法程序
RETURN
; 16-funtion***************************************
SUB_DOT
CALL TRAN_A_G
CALL TRAN_B_F
CALL TRAN_C_B
CALL TRAN_D_A
CALL SUB_A_B ;实现小数部分相减
CALL ANS_DATE ;小数部分结果存放在DATE中
BTFSC FLAGA,0 ;检测是否有借位
GOTO CAC_1 ;有的话将FLAGA加到减数部分的个位
GOTO CAC_2 ;没有的话直接跳过执行下面的程序
CAC_1 MOVF FLAGA,0
ADDWF DATF0,1
CAC_2 CALL TRAN_G_B
CALL TRAN_F_A
BCF DATA0,7 ;执行减法前将小数点位清掉
BCF DATB0,7
CALL SUB_A_B ;实现整数部分相减
BSF ANSER0,7 ;置整数部分的小数点位
CALL RES_ADDER ;整数部分结果存放在ADDER中
CALL RE_DOT_P ;调用显示最终结果的准备子程序
RETURN
; 17-funtion******************************************
DOT_FUN
BSF FG_DOT,0 ;置小数点标志位
MOVF ADDER4,W ;如果第一个输入的是小数点,则ADDDER4=0
IORLW 00H
BTFSS STATUS,Z
GOTO PP_1 ;如果不是第一个数,则正常显示
CLRF ADDER0 ;则默认显示0.***
DECF COUNT,1
INCF ADDER4,1
PP_1 BSF ADDER0,7 ;小数点显示
RETURN
; 18-funtion********************************
RE_DOT_P
HH_A MOVLW 00H ;检测ADDER的最高位是否为零
IORWF ADDER3,1
BTFSS STATUS,Z
GOTO CC3 ;不为零的话直接返回
CALL E_ADDER ;为零的话将后面几位向前移一位,DATE3给ADDER0
GOTO HH_A ;循环扫描下一位
CC3 NOP
RETURN
; 19-funtion**********************************************
LEDD BSF STATUS,RP0
CLRF TRISC
BCF STATUS,RP0 ;设置PORTC口为输出
BCF PORTC,4 ;置LOAD口低电平
MOVLW 0FH
CALL DISPLAY
MOVLW 00H
CALL DISPLAY ;设置正常显示方式
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 0BH
CALL DISPLAY
MOVLW 03H
CALL DISPLAY ;设置扫描范围
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 09H
CALL DISPLAY
MOVLW 0FFH
CALL DISPLAY ;设置各位译码方式
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 0AH
CALL DISPLAY
MOVLW 0FH
CALL DISPLAY ;设置数码关显示亮度
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 0CH
CALL DISPLAY
MOVLW 01H
CALL DISPLAY ;设置串行显示数据
BSF PORTC,4 ;给LOAD口下降沿
RETURN
; 20-funtion****************FOR LED TO START****************
DISPLAY ;把W寄存器中的数据转换成串行输出
BCF PORTC,3
MOVWF BUFF ;保存W寄存器中的数据在BUFF
MOVLW 08H
MOVWF BIT ;转换8次,结束
DIS1 BCF PORTC,3 ;置CLK口低电平
BTFSC BUFF,7 ;如果当前最高是1
BSF PORTC,5 ;则给DIN高电平
BTFSS BUFF,7 ;如果当前最高是0
BCF PORTC,5 ;则给DIN低电平
RLF BUFF,F ;准备转换下一位
BSF PORTC,3 ;置CLK口高电平
DECFSZ BIT,F
GOTO DIS1
BCF PORTC,3 ;结束,置CLK口低电平
RETURN
; 21-funtion******************DISPLAY KEYBOARD **************
PLAY NOP ;显示函数
BCF PORTC,4 ;置LOAD口低电平
MOVLW 01H
CALL DISPLAY ;DIG0显示ADDER0内容
MOVF ADDER0,0
CALL DISPLAY
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 02H
CALL DISPLAY
MOVF ADDER1,0 ;DIG1显示ADDER1内容
CALL DISPLAY
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 03H
CALL DISPLAY
MOVF ADDER2,0 ;DIG2显示ADDER2内容
CALL DISPLAY
BSF PORTC,4 ;给LOAD口下降沿
BCF PORTC,4 ;置LOAD口低电平
MOVLW 04H
CALL DISPLAY
MOVF ADDER3,0 ;DIG3显示ADDER3内容
CALL DISPLAY
BSF PORTC,4 ;给LOAD口下降沿
RETURN
; 22-funtion************initial ADDER_0-4_**************
INI_ADDER NOP ;初始化ADDER,使其开始时显示为空
MOVLW 0FH
MOVWF ADDER0
MOVWF ADDER1
MOVWF ADDER2
MOVWF ADDER3
CLRF ADDER4
RETURN
; 23-funtion***************** ERROR REPORT **************
ERROR_FUN ;报错程序
CALL INI_ADDER ;显示空
MOVLW 0BH
MOVWF ADDER0 ;显示错误标志‘E’
CALL PLAY
CALL EQU_Y_N ;有等号按下时返回
RETURN
; 24-funtion************* WETHER IT IS EQU ****************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -