;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS2300-P_ADD_SUB.asm		                   
;摘    要:	HS2300-P_ADD_SUB.asm例程					   
;当期版本:	V3.0                                           
;作    者:                                                 
;开始日期:                                                 
;完成日期:               
;***********************************************************                                  
;         
;功能说明：实现16bit数据 加减法
;                                                 
;***********************************************************
;RC:	8MHz 2'
;RAM:	65 * 8
;ROM:	1K ×13
;STACK:	5 level
;***********************************************************

;--------------------SRAM----------------------
INDF		REG		00H
TMR0		REG		01H
PCL			REG		02H
;--------------
STATUS		REG		03H
	#define		RST		STATUS,7
	#define		T0		STATUS,4
	#define		PD		STATUS,3
	#define		Z		STATUS,2
	#define		DC		STATUS,1
	#define		C		STATUS,0
;--------------
FSR			REG		04H
PORTA		REG		05H

;--------------
PORTB		REG		06H
	#define		PB7		PORTB,7
	#define		PB6		PORTB,6
	#define		PB5		PORTB,5
	#define		PB4		PORTB,4
	#define		PB3		PORTB,3
	#define		PB2		PORTB,2
	#define		PB1		PORTB,1
	#define		PB0		PORTB,0		
;--------------
IOSTA		REG		05H
IOSTB		REG		06H
;--------------
PCON		REG		08H
	#define		WDTE	PCON,7
	#define		EIS		PCON,6
	#define		LVDTE	PCON,5	
;--------------
;--------------
WUCON		REG		09H
	#define		WUB7	WUCON,7
	#define		WUB6	WUCON,6
	#define		WUB5	WUCON,5
	#define		WUB4	WUCON,4
	#define		WUB3	WUCON,3
	#define		WUB2	WUCON,2
	#define		WUB1	WUCON,1
	#define		WUB0	WUCON,0	
;--------------
PCHBUF		REG		0AH

;--------------
PDCON		REG		0BH
	#define		PDB2	PDCON,6
	#define		PDB1	PDCON,5
	#define		PDB0	PDCON,4	
;--------------

;--------------
ODCON		REG		0CH
	#define		ODB7	ODCON,7
	#define		ODB6	ODCON,6
	#define		ODB5	ODCON,5
	#define		ODB4	ODCON,4
	#define		ODB2	ODCON,2
	#define		ODB1	ODCON,1
	#define		ODB0	ODCON,0	
;--------------

;--------------
PHCON		REG		0DH
	#define		PHB7	PHCON,7
	#define		PHB6	PHCON,6
	#define		PHB5	PHCON,5
	#define		PHB4	PHCON,4
	#define		PHB2	PHCON,2
	#define		PHB1	PHCON,1
	#define		PHB0	PHCON,0	
;--------------

;--------------
INTEN		REG		0EH
	#define		GIE		INTEN,7
	#define		TC1IE	INTEN,3
	#define		INTIE	INTEN,2
	#define		PBIE	INTEN,1
	#define		T0IE	INTEN,0
;--------------

;--------------
INTFLAG		REG		0FH
	#define		TC1IF	INTFLAG,3
	#define		INTIF	INTFLAG,2
	#define		PBIF	INTFLAG,1
	#define		T0IF	INTFLAG,0					
;--------------

;****************************RAM定义************************
DELAY_US	EQU		10H

Send_Buf	EQU		12H
Send_Cnt	EQU		13H
RBUF0		EQU		14H
RBUF1		EQU		15H
RBUF2		EQU		16H
STATUS_BUF	EQU		04EH
ACC_BUF		EQU		04FH

SUBAL		EQU		040H	;被减数低位
SUBAH		EQU		041H	;被减数高位
SUBBL		EQU		042H	;减数低位
SUBBH		EQU		043H	;减数高位
ADDAL		EQU		044H	;被加数低位
ADDAH		EQU		045H	;被加数高位
ADDBL		EQU		046H	;加数低位
ADDBH		EQU		047H	;加数高位


;------------------------------------------
;程序起始地址
;------------------------------------------
	ORG		000H
	GOTO	SystemInit
	
;------------------------------------------
;中断入口地址
;------------------------------------------	
	ORG		008H
	GOTO	INTERRUPT		;跳转至中断服务函数
		
	
;*******************************************************************
;函数名：INTERRUPT中断服务函数
;传参：
;返回值：
;功能：清中断标志位
;引脚：
;备注：
;*******************************************************************
INTERRUPT:
	MOVAR	ACC_BUF			;保存ACC
	SWAPR	STATUS,0
	MOVAR	STATUS_BUF		;保存STATUS

	BTRSC	T0IF			;判断TMR0溢出中断中断触发
	GOTO	TMR0_INT
							
	BTRSC	PBIF			;判断PB状态改变中断触发
	GOTO	PBx_INT
							
	BTRSC	INTIF			;判断INT外部输入中断触发
	GOTO	INT_INT
							
	GOTO	INT_BACK		
	
