;//*****************************************************   
;//Copyright (c) 2024, 苏州华芯微电子股份有限公司
;//All rights reserved                                 
;//
;//文件名称: HS16P1880_SLEEP_TC0_WAKEUP 
;//摘    要: HS16P1880_SLEEP_TC0_WAKEUP功能演示  	    
;//          程序运行进入睡眠模式,TC0定时唤醒    FCPU=  16K/4=4KHZ    所以计一次数的时间为250US
;//          ;定时50MS唤醒一次睡眠              50000/250= 200；所以TCL=256-200=56 
;//测试功耗:3.6uA
;//当前版本: 1.0                                      
;//作    者: 华芯微MCU组
;//完成日期: 2024.08.14
;//*****************************************************   

;***********************************************************
;files include
#include "HS16P1880.inc"
;***********************************************************
;用户IO定义
#define		LED1	PORTB,0
;***********************************************************
;通用寄存器定义
DELAY_US		EQU		40H
DELAY_MS_CNT	EQU		41H
DELAY_OUTSIDE	EQU	042H
DELAY_INSIDE	EQU	043H




STATUS_BUF	EQU		07EH;中断保护寄存器必须放 0x70-0x7F不要动！！！
ACC_BUF		EQU		07FH;中断保护寄存器必须放 0x70-0x7F不要动！！！

;==================================
;常量定义
;==================================
SDA_OUTPUT      EQU     000H                                  
SDA_INPUT       EQU     040H 
;***********************************************************
;/函数入口地址
	ORG	00H
	NOP
	NOP
	GOTO	MAIN_SETUP
;***********************************************************
;/中断入口地址04H
	ORG	04H
	GOTO	INT_PRO
INT_PRO:	
	MOVAR	ACC_BUF		;保存ACC
	SWAPR	STATUS,0
	MOVAR	STATUS_BUF	;保存STATUS
	BCR		STATUS,5
	BCR		STATUS,6
;------------------------------------------------
	BTRSS	FTC0IF    ;TC0中断标志
	GOTO	INT_BACK
	BCR		FTC0IF
	
	MOVIA	0X01
	XORAR	PORTB,R
	
	MOVIA	56
	MOVAR	TC0L		;定时器初值
	
;------------------------------------------------
INT_BACK:   ;中断返回	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS		;恢复STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0	;恢复ACC
	RETFIE
;//中断代码结束
	

;==========================================================================
;系统初始化
MAIN_SETUP:
	CALL	SYS_CPIO_INIT	;系统寄存器和GPIO配置
	CALL	CLR_ALL_RAM  	;清所有ram
	CALL	WDT_Init     	;看门狗初始化
	CALL	TC0_8BIT_WAKEUP_INIT        ;端口变化中断初始化
	CLRWDT					;清看门狗
	BCR		STATUS,5		;保证转到bank0/2再操作PORTB
	BCR		STATUS,6
	
MAIN:;主函数循环
	CLRWDT	 
;----------------------------------------	
	CALL	SLEEP_SET  ;进入睡眠
;----------------------------------------
	GOTO	MAIN		
;***********************************************************
;函数名：SLEEP_SET
;功能：  进入睡眠,
;引脚：
;备注： 进入睡眠只需   “SLEEP” 一条指令即可
;       该函数进入睡眠之前，关闭看门狗，设置低速时钟作为系统时钟；  睡眠唤醒后，打开看门狗，时钟调为高速时钟作为系统时钟
;***********************************************************
SLEEP_SET:
	BSR		STATUS,5
	BCR		STATUS,6
	CLRR	PCON	;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
			;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
	
	
	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		STATUS,5
	BCR		STATUS,6
	NOP
	SLEEP
	NOP
;--------唤醒后，时钟改为高速RC时钟-----------------------------------
	RETURN

;***********************************************************
;函数名：TC0_8BIT_WAKEUP_INIT
;传参：
;返回值：
;功能：TC0 8位计数模式，计时时间设定为 50MS
;备注：睡眠唤醒时，TC0时钟必须选择FCPU;  绿色模式唤醒时，时钟选FOSC
 ;     FCPU=  16K/4=4KHZ    所以计一次数的时间为250US
;      ;定时50MS唤醒一次睡眠    50000/250= 200；所以TCL=256-200=56 
;***********************************************************
TC0_8BIT_WAKEUP_INIT:	
	MOVIA	56
	MOVAR	TC0L		;定时器初值
	MOVIA	0E0H		;1111 1000
	MOVAR	TC0M		;Bit7：TC0TR:TC0 启动控制位。
						;Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
						;Bit3：TCCKS:TC0 时钟信号控制位	
	
	BCR		FTC0IF     ;清中断标志
	BSR		FTC0IE     ;开TC0中断
	BSR		FGIE	   ;开总中断
	RETURN
