;*****************************************************   
;Copyright (c) 2024, 苏州华芯微电子股份有限公司
;All rights reserved                                 
;
;文件名称: HS16P2811-INT
;摘    要: HS16P2811-INT功能演示
;INT 映射 PC1
;PC1外中断引脚接收外中断信号，接收到有效信号，PA6翻转；
;当前版本: 1.0                                      
;作    者: LBW
;完成日期: 2024.11.14
;*****************************************************   

;***********************************************************
;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
DELAY_US		EQU		040H
DELAY_MS_CNT	EQU		041H


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		;转到bank0	
	;CLRR	PIR1     	;清中断标志	
	BTRSS	INTIF
	GOTO	INT_BACK
	
	BCR		INTIF
	
	BSR		RP0		;转到bank1
	MOVIA	0x40
	XORAR	OPTIONR,R	;外中断边沿 切换
	BCR		RP0		;转到bank0	
	
	BTRSS	PC1	
	BCR		PA6
	BTRSC	PC1	
	BSR		PA6	
	
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS		;恢复STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0	;恢复ACC
	RETFIE
;//中断代码结束
;***********************************************************
;****INT function****
;PC1-input with Up_pull-避免浮空输入
;PA6 INT中断信号，（中断切换INT触发边沿）
INT_INIT:	
	BSR		RP0		;转到bank1
					
	MOVIA	02H			;--00 0010 
	MOVAR	TRISC		;TRISC(BANK1)
			;PORTC输入输出配置寄存器 (0-OUT;1-IN) 	
	BCR		RP0		;转到bank0
	
	MOVIA	0FDH		;--11 1101
	MOVAR	PCHCON		;PCHCON(BANK0)
			;内部上拉配置:1-DIS;0-EN
	
	BCR		INTIF
	BSR		INTIE		;睡眠INT唤醒，该位必须设置使能；
	
	BCR 	PEIE		;不用配置
	BSR 	GIE			;使能进入中断，不使能，SLEEP顺序执行
	RETURN
	
;***********************************************************
;系统寄存器和GPIO配置
;注意寄存器所在 bank 区域
;***********************************************************
MAIN_SETUP:	
	CALL	SYSTEM_INIT
	CALL	GPIO_INIT
	CALL	CLR_RAM
	
	CALL	INT_INIT
	
	MOVIA	100
	CALL	DELAY_MS
	;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	00H			;--00 0000 
	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:	
	CLRWDT	  		;清看门狗
	MOVIA	10
	CALL	DELAY_MS
	
	MOVIA	0X80 
	XORAR	PORTA,R
	
	MOVIA	0X01
	XORAR	PORTC,R
	
	GOTO	MAIN_LOOP		;主函数循环	 	
	
	
;***********************************************************
;函数名：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	
;***********************************************************
 