TMR0_INT:					;TMR0溢出中断
	BCR		T0IF			;清中断
	
	GOTO	INT_BACK
	
PBx_INT:					;PB状态改变中断
	BCR		PBIF			;清中断
	
	GOTO	INT_BACK
	
INT_INT:					;INT外部输入中断
	BCR		INTIF			;清中断	
	
	GOTO	INT_BACK
	
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0
	RETFIE	


;*******************************************************************
;函数名：GPIO_init
;传参：无
;返回值：无
;功能：配置I/O口输出模式
;引脚：PA0,PA1,PA2,PA3,PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7
;备注：
;*******************************************************************
GPIO_init:	
	;OPTION
	MOVIA	00000000B		;0000 0000
	OPTION				 
							;bit0~2:  PS2:PS0 :预分频比率选择位
								;PS2:PS0 	TMR0 比率	WDT 比率 
								;0 0 0		1:2			1:1
								;0 0 1		1:4			1:2 
								;0 1 0		1:8 		1:4 
								;0 1 1		1:16		1:8 
								;1 0 0		1:32 		1:16 
								;1 0 1		1:64		1:32 
								;1 1 0		1:128		1:64
								;1 1 1		1:256		1:128
							;bit3:	PSA		：预分频分配位
							;bit4:	T0SE	：TMR0 时钟源边沿选择位
							;bit5:	T0CS	：TMR0 时钟源选择位
							;bit6:	INTEDG	：外部中断触发方式选择位
							
	;I/O口控制寄存器
	MOVIA	00H				;0000 0000
	IOST	IOSTB			;0 = OUT  1 = IN		
	MOVIA	00H				;0000 0000
	MOVAR 	PORTB
	
	MOVIA	00H				;0000 0000
	IOST	IOSTA			;0 = OUT  1 = IN	
	MOVIA	00H				;0000 0000
	MOVAR 	PORTA
							
	;PCON(BANK1)(芯片控制寄存器)	
	MOVIA	0A0H			;1010 0000
	MOVAR	PCON   		 
							;bit5:LVDT: 低电压复位使能位
							;bit6:EIS:	 IOB0/INT引脚定义位
							;bit7:WDT:  看门狗定时器使能位
	
	;WUCON(BANK0)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H				;0000 0000
	MOVAR	WUCON			;0-DIS, 1-EN
		
	;PDCON(BANK0)(内部下拉控制寄存器)
	MOVIA	0FFH			;1111 1111
	MOVAR	PDCON			;0-EN, 1-DIS	
	
	;ODCON(BANK0)(PB漏极开路控制寄存器)
	MOVIA	00H				;0000 0000
	MOVAR	ODCON			;0-DIS, 1-EN
	
	;PHCON(BANK0)(PB 内部上拉控制寄存器)
	MOVIA	0FFH			;1111 1111
	MOVAR	PHCON			;0-EN, 1-DIS
	
	RETURN
	


;*******************************************************************
;函数名：DELAY
;传参：DELAY_US：循环体的循环次数
;返回值：无
;功能：在循环体中延时10个指令周期
;引脚：无
;*******************************************************************
DELAY:				
	MOVAR	DELAY_US	
DELAY_LOOP:	
	CLRWDT					;1;/清看门狗
	GOTO	$+1				;2
	GOTO	$+1				;2
	GOTO	$+1				;2
	DECRSZ	DELAY_US,1		;1/(2)
	GOTO	DELAY_LOOP		;2	
	RETURN					;2	

	
;*******************************************************************
;函数名：Send_Data
;传参：	Send_Buf
;返回值：
;功能：发送一字节的数据，0=1/4H+3/4L,1=3/4H+1/4L
;引脚：PB0
;*******************************************************************
#define		TXD_PIN		PB0
	;MOVR	
Send_Data:
	MOVAR	Send_Buf		;传参Send_Buf
	
	MOVIA	08H
	MOVAR	Send_Cnt

Send_Data_LOOP:
	BTRSS	Send_Buf,7		;判断1/0
	GOTO	Send_Data_bit0	;为0
	GOTO	Send_Data_bit1	;为1
	
Next_Data_Judge:
	RLR		Send_Buf,1
	DECRSZ	Send_Cnt,1	
	GOTO	Send_Data_LOOP
	RETURN	

Send_Data_bit0:
	BSR		TXD_PIN	
	MOVIA	50
	CALL	DELAY
	
	BCR		TXD_PIN	
	MOVIA	150
	CALL	DELAY
	
	GOTO	Next_Data_Judge
	
Send_Data_bit1:
	BSR		TXD_PIN	
	MOVIA	150
	CALL	DELAY
	
	BCR		TXD_PIN	
	MOVIA	50
	CALL	DELAY
	
	GOTO	Next_Data_Judge

	
	
