;*****************************************************   
;Copyright (c) 2024, 苏州华芯微电子股份有限公司
;All rights reserved                                 
;
;文件名称: HS16P2811-COMP
;摘    要: HS16P2811-COMP功能演示   PA1和VDD/4进行比较
;
;当前版本: 1.0                                      
;作    者: LBW      
;完成日期: 2024.11.16
;*****************************************************   

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

;W       EQU     0 
;F       EQU     1 
;A       EQU     0
;R       EQU     1

;***********************************************************
;用户IO定义
#define  OUT1		PORTA,2
#define  OUT2		PORTA,3

#define  KEY1		PORTC,2  
#define  KEY2		PORTC,3


;***********************************************************
;user general reg define
TEMP			EQU		020H
DELAY_US		EQU		040H
DELAY_MS_CNT	EQU		041H

COMP_MODE		EQU		042H
;AD_BUF_H		EQU		043H

RF_COUNT		EQU		044H
RF_DATA			EQU		045H

STATUS_BUF		EQU		07EH	;中断保护寄存器必须放 0x70-0x7F不要动！！！
ACC_BUF			EQU		07FH	;中断保护寄存器必须放 0x70-0x7F不要动！！！
;***********************************************************
;函数入口地址
	ORG	00H
	NOP
	NOP
	GOTO	MAIN_SETUP
	
;中断入口地址04H
	ORG		004H
	GOTO	INT_PRO
INT_PRO:
	MOVAR	ACC_BUF		;保存ACC
	SWAPR	STATUS,0
	MOVAR	STATUS_BUF	;保存STATUS
	
	BCR	RP0		;转到bank1
    BCR	RP1		;转到bank3	
	
	
	MOVIA	0xDB
	ANDAR	INTCON,1
	
	//CLRR    PIR1     ;清中断标志	  PIR
	BTRSS	C1IF
	GOTO	INT_BACK
	BCR		C1IF
	NOP                 ;触发比较器变化中断
	MOVIA	0x08
	XORAR	PORTA,1     ;PA3输出取反，作为提示
		
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS		;恢复STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0	;恢复ACC
	RETFIE
;//中断代码结束

;==========================================================================
;==========================================================================
COMP_INIT:
	MOVR	COMP_MODE,0
	ANDIA	0X07
	ADDAR	PCL,1
	GOTO	COMP_nPA1_pPA0
	GOTO	COMP_nPA1_pPC0_outPA2
	GOTO	COMP_nPA1_pPC0orPC1
	GOTO	COMP_nPA1orPA0_pPC0
	GOTO	COMP_nPA1orPA0or1V25_pCVREF
	GOTO	COMP_nPA1_pPA0
	GOTO	COMP_nPA1_pPA0
	GOTO	COMP_nPA1_pPA0
		
;==========================================================================
;* @ brief:	2路输入，【CMCH<2:0>=100】-端选接PA1；+端接PA0；
;* @ note: 负端PA1；正端PA0
;	C1IN-(PA1) -------	 |-╲	
;						 | △ ＞-C1OUT
;	C1IN+(PA0) -------	 |+╱
COMP_nPA1_pPA0:
;BCR	RP0;default-bank0
	MOVIA	0x03		;0000 0000;/-/PC2/PC1/PC0/  /PA3/PA2/PA1/PA0/  
	MOVAR	ADPCON		;(bank0)--PA1-PA0-
	
BSR		RP0		;转到bank1
	
	MOVIA	03H			;0000 0000 
	MOVAR	TRISA		;TRISA(BANK1)	;PORTA输入输出配置寄存器 (0-OUT;1-IN)
	
