;***********************************************************
;单    位:苏州华芯微电子有限公司     (2022)           	   * 
;                                                          *
;文件名称:	HS23P1820_TC0							       *
;摘    要:							   					   *
;当期版本:	V1.0                                           *
;作    者:	LvBuWei                                   	   *
;开始日期:  2022-08-27                                     *
;完成日期:                                                 *
;                                                          *
;先前版本:                                                 *
;作    者:                                                 *
;创始日期:                                                 *
;***********************************************************

;***********************************************************
;files include
#include "HS23P1820.inc"


A       EQU     00H
R       EQU     01H
;***********************************************************
;user general reg define
DELAY_US	EQU		040H
TC0_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	FTC0IF
	GOTO	INT_BACK
	BCR		FTC0IF
	
	;MOVIA	00H
	;MOVAR	TC0L
	
	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	BANK0_RAM_CLR
	CALL	GPIO_init
		
	MOVIA	0x00
	MOVIA	0x01
	MOVIA	0x02
	MOVAR	TC0_Mode
	CALL	TC0_INIT
	
MAIN_LOOP:
	CLRWDT

	MOVIA	0x02	
	XORAR	PORTB,1
	
	MOVIA	200
	CALL	DELAY	;延时2000个指令周期
	GOTO	MAIN_LOOP

;***********************************************************
;函数名：TMR0_INIT
;TMR0：定时器没有启动位一直运行中，分频可选，无自动装载
;***********************************************************
TC0_INIT:	
	MOVR	TC0_Mode,A	
	ANDIA	0x03
	ADDAR	PCL,R
	GOTO	TC0_Mode_8bit_Time
	GOTO	TC0_insideLow_8bit_Time
	GOTO	TC0_IRC_RTC
	GOTO	TC0_Mode_8bit_Time

;***********************************************************
;IRC&RTC
;若TC0使用RTC模式精准定时，则需将OSCM.2、OSCM.4置1，TC0M.3置0，
;并且配置字时钟选择: IRC&RTC。
;此时TC0时钟参与分频，Fcpu频率为32.768K/2，如选择Fcpu/2，则TC0时钟频率为（32.768K/2）/2。
TC0_IRC_RTC:
	MOVIA	00H
	MOVAR	TC0L	;定时器初值
	 	
	MOVIA	0A0H	;1010 0000
	MOVAR	TC0M	;Bit7：TC0TR:TC0 启动控制位。
					;Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
					;Bit3：TCCKS:TC0 时钟信号控制位	
		
	BSR		STATUS,5	;转到bank1
	MOVIA	0x14	;//-001 0100
	MOVAR	OSCM	
					//;Bit6：WAKEMODE：睡眠唤醒后系统时钟选择位;0=InsideLowRC,1=HighRC
					//;Bit5：GREENEN：绿色模式使能位		;0=GeneralMode，1=GreenMode
					//;Bit4：SLT0CON：TC0低速时钟控制位(用于唤醒睡眠、绿色);0=HighRC,1=LowRC
					//;Bit3：SLCON：内外低速时钟控制位	;0=OpenLowRC,1=CloseLowRC
					//;Bit2：XTSEL：内外低速选择位		;0=InsideLowRC,1=OutSideLowRC
					//;Bit1：STPHX：内部高速振荡器控制位	;0=Work,1=Stop
					//;Bit0：CLKMD：系统时钟模式控制位	;0=GeneralMode，1=LowMode
	BCR		STATUS,5	;转到bank1
	
	BCR		FTC0IF
	BSR		FTC0IE
	BSR		FGIE	
	
	RETURN