;*******************************************************************
;函数名：SystemInit
;传参：
;返回值：
;功能：
;引脚：
;*******************************************************************
SystemInit:	
	CALL	RAM_CLR		
	CALL	GPIO_init		;GPIO初始化
	
	MOVIA	0FAH
	MOVAR	ADDAH			;被加数高位赋值
	
	MOVIA	0BAH
	MOVAR	ADDAL			;被加数低位赋值
	
	MOVIA	0CAH
	MOVAR	ADDBH			;加数高位赋值
	
	MOVIA	0DAH
	MOVAR	ADDBL			;加数低位赋值
	
;	MOVIA	0FAH
;	MOVAR	SUBAH			;被减数高位赋值
;	
;	MOVIA	0BAH
;	MOVAR	SUBAL			;被减数低位赋值
;	
;	MOVIA	0CAH
;	MOVAR	SUBBH			;减数高位赋值
;	
;	MOVIA	0DAH
;	MOVAR	SUBBL			;减数低位赋值

MAIN:
	CLRWDT
;	CALL	SUB_16Bit_Test	;
	CALL	ADD_16Bit_SUM	;
	 
	MOVIA	200
	CALL	DELAY
	MOVIA	200
	CALL	DELAY
	MOVIA	200
	CALL	DELAY
	MOVIA	200
	CALL	DELAY
	BCR		PORTB,0			
	MOVIA	200
	CALL	DELAY		
	
	MOVR	ADDBH,0			
	CALL	Send_Data		;发送ADDBH
	MOVIA	200				
	CALL	DELAY			
	
	MOVR	ADDBL,0
	CALL	Send_Data		;发送ADDBL
	MOVIA	200
	CALL	DELAY
	
	MOVR	ADDAH,0
	CALL	Send_Data		;发送ADDAH
	MOVIA	200
	CALL	DELAY
	
	MOVR	ADDAL,0
	CALL	Send_Data		;发送ADDAL
	MOVIA	200
	CALL	DELAY
	
	GOTO	MAIN
	
	
;*******************************************************************
;函数名：RAM_CLR
;传参：
;返回值：
;功能：清—RAM,10~3f可间接寻址，40~4f不可间接寻址
;引脚：
;*******************************************************************
RAM_CLR:
	MOVIA	0X2F			;需清RAM数量		
	MOVAR	10H				;RAM起始地址，自建寄存器
	MOVIA	0X3F			
	MOVAR	FSR				;RAM结束地址
	
RAM_CLR_LOOP:	
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	10H,1			;清RAM起始地址，自建寄存器
	GOTO	RAM_CLR_LOOP	
	
	CLRR	40H				;40~4f不可间接寻址
	CLRR	41H
	CLRR	42H
	CLRR	43H
	CLRR	44H
	CLRR	45H
	CLRR	46H
	CLRR	47H
	CLRR	48H
	CLRR	49H
	CLRR	4AH
	CLRR	4BH
	CLRR	4CH
	CLRR	4DH
	CLRR	4EH
	CLRR	4FH
	RETURN
	

;----------------------------------------------
;函数功能：16减法	
;16bit+16bit
;SUBAH SUBAL - SUBBH SUBBL = SUBBH SUBBL SUBAH SUBAL
;被减数：ADDAH ADDAL
;减 数 ：ADDBH ADDBL
;返回值：ADDBH ADDBL ADDAH ADDAL
;----------------------------------------------
SUB_16Bit_Test:
	MOVR	SUBBL,0			;SUBBL->ACC
	SUBAR	SUBAL,1			;SUBAL=SUBAL-ACC,被减数SUBAL，减数SUBBL
	MOVR	SUBBH,0			;SUBBH->ACC
	SBCAR	SUBAH,1			;SUBAH=SUBAH-SUBBH+C,被减数SUBAH，减数SUBBH
	
	CLRR	SUBBL
	CLRR	SUBBH
	
	BTRSC	C				;STATUS,0;判断c的值
	BSR		SUBBH,7			;C为0则SUBBH最高位为符号

	RETURN
	
;----------------------------------------------
;函数功能：16加法	
;16bit+16bit
;ADDAH ADDAL + ADDBH ADDBL = ADDBH ADDBL ADDAH ADDAL
;被加数：ADDAH ADDAL
;加 数 ：ADDBH ADDBL
;返回值：ADDBH ADDBL ADDAH ADDAL
;----------------------------------------------
ADD_16Bit_SUM:
	MOVR	ADDBL,0			;ADDBL->ACC
	ADDAR	ADDAL,1			;ADDAL=ADDAL+ACC,被减数SUBAL，减数SUBBL
	MOVR	ADDBH,0			;ADDBH->ACC
	ADCAR	ADDAH,1			;ADDAH=ADDAH+ADDBH+C,被减数SUBAH，减数SUBBH
	BTRSS	C
	GOTO	ADD_16Bit_SUM_END
	CLRR	ADDBL
	CLRR	ADDBH
	INCR	ADDBL,1			
	RETURN		
		
ADD_16Bit_SUM_END:
	CLRR	ADDBL
	CLRR	ADDBH
	RETURN
	