;//*****************************************************   
;//Copyright (c) 2024, 苏州华芯微电子股份有限公司
;//All rights reserved                                 
;//
;//文件名称: HS16F1880-比较器
;//摘    要: HS16F1880-比较器功能演示
;//  	    使用内部1V基准与VDD 比较电压3.55V，发生中断后翻转PB0
;//
;//当前版本: 1.0                                      
;//作    者: 华芯微MCU组
;//完成日期: 2024.08.14
;//*****************************************************   

;***********************************************************
;files include
#include "HS16P1880.inc"
;***********************************************************
;用户IO定义
#define		OUT	PORTB,1
#define		IN	PORTB,0


;***********************************************************
;user general reg define
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不要动！！！
;***********************************************************
;/函数入口地址
	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	
	
	
COMP_INT:	
	BTRSS	FCOMINTF
	GOTO	INT_BACK
	BCR		FCOMINTF		;发生比较器中断就翻转
	MOVIA	01H
	XORAR	PB,1
	GOTO	INT_BACK
	

	
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS		;恢复STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0	;恢复ACC
	RETFIE
;//中断代码结束
	
	
CMPCON_INIT:


	;相关寄存器汇总
	;CMPCON 比较器控制寄存器
	;CMPM   比较器负端输入选择寄存器
	;COMINTF  端口比较器翻转标志位
	;COMINTEN 使能比较器中断 
	;比较器正端 PB0 / 1.0V / 0.1V 选择优先级如下：1.0V＞PB0＞0.1V。即同时使能情况下，正端选择为 1.0V。
	;若比较器输出极性不取反，则正端＞负端，比较器输出 1，中断使能可进中断；正端＜负端，则比较器输出 0，不进中断。
	;若比较器输出极性取反，则反之，正端＜负端，比较器输出 1，中断使能可进中断；正端＞负端，比较器输出 0，不进中断

	//BANK3
	BSR		STATUS,5		
	BSR		STATUS,6		
	


	;使用内部1V  基准
	MOVIA	0D4H		
	MOVAR	CMPCON
	
	;CMPCON = 0xD4;	
	
	
	;Bit7：CMPEN: CMP 使能位							1:使能								0:禁止
	;Bit6：CMPIF: 比较器转换标志					1:比较输出1					0:比较输出0
	;Bit5：FTCKS: 输出使能滤波时钟选择    1:低速时钟32K				0:系统时钟
	;Bit4：CODEB: 输出滤波								1:使能，3个时钟延迟		0:禁止
	;Bit3：CPEN+: 比较器+端设置  					1:使能,接PB0端口     0:禁止
	;Bit2：CVEN+: 比较器+端设置						1:使能,接内部1V基准		0:禁止
	;Bit1：COPOL: 比较器输出极性选择			1:取反

	; 比较VDD 3.55V
	
	MOVIA	011H		
	MOVAR	CMPM
	
	;CMPM = 0x11;	//0001 0000 //CMPCON'-'negative CONFIG[VDD]；XRVSEL=1；VRS<3:0>=0；(voltage of cmopare:4.69);
	;Bit7:XCV1EN+ 比较器+端设置						1:使能接内部0.1V			0:禁止
	;Bit6~Bit5：CPIINS[1:0]: 比较器负端输入选择;	00=VDD;01=PB4;10=禁止;11=PB1
	;Bit4：XRVSEL 比较电压点档位选择
	;Bit3~Bit0：负端电压档位选择

;内部1V基准
;负端电压档位选择		 		比较的电压点（V）
;VRS<3:0>						  XRVSEL=0					  XRVSEL=1
;	0000							1.00						1.00
;	0001							4.25						3.55
;	0010							4.00						3.35
;	0011							3.80						3.15
;	0100							3.60						3.00
;	0101							3.45						2.85
;	0110							3.25						2.75
;	0111							3.15						2.60
;	1000							3.00						2.50
;	1001							2.75						2.30
;	1010							2.40						2.00
;	1011							2.10						1.75
;	1100							1.90						1.60
;	1101							1.60						1.30
;	1110							1.40						1.15
;	1111							1.20						1.00

;使用内部0.1V 基准
;负端电压档位选择 比较的电压点（V）
;VRS<3:0>						  XRVSEL = 0				 XRVSEL = 1
;	0000							0.110						0.110
;	0001							0.470						0.390
;	0010							0.440						0.370
;	0011							0.420						0.350
;	0100							0.395						0.330
;	0101							0.380						0.315
;	0110							0.360						0.300
;	0111							0.345						0.285
;	1000							0.330						0.275
;	1001							0.305						0.255
;	1010							0.265						0.220
;	1011							0.234						0.195
;	1100							0.210						0.175
;	1101							0.175						0.145
;	1110							0.155						0.125
;	1111							0.130						0.110


	BCR		STATUS,6	;转到bank1
	BSR		INTEN1,1	;/INTEN1(中断屏蔽寄存器1)	0-DIS 1-EN
		
	BCR		STATUS,5	;转到bank0
	BCR		INTFLAG1,1	;清中断标志位
	BSR		INTEN,7     ;GIE
	RETURN



RETURN
;==========================================================================
;主程序开始
MAIN_SETUP:
	CALL	SYS_CPIO_INIT	;系统寄存器和GPIO配置
	CALL	CLR_ALL_RAM  	;清所有ram
	CALL	WDT_Init     	;看门狗初始化
	CALL	CMPCON_INIT		;比较器初始化
	CLRWDT					;清看门狗
	
MAIN_LOOP:
	;BTRSC	IN				;PB0 悬空清看门狗；接GND不清看门狗，以便测试看门狗复位时间。
	
	
; ;比较器处理小于比较电压不停翻转	
; COMP_HANDLE:
	; BSR		RP0	;BANK3
	; BSR		RP1	
	; BTRSC	CMPIF
	; GOTO    RESET_PB0
; TOGGLE_PB0:
	; BCR		RP0	;BANK0
	; BCR		RP1
	; MOVIA	01H
	; XORAR	PB,1			;PB0翻转
	; GOTO    COMP_HANDLE_END
; RESET_PB0:
 	; BCR		RP0  ;BANK0
	; BCR		RP1
	; BCR		PB0
; COMP_HANDLE_END:	
	
	
	CLRWDT	  				;清看门狗
	
	GOTO	MAIN_LOOP		;主函数循环

;***********************************************************
;函数名：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
