;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS23P1800_TC1-PWM.asm		                   
;摘    要:	HS23P1800 TC1-PWM功能展示			           
;当期版本:	V3.0                                           
;作    者:	 		                                       
;开始日期:                                     
;完成日期:                                                  
;***********************************************************
;RC:	8MHz 2'
;RAM:	65 * 8
;ROM:	1K	*14
;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
;/IOSTA		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		
;--------------
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					
;--------------
TC1CL		REG		71H

;--------------
TC1M		REG		72H
#define		TC1TR	TC1M,7
#define		TCCKS	TC1M,3
#define		T16SEL	TC1M,2
#define		BUZ		TC1M,1
#define		PWM0	TC1M,0	
;--------------
TC1R		REG		73H
TC1D0		REG		74H
TC1CH		REG		74H
TC1D1		REG		75H
TC1D2		REG		76H

;--------------	
PWMCON		REG		77H
#define		PWM2S	PWMCON,3
#define		PWM1S	PWMCON,2
#define		PWM2EN	PWMCON,1
#define		PWM1EN	PWMCON,0			
;--------------

;--------------
PDCON1		REG		78H
#define		PDB5	PDCON1,5
#define		PDB4	PDCON1,4
#define		PDB3	PDCON1,3
;--------------
;****************************RAM定义************************ 
DELAY_US	EQU		10H
MODE		EQU		11H

STATUS_BUF	EQU		04EH
ACC_BUF		EQU		04FH



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

	BTRSC	TC1IF
	GOTO	TC1_INT
	GOTO	INT_BACK
 

TC1_INT:
	BCR		TC1IF			;清中断
	
	;TC1 定时器寄存器(低八位)
	MOVIA	00H
	MOVAR	TC1CL
	
	;TC1 定时器寄存器(高八位)
	MOVIA	00H
	MOVAR	TC1CH
	
	MOVIA	00000100B
	XORAR 	PORTB,1			;翻转PB2
	
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0
	RETFIE	

;*********************************************************************
;函数名：GPIO_init
;传参：无
;返回值：无
;功能：配置I/O口输出模式
;引脚： PB0,PB1,PB2,PB3,PB4,PB5 
;备注：
;*********************************************************************
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
	
	CLRR	PORTB
							
	;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
	
	
;*********************************************************************
;函数名：INTEN_TC1_init
;传参：MODE: 0 = 8BIT    1 = 16BIT
;返回值：
;功能：8/16定时器
;引脚：
;备注：
;*********************************************************************
INTEN_TC1_init:
	MOVR	MODE,0
	BTRSC	Z
	GOTO	MODE_8BIT_CLK	;8位定时器
	GOTO	MODE_16BIT_CLK	;16位定时器
	
MODE_8BIT_CLK:

	;TC1 定时器寄存器(低八位)
	MOVIA	00H
	MOVAR	TC1CL

	;自动重装载寄存器
	MOVIA	00H
	MOVAR	TC1R
	
	;PWM0占空比控制寄存器、定时器高 8 位
	MOVIA	00H
	MOVAR	TC1D0
		
	;PWM配置寄存器
	MOVIA	00000000B		;0000 0011
	MOVAR	PWMCON			 
							;Bit0：PWM1EN: PWM1 使能位
							;Bit1：PWM2EN: PWM2 使能位
							;Bit2：PWM1S: PWM1 端口选择位
							;Bit3：PWM2S: PWM2 端口选择位 1 = 选择 IOB4 作为 PWM2 输
							;Bit5~Bit4：PWM1XR1：PWM1XR0:
								;/0 0 ：PWM1 不变 
								;/0 1 ：PWM1 取反
								;/1 0 ：PWM1=PWM1 XOR PWM0（异或）
								;/1 1 ：PWM1=PWM1 XNOR PWM0（同或）
							;Bit7~Bit6：PWM2XR1：PWM2XR0:
								;/0 0 ：PWM2 不变 
								;/0 1 ：PWM2 取反 
								;/1 0 ：PWM2=PWM2 XOR PWM1（异或） 
								;/1 1 ：PWM2=PWM2 XNOR PWM1（同或）
	;TC1配置寄存器
	MOVIA	11110000B		;0000 0000
	MOVAR	TC1M			 
							;Bit0：PWM0
							;Bit1：BUZOUT:
							;Bit2：8/16 位定时器选择。仅当所有 PWMEN = 0 且 BUZ=0 时有效
							;Bit3：TC 时钟信号控制位
							;Bit6~Bit4：TC1S[2:0]：TC 分频选择位
								;TC1S[2:0]：TC1/1分频选择位。 	TC1S[2:0] 选择Fcpu（TCCKS=0）时 	选择Fosc（TCCKS=0）时 
								;000 							Fcpu / 256 							Fosc / 128 
								;001 							Fcpu / 128 							Fosc / 644 
								;010 							Fcpu / 64 							Fosc / 32 
								;011 							Fcpu / 32 							Fosc / 16 
								;100 							Fcpu / 16 							Fosc / 8 
								;101 							Fcpu / 8 							Fosc / 4 
								;110 							Fcpu / 4 							Fosc / 2 
								;111 							Fcpu / 2 							Fosc / 1
							;Bit7：TC1TR：TC 启动控制位
	

	GOTO	TC_Init_END
	
