;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS16F1200_SLEEP&GREEN	
;摘    要:
;
;当期版本:	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                    
;**************************************************** 
;//******************************************************************
;//进入SLEEP模式，所有时钟均停止工作；
;//进入GREEN模式，Fcpu停止运行，Fosc仍运行，
;	//<例如PWM输出配置时钟源选择Fosc，则此时PWM信号脚仍正常输出PWM波形，但指令停止运行！！！>
;//******************************************************************

;睡眠唤醒方式：
	;1.RESET 复位管脚config:<PB3配置成复位脚即可>
	;2.WDT溢出复位:<程序配置WDT，程序中不清狗，则WDT溢出就会复位>
	;3.INT、INT1中断管脚或者PB端口输入变化唤醒:<硬件配置好即可>
;主要;4.TC0溢出唤醒:<例程主要介绍>
	;5.COMP唤醒:<硬件配置好即可>
;***********************************************************
;files include
#include "HS16F1200.inc"


;***********************************************************
;user general reg define
DELAY_US	EQU		40H


;***********************************************************
;/函数入口地址
	ORG		00H
	GOTO	MAIN
	
;/中断入口地址
	ORG		04H
	
;/程序开始
;***********************************************************
;函数名：MAIN
;***********************************************************
MAIN:
	CALL	GPIO_init
	CALL	BANK0_RAM_CLR
	;SLEEP 唤醒 方式选择	;TC0 定时唤醒
	
MAIN_LOOP:
	CLRWDT
	CALL	TC0_SLEEP_SET
	
	COMR	PB,1	;翻转PA电平
	;MOVIA	200
	;CALL	DELAY	;延时2000个指令周期
	GOTO	MAIN_LOOP

;***********************************************************
;GPIO_init
;***********************************************************
TC0_SLEEP_SET:
	MOVIA	0x51
	MOVAR	TC0L	;TC0低8bit
		
	MOVIA	0x60
	MOVAR	TC0M	;Bit7：TC0TR:TC0 启动控制位。
					;Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
					;Bit3：TCCKS:TC0 时钟信号控制位
	
	CLRWDT	
	
	BCR		TC0IF
	BSR		TC0IE	;需要 使能
	BSR		TC0TR	;TC0 定时器使能
	BCR		GIE
	
	BSR		RP0
	BCR		WDTE	;bank1
	
	MOVIA	0X53
	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		RP0
	
	NOP
	SLEEP
	NOP
	
Wait_TC0_Weak:	
	BTRSS	TC0IF
	GOTO	Wait_TC0_Weak
	BCR		TC0IF
	
	CLRWDT
	BCR		TC0IE
	BCR		TC0TR
	
	BSR		RP0
	BSR		WDTE	;bank1
	
	MOVIA	0X40
	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		RP0
	
	RETURN
	
;***********************************************************
;函数名：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
	
;***********************************************************
;函数名：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
	