;===========================================	
;***********************************************************
;函数名：SYS_CPIO_INIT
;注意寄存器所在 bank 区域
;***********************************************************
SYS_CPIO_INIT:

	BSR		STATUS,5	;转到bank1
	BCR		STATUS,6
	;OPTION_REG(BANK1)
	MOVIA	00CH		;0000 1100
	MOVAR	OPTION_REG	
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge		
	;PCON(BANK1)(芯片控制寄存器)
	MOVIA	0A0H		;101- ----   	
	MOVAR	PCON		;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
						;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
	
	;TRISB(BANK1)(I/O口PB控制寄存器)
	MOVIA	00H			;--00 0001 :PORTB输入输出配置寄存器 (0-OUT;1-IN) 
	MOVAR	TRISB		;0-OUT, 1-IN
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H			;--00 0000 :PORTB变化中断唤醒寄存器 (1-EN;0=DIS)
	MOVAR	WUCON		;0-DIS, 1-EN
	
	BCR		STATUS,5	;转到bank0
	BCR		STATUS,6
	;PDCON(BANK0)(内部下拉控制寄存器)
	MOVIA	0FFH		;---- --11 :bit3:0 PORTA3:0下拉寄存器; bit7:4 PORTB3:0下拉寄存器;1-DIS;0-EN
	MOVAR	PDCON		;0-EN, 1-DIS	
	
	;ODCON(BANK0)(PB漏极开路控制寄存器)
	MOVIA	00H			;--00 0000 :PORTB开漏寄存器 (1-EN;0-DIS)
	MOVAR	ODCON		;0-DIS, 1-EN
	
	;PHCON(BANK0)(PB 内部上拉控制寄存器)
	MOVIA	0FFH		;--11 1110 :PORTB上拉寄存器 (1-DIS;0-EN)
	MOVAR	PHCON		;0-EN, 1-DIS

	RETURN
	
;***********************************************************
;函数名：BANK0_RAM_CLR
;***********************************************************
CLR_ALL_RAM:
	MOVIA	0X3F
	MOVAR	40H
	MOVIA	0X7F
	MOVAR	FSR
	
RAM_CLR_LOOP:	
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	40H,1
	GOTO	RAM_CLR_LOOP
	RETURN
	
;***********************************************************
;函数名：DELAY
;传参：循环体调用次数
;返回值：
;功能：延时4个指令周期  Fcpu=4M时候延时1us，延时有误差
;引脚：
;备注：
;***********************************************************
DELAY:					
	MOVAR	DELAY_US	
DELAY_LOOP_US:	
	CLRWDT				;1;/清看门狗
	DECRSZ	DELAY_US,1	;1/(2)
	GOTO	DELAY_LOOP_US	;2	
	RETURN	
	
;***********************************************************
;函数名：DELAY_MS
;传参：1-255ms
;返回值：
;功能：ms级延时
;引脚：
;备注：
;***********************************************************
DELAY_MS:    
        MOVAR   DELAY_OUTSIDE 
;---------------------------
DELAY_LOOP:
        MOVIA   192
        MOVAR   DELAY_INSIDE
DELAY_LOOP_INSIDE:
        CLRWDT
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        DECRSZ  DELAY_INSIDE,R
        GOTO    DELAY_LOOP_INSIDE
        DECRSZ  DELAY_OUTSIDE,R
        GOTO    DELAY_LOOP        
DELAY_2US:       
        CLRWDT
        NOP    
        NOP
        NOP	
        NOP	
        NOP	
        RETURN     
	
	
;***********************************************************
;函数名：WDT_Init
;***********************************************************
/****WDT overflow reset，have no wakeup funtions****；
则看门狗复位时间仅由烧录配置：288ms；512ms；766ms；1024ms；
*/
WDT_Init:
	CLRWDT
	BSR		STATUS,5	;RP0;转到bank1
	BCR		STATUS,6
	;OPTION_REG(BANK1)
	MOVIA	00CH		;0000 1100
	MOVAR	OPTION_REG	
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge		
	;PCON(BANK1)(芯片控制寄存器)
	MOVIA	0A0H		;101- ----   	
	MOVAR	PCON		;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN						
						;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
						
	BCR		STATUS,5	;转到bank0
	BCR		STATUS,6
	RETURN