;***********************************************************
;TC0时钟源选择内部低速RC
TC0_insideLow_8bit_Time:
	MOVIA	00H
	MOVAR	TC0L	;定时器初值
	 	
	MOVIA	0F0H	;1111 0000
	MOVAR	TC0M	;Bit7：TC0TR:TC0 启动控制位。
					;Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
					;Bit3：TCCKS:TC0 时钟信号控制位	
		
	BSR		STATUS,5	;转到bank1
	MOVIA	0x10	;//-001 0000
	MOVAR	OSCM	
					//;Bit6：WAKEMODE：睡眠唤醒后系统时钟选择位;0=InsideLowRC,1=HighRC
					//;Bit5：GREENEN：绿色模式使能位		;0=GeneralMode，1=GreenMode
					//;Bit4：SLT0CON：TC0低速时钟控制位(用于唤醒睡眠、绿色);0=HighRC,1=LowRC
					//;Bit3：SLCON：内外低速时钟控制位	;0=OpenLowRC,1=CloseLowRC
					//;Bit2：XTSEL：内外低速选择位		;0=InsideLowRC,1=OutSideLowRC
					//;Bit1：STPHX：内部高速振荡器控制位	;0=Work,1=Stop
					//;Bit0：CLKMD：系统时钟模式控制位	;0=GeneralMode，1=LowMode
	BCR		STATUS,5	;转到bank1
	
	BCR		FTC0IF
	BSR		FTC0IE
	BSR		FGIE	
	RETURN	
	
;***********************************************************
;8bit-MODE 无自动装载功能
;中断处理 需要重新赋初值
;config:Fcpu 16M 8'
;示例程序：100us
TC0_Mode_8bit_Time:	
	MOVIA	00H
	MOVAR	TC0L		;定时器初值

	MOVIA	0F0H		;1111 0000
	MOVAR	TC0M		;Bit7：TC0TR:TC0 启动控制位。
						;Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
						;Bit3：TCCKS:TC0 时钟信号控制位	
	
	BCR		FTC0IF
	BSR		FTC0IE
	BSR		FGIE	
	RETURN
	

;***************************************************
;函数名：GPIO_init
;***************************************************
GPIO_init:
	BSR		STATUS,5	;转到bank1
	
	;OPTION_REG(BANK1)		
	MOVIA	0000H
	MOVAR	OPTION_REG	;/00-- -000	
						;/bit0~2:  	 PS2~PS0 预分频比率选择位
									;PS2~PS0 	WDT比率 
									;0 0 0		1:1
									;0 0 1		1:2 
									;0 1 0		1:4 
									;0 1 1		1:8 
									;1 0 0		1:16 
									;1 0 1		1:32 
									;1 1 0		1:64
									;1 1 1		1:128
						;/bit6:	INTEDG：外部中断触发方式选择位（PB0）
						;/bit7:	INT1EDG：外部中断 1 触发方式选择位（PB1）
						
	;/PCON(BANK1)(芯片控制寄存器)
	MOVIA	0A0H		;/101- ----
	MOVAR	PCON		;0-DIS 1-EN
					    ;/5bit:WDT	看门狗定时器使能位
						;/6bit:EIS: IOB0/INT引脚定义位
						;/7bit:LVDT	低电压复位使能位
	
	;TRISB(BANK1)(I/O口PB控制寄存器)
	MOVIA	00H			;--00 0000 			
	MOVAR	TRISB		;0-OUT, 1-IN
	
	;PBIC0(BANK1)(PA口驱动选择寄存器)		
	MOVIA	00H			;--00 0000
	MOVAR	PBIC0		;0-DIS, 1-EN
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H			;--00 0000
	MOVAR	WUCON		;0-DIS, 1-EN
	
	BCR		STATUS,5	;转到bank0
		
	;PDCON(BANK0)(内部下拉控制寄存器)
	MOVIA	0FFH		;1111 ----
	MOVAR	PDCON		;0-EN, 1-DIS	
	
	;ODCON(BANK0)(PB漏极开路控制寄存器)
	MOVIA	00H			;--00 0000
	MOVAR	ODCON		;0-DIS, 1-EN
	
	;PHCON(BANK0)(PB 内部上拉控制寄存器)
	MOVIA	0FFH		;--11 1111
	MOVAR	PHCON		;0-EN, 1-DIS
	
	RETURN

;***************************************************
;函数名：BANK0_RAM_CLR
;功能：清bank0
;***************************************************
BANK0_RAM_CLR:
	MOVIA	0X3F
	MOVAR	40H
	MOVIA	0X7F
	MOVAR	FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	40H,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
	