BSR	RP0		;转到bank1
BSR		RP1		;转到bank3	
	
	MOVIA	0x00
	MOVAR	VRCON		;(bank3)0000 0000
			;Bit7：VREN：内部参考电压 CVREF	;0-DIS, 1-EN
			;Bit6：VRR1：CVREF 范围高位	;0-LOW， 1-HIGH
			;Bit5：VRR0：CVREF 范围地位	;0-HIGH， 1-LOW
			;Bit4：VRS：比较器负端选择（CMCH<2:0>= 010）;0-比较器负端选择端口;1-比较器负端选择固定1.25v（±50mv）
			;B3~0: VR<3:0>：CVREF 值
			
	MOVIA	(0x04)		;-0-0 0100
	MOVAR	CMCON0		;(bank3)
			;Bit6：C1OUT：比较器 C1 输出结果
			;Bit4：C1INV：比较器 C1 输出极性;	0=normal,1=inv
			;Bit3：CIS：比较器输入切换(CMCH<2:0> = 011);=1- C1VIN-接PC0-√；=0- C1VIN-接PC1；
			;B2~0: CMCH<2:0>：比较器模式选择
				;000=关闭	//101=关闭	//111=关闭
				;001=3 路输入,-端可选		//010=+内部参考电压 CVREF，-端3路输入
				;011=3 路输入,+端可选		//100=2 路输入-√
				;110=带输出比较器，2 路输入	

	BCR	RP0		;转到bank1
BCR		RP1		

BCR		RP1		;转到bank1	
	BSR		C1IE
BCR		RP0		;转到bank0
	BCR		C1IF
	BSR		PEIE	;with
	BSR		GIE
	RETURN
	
	
;==========================================================================
;* @ brief:	2路输入，【CMCH<2:0>=110】-端选接PA1；+端接PC0；
;* @ note: 负端PA1；正端PC0；C1OUT输出到PA2
;	C1IN-(PA1) -------	 |-╲	
;						 | △ ＞--C1OUT
;	C1IN+(PC0) -------	 |+╱	|--PA2
COMP_nPA1_pPC0_outPA2:
;BCR	RP0;default-bank0
	MOVIA	0x12		;0000 0000;/-/PC2/PC1/PC0/  /PA3/PA2/PA1/PA0/  
	MOVAR	ADPCON		;(bank0)-PC0-PA1-
	
BSR		RP0		;转到bank1
	
	MOVIA	02H			;0000 0010 
	MOVAR	TRISA		;TRISA(BANK1)	;PORTA输入输出配置寄存器 (0-OUT;1-IN) 
				
	MOVIA	01H			;--00 0001 
	MOVAR	TRISC		;TRISC(BANK1)	;PORTC输入输出配置寄存器 (0-OUT;1-IN) 
	
;BSR	RP0		;转到bank1
BSR		RP1		;转到bank3	
	
	MOVIA	0x00
	MOVAR	VRCON		;(bank3)0000 0000
			;Bit7：VREN：内部参考电压 CVREF	;0-DIS, 1-EN
			;Bit6：VRR1：CVREF 范围高位	;0-LOW， 1-HIGH
			;Bit5：VRR0：CVREF 范围地位	;0-HIGH， 1-LOW
			;Bit4：VRS：比较器负端选择（CMCH<2:0>= 010）;0-比较器负端选择端口;1-比较器负端选择固定1.25v（±50mv）
			;B3~0: VR<3:0>：CVREF 值
			
	MOVIA	(0x06)		;-0-0 0110
	MOVAR	CMCON0		;(bank3)取反输出；
			;Bit6：C1OUT：比较器 C1 输出结果
			;Bit4：C1INV：比较器 C1 输出极性;	0=normal,1=inv
			;Bit3：CIS：比较器输入切换
			;B2~0: CMCH<2:0>：比较器模式选择
				;000=关闭	//101=关闭		//111=关闭
				;001=3 路输入,-端可选		//010=+内部参考电压 CVREF，-端3路输入
				;011=3 路输入,+端可选		//100=2 路输入
				;110=带输出比较器，2 路输入	-√

BCR		RP1		;转到bank1	
	BSR		C1IE
BCR		RP0		;转到bank0
	BCR		C1IF
	BSR		PEIE	;with
	BSR		GIE
	RETURN	
	
	
