;***********************************************************
;单    位:苏州华芯微电子有限公司                          
;                                                          
;文件名称:	HS16F1200_TP0					       
;摘    要:		
;		                                               
;当期版本:	V1.0                                       
;作    者:  LvBuWei                           		   
;开始日期:  2022.11.11                                  
;完成日期:                        
;******************************************************* 
;
;RAM:	64*8
;ROM:	1K×14
;STACK:	8-level
;EEPROM:128-bytes
;
;*******************************************************
;PIN-DEFINE
;****************************************************  
;	   	 VDD -1		8 - VSS	                     
;	   	 PB5 -2		7 - PB0	                     
;	OUT1 PB4 -3		6 - PB1 KEY1
;	OUT2 PB3 -4		5 - PB2	KEY2                    
;**************************************************** 
;***********************************************************
;files include
#include "HS16F1200.inc"

A       EQU     00H
R       EQU     01H
;***********************************************************
;user general reg define
DELAY_US	EQU		040H
TP0_Mode	EQU		041H

STATUS_BUF	EQU		07EH
ACC_BUF		EQU		07FH


;***********************************************************
;函数入口地址
	ORG		00H
	GOTO	MAIN
	
;中断入口地址
	ORG		04H
	;GOTO	INT_PRO
INT_PRO:	
	MOVAR	ACC_BUF		;保存ACC
	SWAPR	STATUS,0
	MOVAR	STATUS_BUF	;保存STATUS
	
	BTRSS	TP0IF
	GOTO	INT_BACK	
	BCR		TP0IF

;	BSR		RP1	;goto bank2	
;	定时器周期寄存器
;	MOVIA	00
;	MOVAR	PWM0TH
;	MOVIA	00
;	MOVAR	PWM0TL
;	BCR		RP1	;goto bank0
	
	MOVIA	0x01
	XORAR	PORTB,1
	
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0
	RETFIE	
;/程序开始
;***********************************************************
;函数名：MAIN
;***********************************************************
MAIN:
	CALL	GPIO_init
	CALL	BANK0_RAM_CLR
	
	MOVIA	0x00
	MOVIA	0x01
	MOVIA	0x02
	MOVAR	TP0_Mode
	CALL	TP0_Init
	
MAIN_LOOP:
	CLRWDT
	MOVIA	0x20
	XORAR	PORTB,1
	MOVIA	200
	CALL	DELAY	;延时2000个指令周期
	GOTO	MAIN_LOOP


;***********************************************************
;函数名：GPIO_init
;注意寄存器所在 bank 区域
;***********************************************************
GPIO_init:
	BSR		STATUS,5	;转到bank1
	
	;OPTION_REG(BANK1)
	MOVIA	000H		;0000 0000
	MOVAR	OPTION_REG	;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）	;0-falling edge, 1-rising edge
						;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
						;Bit5：T0CS：TMR0时钟源选择位					;0-fcpu, 1-ExitClock
						;Bit4：T0SE：TMR0时钟源边沿选择位				;0-falling edge, 1-rising edge
						;Bit3：PSA：预分频分配位						;0-TMR0, 1-WDT
						;Bit2~Bit0：PS2:PS0：预分频比率选择位

	;PCON(BANK1)(芯片控制寄存器)
	MOVIA	0A0H		;101- ----   	
	MOVAR	PCON		;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
						;Bit6：EIS: IOB0/INT引脚定义位			;0-DIS, 1-EN
						;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
							
	;TRISB(BANK1)(I/O口PB控制寄存器)
	MOVIA	00H			;0000 0000 			
	MOVAR	TRISB		;0-OUT, 1-IN
		
	;PBIC0(BANK1)(PA口驱动选择寄存器)		
	MOVIA	00H			;0000 0000
	MOVAR	PBIC0		;0-DIS, 1-EN
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H			;0000 0000
	MOVAR	WUCON		;0-DIS, 1-EN
	
	BCR		STATUS,5	;转到bank0
		
	;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
	
	
;***********************************************************
;函数名：TP0_Init;
;***********************************************************
TP0_Init:	
	MOVR	TP0_Mode,A	
	ANDIA	0x03
	ADDAR	PCL,R
	GOTO	TP0_Mode_8bit_Time
	GOTO	TP0_Mode_12bit_Time
	GOTO	TP0_Mode_3PWM
	GOTO	TP0_Mode_8bit_Time
	
