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

📄 compulater.txt

📁 1. 计算器实现的功能 (1)整数的加、减、乘、除运算; (2)小数的加、减运算
💻 TXT
📖 第 1 页 / 共 3 页
字号:
;********************** 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 + -