;==========================================================================
;* @ brief:	3路输入，+端可选【CMCH<2:0>=011】-端选接PA1；+端接PC0；
;* @ note: 负端可选PA1；正端PC0roPC1
;	C1IN-(PA1) -------	 |-╲	
;						 | △ ＞-C1OUT
;  	C1IN+(PC0) -------	 |+╱	
;	C1IN+(PC1) ---/
COMP_nPA1_pPC0orPC1:
;BCR	RP0;default-bank0
	MOVIA	0x12		;0000 0000;/-/PC2/PC1/PC0/  /PA3/PA2/PA1/PA0/  
	MOVAR	ADPCON		;(bank0)-PC0-PA1-
	
BSR		RP0		;转到bank1
	
	MOVIA	02H			;0000 0000 
	MOVAR	TRISA		;TRISA(BANK1)	;PORTA输入输出配置寄存器 (0-OUT;1-IN) 
				
	MOVIA	01H			;--00 0100 
	MOVAR	TRISC		;TRISC(BANK1)	;PORTC输入输出配置寄存器 (0-OUT;1-IN) 
	
;BSR	RP0		;转到bank1
BSR		RP1		;转到bank3	
	
	MOVIA	0x00
	MOVAR	VRCON		;(bank3)0000 0000
			;Bit7：VREN：内部参考电压 CVREF	;0-DIS, 1-EN
			;Bit6：VRR1：CVREF 范围高位	;0-LOW， 1-HIGH
			;Bit5：VRR0：CVREF 范围地位	;0-HIGH， 1-LOW
			;Bit4：VRS：比较器负端选择（CMCH<2:0>= 010）;0-比较器负端选择端口;1-比较器负端选择固定1.25v（±50mv）
			;B3~0: VR<3:0>：CVREF 值
			
	MOVIA	(0x1B)		;-0-1 1011
	MOVAR	CMCON0		;(bank3)取反输出；
			;Bit6：C1OUT：比较器 C1 输出结果
			;Bit4：C1INV：比较器 C1 输出极性;	0=normal,1=inv
			;Bit3：CIS：比较器输入切换(CMCH<2:0> = 011);=1- C1VIN-接PC0-√；=0- C1VIN-接PC1；
			;B2~0: CMCH<2:0>：比较器模式选择
				;000=关闭	//101=关闭	//111=关闭
				;001=3 路输入,-端可选			//010=+内部参考电压 CVREF，-端3路输入
				;011=3 路输入,+端可选-√			//100=2 路输入
				;110=带输出比较器，2 路输入	

BCR		RP1		;转到bank1	
	BSR		C1IE
BCR		RP0		;转到bank0
	BCR		C1IF
	BSR		PEIE	;with
	BSR		GIE
	RETURN	
	
	
;==========================================================================
; @ brief:	3路输入，-端可选【CMCH<2:0>=001】-端选接PA0；+端接PC0；
; @ note: 负端可选PA1orPA0；正端PC0
;	C1IN-(PA1)\---\
;	C1IN-(PA0)\	------	 |-╲	
;						 | △ ＞-C1OUT
;   C1IN+(PC0) -------	 |+╱
COMP_nPA1orPA0_pPC0:	
;BCR	RP0;default-bank0
	MOVIA	0x11		;0000 0000;/-/PC2/PC1/PC0/  /PA3/PA2/PA1/PA0/  
	MOVAR	ADPCON		;(bank0)-PC0-PA0-
	
BSR		RP0		;转到bank1
	
	MOVIA	01H			;0000 0000 
	MOVAR	TRISA		;TRISA(BANK1)	;PORTA输入输出配置寄存器 (0-OUT;1-IN) 
				
	MOVIA	01H			;--00 0100 
	MOVAR	TRISC		;TRISC(BANK1)	;PORTC输入输出配置寄存器 (0-OUT;1-IN) 
	