MODE_16BIT_CLK:

	;TC1 定时器寄存器(低八位)
	MOVIA	00H
	MOVAR	TC1CL
	
	;TC1 定时器寄存器(高八位)
	MOVIA	00H
	MOVAR	TC1CH
	
	;PWM配置寄存器
	MOVIA	00000000B		;0000 0011
	MOVAR	PWMCON			 
							;Bit0：PWM1EN: PWM1 使能位
							;Bit1：PWM2EN: PWM2 使能位
							;Bit2：PWM1S: PWM1 端口选择位
							;Bit3：PWM2S: PWM2 端口选择位 1 = 选择 IOB4 作为 PWM2 输
							;Bit5~Bit4：PWM1XR1：PWM1XR0:
								;0 0 ：PWM1 不变 
								;0 1 ：PWM1 取反
								;1 0 ：PWM1=PWM1 XOR PWM0（异或）
								;1 1 ：PWM1=PWM1 XNOR PWM0（同或）
							;Bit7~Bit6：PWM2XR1：PWM2XR0:
								;0 0 ：PWM2 不变 
								;0 1 ：PWM2 取反 
								;1 0 ：PWM2=PWM2 XOR PWM1（异或） 
								;1 1 ：PWM2=PWM2 XNOR PWM1（同或）
	;TC1配置寄存器
	MOVIA	11110100B		;0000 0000
	MOVAR	TC1M			 
							;Bit0：PWM0
							;Bit1：BUZOUT:
							;Bit2：8/16 位定时器选择。仅当所有 PWMEN = 0 且 BUZ=0 时有效
							;Bit3：TC 时钟信号控制位
							;Bit6~Bit4：TC1S[2:0]：TC 分频选择位
								;TC1S[2:0]：TC1/1分频选择位。 	TC1S[2:0] 选择Fcpu（TCCKS=0）时 	选择Fosc（TCCKS=0）时 
								;000 							Fcpu / 256 							Fosc / 128 
								;001 							Fcpu / 128 							Fosc / 644 
								;010 							Fcpu / 64 							Fosc / 32 
								;011 							Fcpu / 32 							Fosc / 16 
								;100 							Fcpu / 16 							Fosc / 8 
								;101 							Fcpu / 8 							Fosc / 4 
								;110 							Fcpu / 4 							Fosc / 2 
								;111 							Fcpu / 2 							Fosc / 1
							;Bit7：TC1TR：TC 启动控制位
	
	GOTO	TC_Init_END
	
TC_Init_END:
	;中断状态寄存器
	BCR		TC1IF
	
	;中断屏蔽寄存器
	BSR		TC1IE
	
	;总中断屏蔽寄存器
	BSR		GIE
	
	RETURN
	
	
;*********************************************************************
;函数名：PWM_TC1_init
;传参：
;返回值：
;功能：PWM输出
;引脚：
;备注：
;*********************************************************************
PWM_TC1_init:

	;TC1 定时器寄存器
	MOVIA	00H
	MOVAR	TC1CL
	
	;自动重装载寄存器
	MOVIA	00H
	MOVAR	TC1R
	
	;PWM0占空比控制寄存器
	MOVIA	40
	MOVAR	TC1D0
	
	;PWM1占空比控制寄存器
	MOVIA	80
	MOVAR	TC1D1
	
	;PWM2占空比控制寄存器
	MOVIA	120
	MOVAR	TC1D2
	
	;PWM配置寄存器
	MOVIA	00000011B		;0000 0011
	MOVAR	PWMCON			 
							;Bit0：PWM1EN: PWM1 使能位
							;Bit1：PWM2EN: PWM2 使能位
							;Bit2：PWM1S: PWM1 端口选择位
							;Bit3：PWM2S: PWM2 端口选择位 1 = 选择 IOB4 作为 PWM2 输
							;Bit5~Bit4：PWM1XR1：PWM1XR0:
								;0 0 ：PWM1 不变 
								;0 1 ：PWM1 取反
								;1 0 ：PWM1=PWM1 XOR PWM0（异或）
								;1 1 ：PWM1=PWM1 XNOR PWM0（同或）
							;Bit7~Bit6：PWM2XR1：PWM2XR0:
								;0 0 ：PWM2 不变 
								;0 1 ：PWM2 取反 
								;1 0 ：PWM2=PWM2 XOR PWM1（异或） 
								;1 1 ：PWM2=PWM2 XNOR PWM1（同或）
	;TC1配置寄存器
	MOVIA	11110001B		;0000 0000
	MOVAR	TC1M			 
							;Bit0：PWM0
							;Bit1：BUZOUT:
							;Bit2：8/16 位定时器选择。仅当所有 PWMEN = 0 且 BUZ=0 时有效
							;Bit3：TC 时钟信号控制位
							;Bit6~Bit4：TC1S[2:0]：TC 分频选择位
								;TC1S[2:0]：TC1/1分频选择位。 	TC1S[2:0] 选择Fcpu（TCCKS=0）时 	选择Fosc（TCCKS=0）时 
								;000 							Fcpu / 256 							Fosc / 128 
								;001 							Fcpu / 128 							Fosc / 644 
								;010 							Fcpu / 64 							Fosc / 32 
								;011 							Fcpu / 32 							Fosc / 16 
								;100 							Fcpu / 16 							Fosc / 8 
								;101 							Fcpu / 8 							Fosc / 4 
								;110 							Fcpu / 4 							Fosc / 2 
								;111 							Fcpu / 2 							Fosc / 1
							;Bit7：TC1TR：TC 启动控制位
	RETURN
	
	
	
;*********************************************************************
;函数名：SystemInit
;传参：
;返回值：
;功能：
;引脚：
;*********************************************************************
SystemInit:	
		
	CALL	RAM_CLR			;清bank0
	CALL	GPIO_init
	MOVIA	01H
	MOVAR	MODE
	CALL	INTEN_TC1_init	;定时器使能
	//CALL	PWM_TC1_init	;PWM使能

MAIN:
	CLRWDT					;清看门狗
	MOVIA	00000001B
	XORAR 	PORTB,1			;翻转PB1
	MOVIA	100
	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
	
	
;*********************************************************************
;函数名：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	
	
	