;***********************************************************
;8bit-MODE 无自动装载功能
;中断处理 需要重新赋初值
;config:Fcpu 4M 2'
;示例程序：100us
TP0_Mode_8bit_Time:
	BSR		RP1	;goto bank2
	
	;定时器周期寄存器
	MOVIA	0x00
	MOVAR	PWM0TH
	MOVIA	156
	MOVAR	PWM0TL
	
	;控制寄存器
	MOVIA	0x43	;01-0 0011 ;Fcpu/2
	MOVAR	PWM0C	;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
					;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
					;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
					;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位

	;PWM输出端口选择
	MOVIA	0x00	;--00 0000
	MOVAR	PWMPSCON;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
					;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
					;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	
	;PWM是能寄存器
	MOVIA	0x88	;1-00 1000
	MOVAR	PWM0EN	;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
					;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
					;Bit4：PWM1XEN:PWM1X输出控制位;				0=DIS,1=EN
					;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
					;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
					;Bit1：PWM0XEN:PWM0X输出控制位;				0=DIS,1=EN
					;Bit0：LOADEN:PWM重装使能(重装周期寄存器);	0=DIS,1=EN
					
	BCR		RP1		;goto bank0
	
	BCR		TP0IF
	BSR		TP0IE
	BSR		GIE
	RETURN
	
		
;***********************************************************
;12bit-MODE 无自动装载功能
;中断处理 需要重新赋初值
;config ：Fosc = 8M 8'
;示例程序：4ms
TP0_Mode_12bit_Time:

	BSR		RP1	;goto bank2
	
	;定时器周期寄存器
	MOVIA	0x00
	MOVAR	PWM0TH
	MOVIA	00
	MOVAR	PWM0TL
	
	;控制寄存器
	MOVIA	0xC0	;11-0 0000	;Fosc/8
	MOVAR	PWM0C	;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
					;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
					;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
					;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位

	;PWM输出端口选择
	MOVIA	0x00	;--00 0000
	MOVAR	PWMPSCON;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
					;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
					;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	
	;PWM是能寄存器
	MOVIA	0xA8	;1-10 1000
	MOVAR	PWM0EN	;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
					;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
					;Bit4：PWM1XEN:PWM1X输出控制位;				0=DIS,1=EN
					;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
					;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
					;Bit1：PWM0XEN:PWM0X输出控制位;				0=DIS,1=EN
					;Bit0：LOADEN:PWM重装使能(重装周期寄存器);	0=DIS,1=EN
					
	BCR		RP1	;goto bank0
	
	BCR		TP0IF
	BSR		TP0IE
	BSR		GIE
	RETURN

	
;***********************************************************
;3路PWM 独立输出
;带自动装载功能 
;输出管脚可以配置选择
;config：Fcpu =4M 2'
;PWM 周期 256us
TP0_Mode_3PWM:
	BSR		RP1	;goto bank2
	
	;PWM周期寄存器
	MOVIA	0x0F
	MOVAR	PWM0PH
	MOVIA	0x00
	MOVAR	PWM0PL
	
	;PWM0 占空比
	MOVIA	0x0F
	MOVAR	PWM0DH
	MOVIA	0x60
	MOVAR	PWM0DL
	
	;PWM01 占空比
	MOVIA	0x0F
	MOVAR	PWM0DTH
	MOVIA	0x10
	MOVAR	PWM0DTL
	
	;PWM1 占空比
	MOVIA	0x0F
	MOVAR	PWM1DH
	MOVIA	0x30
	MOVAR	PWM1DL	
	
	;控制寄存器
	MOVIA	0x43	;01-0 0011
	MOVAR	PWM0C	;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
					;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
					;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
					;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位

	;PWM输出端口选择
	MOVIA	0x00	;--00 0000	;PB2,PB1,PB0
	;MOVIA	0x35	;--11 0101	;PB3,PB4,
	MOVAR	PWMPSCON;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
					;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
					;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	
	;PWM是能寄存器
	MOVIA	0x9F	;1-01 1111
	MOVAR	PWM0EN	;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
					;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
					;Bit4：PWM1XEN:PWM1X输出控制位;				0=DIS,1=EN
					;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
					;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
					;Bit1：PWM0XEN:PWM0X输出控制位;				0=DIS,1=EN
					;Bit0：LOADEN:PWM重装使能(重装周期寄存器);	0=DIS,1=EN
					
	BCR		RP1	;goto bank0
	
	BCR		TP0IF
	BSR		TP0IE
	BSR		GIE
	RETURN

;***********************************************************
;函数名：BANK0_RAM_CLR
;***********************************************************
BANK0_RAM_CLR:
	MOVIA	0X3F
	MOVAR	040H
	MOVIA	0X7F
	MOVAR	FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	040H,1
	GOTO	BANK0_RAM_CLR_LOOP	
	RETURN

	
;***********************************************************
;函数名：DELAY
;传参：循环体调用次数
;返回值：
;功能：延时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
	