;BSR	RP0		;转到bank1
BSR		RP1		;转到bank3	
	
	MOVIA	0x00
	MOVAR	VRCON		;(bank3)0000 0000
			;Bit7：VREN：内部参考电压 CVREF	;0-DIS, 1-EN
			;Bit6：VRR1：CVREF 范围高位	;0-LOW， 1-HIGH
			;Bit5：VRR0：CVREF 范围地位	;0-HIGH， 1-LOW
			;Bit4：VRS：比较器负端选择（CMCH<2:0>= 010）;0-比较器负端选择端口;1-比较器负端选择固定1.25v（±50mv）
			;B3~0: VR<3:0>：CVREF 值
			
	MOVIA	(0x09)		;-0-0 1001
	MOVAR	CMCON0		;(bank3)
			;Bit6：C1OUT：比较器 C1 输出结果
			;Bit4：C1INV：比较器 C1 输出极性;	0=normal,1=inv
			;Bit3：CIS：比较器输入切换(CMCH<2:0> = 001);=1- C1VIN-接PA0-√；=0- C1VIN-接PA1；
			;B2~0: CMCH<2:0>：比较器模式选择
				;000=关闭	//101=关闭			//111=关闭
				;001=3 路输入,-端可选-√			//010=+内部参考电压 CVREF，-端3路输入
				;011=3 路输入,+端可选			//100=2 路输入
				;110=带输出比较器，2 路输入	

BCR		RP1		;转到bank1	
	BSR		C1IE
BCR		RP0		;转到bank0
	BCR		C1IF
	BSR		PEIE	;with
	BSR		GIE
	RETURN	
	
	
;==========================================================================
;* @ brief:	+内部参考电压 CVREF，-端3路输入【CMCH<2:0>=010】-端选接PA1；+端接CVREF；
;* @ note: 负端可选PA1orPA0or1V25；正端CVREF
;	C1IN-(1V25)\--\
;	C1IN-(PA1)\---\
;	C1IN-(PA0)\-------	 |-╲	
;						 | △ ＞-C1OUT
;	CVREF ------------	 |+╱
COMP_nPA1orPA0or1V25_pCVREF:
;BCR	RP0;default-bank0
	MOVIA	0x02		;0000 0000;/-/PC2/PC1/PC0/  /PA3/PA2/PA1/PA0/  
	MOVAR	ADPCON		;(bank0)-PA1-
	MOVR	ADPCON,0
	MOVAR	076H
BSR		RP0		;转到bank1
	
	MOVIA	02H			;0000 0010 
	MOVAR	TRISA		;TRISA(BANK1)	;PORTA输入输出配置寄存器 (0-OUT;1-IN) 
	
;BSR	RP0		;转到bank1
BSR		RP1		;转到bank3	
	
	MOVIA	0x80
	MOVAR	VRCON		;(bank3)0000 0000
			;Bit7：VREN：内部参考电压 CVREF	;0-DIS, 1-EN
			;Bit6：VRR1：CVREF 范围高位	;0-LOW， 1-HIGH
			;Bit5：VRR0：CVREF 范围地位	;0-HIGH， 1-LOW
			;Bit4：VRS：比较器负端选择（CMCH<2:0>= 010）;0-比较器负端选择端口;1-比较器负端选择固定1.25v（±50mv）
			;B3~0: VR<3:0>：CVREF 值
				;VRR<1:0>=01:CVREF=(VR<3:0>/24)*VDD
				;VRR<1:0>=00:CVREF=VDD/4+(VR<3:0>/32)*VDD
				;VRR<1:0>=11:CVREF=(VR<3:0>/17)*VDD
				;VRR<1:0>=10:CVREF=0.32*VDD+(VR<3:0>/25)*VDD
			
	MOVIA	(0x02)		;-0-0 0010
	MOVAR	CMCON0		;(bank3)
			;Bit6：C1OUT：比较器 C1 输出结果
			;Bit4：C1INV：比较器 C1 输出极性;	0=normal,1=inv
			;Bit3：CIS：比较器输入切换(CMCH<2:0> = 010);=1- C1VIN-接PA0；=0- C1VIN-接PA1-√；
			;B2~0: CMCH<2:0>：比较器模式选择
				;000=关闭	//101=关闭			//111=关闭
				;001=3 路输入,-端可选			//010=+内部参考电压 CVREF，-端3路输入-√
				;011=3 路输入,+端可选			//100=2 路输入
				;110=带输出比较器，2 路输入	

BSR	RP0		;转到bank1
BCR		RP1		;转到bank3	


	BSR		C1IE
BCR		RP0		;转到bank0
	BCR		C1IF
	BSR		PEIE	;with
	BSR		GIE
	BCR	RP0		;转到bank1
BCR		RP1		;转到bank3	
	
	RETURN	
;==========================================================================
;主程序开始
;***********************************************************
;系统寄存器和GPIO配置
;注意寄存器所在 bank 区域
;***********************************************************
MAIN_SETUP:	
	CALL	SYSTEM_INIT
	CALL	GPIO_INIT
	CALL	CLR_RAM
	
	MOVIA	100
	CALL	DELAY_MS
	
	MOVIA	0x04
	MOVAR	COMP_MODE
	CALL	COMP_INIT
	
	BCR		RP0		;转到bank0
	GOTO	MAIN_LOOP
	
;***********************************************************
SYSTEM_INIT:
	BSR		RP0		;转到bank1
	CLRR	20H		;bank1-20H地址 RAM 清0
	MOVIA	000H		;-0-- ----
	MOVAR	OPTIONR		;OPTIONR(BANK1)
			;Bit6：INTEDG：外部中断触发方式选择位（PC1）;0-falling edge, 1-rising edge
			;Bitn：无关位仿真须写0
	
	MOVIA	0A0H		;101- ----   	
	MOVAR	PCON		;PCON(BANK1)(芯片控制寄存器)
			;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
			;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
			;Bitn：无关位仿真须写0
	
	MOVIA	000H		;-0-- ---0 
	MOVAR	PIE1		;PIE1(BANK1)
			;Bit6:ADCIE ADC中断使能位
			;Bit0:T1IE 定时器T1中断使能位 
			;Bitn：无关位仿真须写0
			
	MOVIA	000H		;---- -0-0
	MOVAR	PIE2		;PIE2(BANK1)
			;Bit1:T3IE 定时器T3中断使能位
			;Bit2:T4IE 定时器T4中断使能位
			;Bit5:C1IE 比较器C1中断使能位
			;Bitn：无关位仿真须写0
			
	BCR		RP0		;转到bank0
	
	MOVIA	000H		;00-0 0-00
	MOVAR	INTCON		;INTCON(BANK0)
			;bit7:GIE-全局中断使能位
			;bit6:PEIE-外设总中断使能位
			;bit4:INTIE-外部中断使能位(PC1)
			;bit3:PAIE-PORTA输入变化中断使能位
			;bit1:INTIF-外部中断标志位
			;bit0:PAIF-PORTA输入变化中断标志位	
			;Bitn：无关位仿真须写0
			
	MOVIA	000H		;---- -0-0
	MOVAR	PIR2		;PIR2(BANK0)
			;Bit1:T3IF-定时器T3溢出标志位,软件清0
			;Bit2:T4IF-定时器T4溢出标志位,软件清0
			;Bit5:C1IF-比较器C1输出变化时被置位,软件清0
			;Bitn：无关位仿真须写0
	
	MOVIA	000H		;-0-- ---0
	MOVAR	PIR1		;PIR1(BANK0)
			;Bit6:ADCIF-ADC转换完成标志位
			;Bit0:T1IF-T1溢出标志位 
			;Bitn：无关位仿真须写0
	RETURN
	
;***********************************************************
GPIO_INIT:	
	BSR		RP0		;转到bank1
	
	MOVIA	00H			;0000 0000 
	MOVAR	TRISA		;TRISA(BANK1)
			;PORTA输入输出配置寄存器 (0-OUT;1-IN) 
				
	MOVIA	04H			;--00 0100 
	MOVAR	TRISC		;TRISC(BANK1)
			;PORTC输入输出配置寄存器 (0-OUT;1-IN) 
				
	MOVIA	00H			;0000 0000 
	MOVAR	PAODCON		;PAODCON(BANK1)
			;开漏配置:1-EN;0-DIS
	
	MOVIA	0FFH		;1111 1111
	MOVAR	PAHCON		;PAHCON(BANK1)
			;内部上拉配置:1-DIS;0-EN
			
	MOVIA	0FFH		;1111 1111
	MOVAR	PADCON		;PADCON(BANK1)
			;内部下拉配置:1-DIS;0-EN
			
	MOVIA	00H			;0000 0000 
	MOVAR	WUACON		;WUACON(BANK1)
			;端口唤醒配置:1-EN;0=DIS

	BCR		RP0		;转到bank0

	CLRR	PORTA		;0000 0000	//端口输出赋值
	CLRR	PORTC		;--00 0000	//端口输出赋值
	
	MOVIA	0FFH		;--11 1111
	MOVAR	PCDCON		;PCDCON(BANK0)
			;内部下拉配置:1-DIS;0-EN
			
	MOVIA	0FFH		;--11 1111
	MOVAR	PCHCON		;PCHCON(BANK0)
			;内部上拉配置:1-DIS;0-EN
	
	RETURN
	
;***********************************************************
;函数名：清所有ram
;IRP:FSR7：00-BANK0 区间接寻址;01 = BANK1 区间接寻址
;***********************************************************
CLR_RAM:
	BCR		IRP
	MOVIA	0x5F  	;个数
	MOVAR	0x20  	;个数存放地址 
	MOVIA 	0x7F  	;REG从后往前 清理 
	MOVAR	FSR	
RAM_CLR_LOOP:	
	BSR		FSR,7	;bank1
	CLRR	INDF
	
	BCR		FSR,7	;bank0
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	20H,1
	GOTO	RAM_CLR_LOOP	
	RETURN
	
;***********************************************************
;main
;***********************************************************
MAIN_LOOP:	
	BCR	RP0		;转到bank1
    BCR	RP1
	
	CLRWDT	  		;清看门狗
	MOVIA	200
	CALL	DELAY
	
	
	BSR	RP0		;转到bank1
    BSR	RP1	
	
	BTRSS	CMCON0,6   ;;;判断比较器的比较结果
	GOTO	OUT_LOW
	BCR	RP0		
    BCR	RP1	
	BCR		PORTA,6
	GOTO	MAIN_LOOP
OUT_LOW:	
	BCR	RP0		
    BCR	RP1	
	BSR	   PORTA,6

	GOTO	MAIN_LOOP		;主函数循环	 


;***********************************************************



;***********************************************************
#define  TXD		PORTA,7
SEND_8BIT_RF:
	MOVAR	RF_DATA
	MOVIA	8
	MOVAR	RF_COUNT
SEND_8BIT_ADJ:
	BCR		TXD
	BTRSS	RF_DATA,7
	GOTO	SEND_BIT_0
	;GOTO	SEND_BIT_1
SEND_BIT_1:	
	BSR		TXD
	MOVIA	30
	CALL	DELAY
	BCR		TXD
	MOVIA	10
	CALL	DELAY
	GOTO	SEND_LOOP
SEND_BIT_0:
	BSR		TXD
	MOVIA	10
	CALL	DELAY
	BCR		TXD
	MOVIA	30
	CALL	DELAY
	;GOTO	SEND_LOOP
SEND_LOOP:
	RLR		RF_DATA,1
	DECRSZ	RF_COUNT,1
	GOTO	SEND_8BIT_ADJ
	RETURN
;***********************************************************
;函数名：DELAY
;传参：循环体调用次数
;返回值：
;功能：延时4个指令周期  Fcpu=4M时候延时1us，延时有误差
;引脚：
;备注：
;***********************************************************
DELAY:					
	MOVAR	DELAY_US	
DELAY_LOOP:	
	CLRWDT				;1;/清看门狗
	DECRSZ	DELAY_US,1	;1/(2)
	GOTO	DELAY_LOOP	;2	
	RETURN				;2	
	
	
	
;***********************************************************
;函数名：DELAY_MS
;传参：1-255ms
;返回值：
;功能：ms级延时
;引脚：
;备注：
;***********************************************************
DELAY_MS:					
	MOVAR	DELAY_MS_CNT		
DELAY_LOOP1:
	MOVIA	250
	CALL	DELAY
	CALL	DELAY
	CALL	DELAY
	CALL	DELAY
	DECRSZ	DELAY_MS_CNT,1	;1/(2)
	GOTO	DELAY_LOOP1	;2		
	RETURN				;2	
;***********************************************************
 