;//*****************************************************   
;//Copyright (c) 2025, 苏州华芯微电子股份有限公司
;//All rights reserved                                 
;//
;//文件名称: HS16P1886-GPIO
;//摘    要: HS16P1886-GPIO功能演示
;//  	    PB2检测到低电平，PB0输出高；PB2检测到高电平，PB0输出低；
;//         PB3检测到低电平，PB4输出低；PB3检测到高电平，PB4输出高；
;//当前版本: 1.0                                      
;//作    者: 华芯微MCU组
;//完成日期: 2025.06.20
;//*****************************************************   

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

;***********************************************************
;用户IO定义
#define  OUT1		PORTB,0
#define  OUT2		PORTB,4
#define  KEY1		PORTB,2  
#define  KEY2		PORTB,3


;***********************************************************
;user general reg define
DELAY_US	    EQU		040H
DELAY_MS_CNT	EQU		041H
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
	CLRR    INTFLAG         ;清中断标志	
	

	
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	
     CALL	CLR_ALL_RAM
MAIN_LOOP:	
	CLRWDT	  		;清看门狗
;PB2上拉，输入低时，OUT1翻转输出  输入高时，OUT1输出低
KEY1_JUDGE:
	BTRSC	KEY1
	GOTO	$+4
	MOVIA	0X01 
	XORAR	PORTB,R
	GOTO	KEY1_JUDGE_END

	BCR	OUT1
KEY1_JUDGE_END:
;PB3下拉，输入低时，OUT2输出低  输入高时，OUT2输出高
KEY2_JUDGE:
	BTRSS	KEY2
	GOTO	$+3
	BSR	    OUT2
	GOTO	KEY2_JUDGE_END
	BCR	    OUT2

KEY2_JUDGE_END:	
	GOTO	MAIN_LOOP		;主函数循环	 
;***********************************************************
;函数名：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				;2	
;***********************************************************
;函数名：DELAY_MS
;传参：1-255ms
;返回值：
;功能：ms级延时
;引脚：
;备注：
;***********************************************************
DELAY_MS:    
        MOVAR   DELAY_OUTSIDE 
;---------------------------
DELAY_LOOP:
        MOVIA   197
        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      
;***********************************************************


;***********************************************************
;函数名：BANK0_RAM_CLR ;清所有ram
;***********************************************************
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	
	BCR	STATUS,5	;保证转到bank0再操作PORTB
	BCR	STATUS,6
	RETURN
 ;***********************************************************
;系统寄存器和GPIO配置
;注意寄存器所在 bank 区域
;***********************************************************
SYS_CPIO_INIT:
	BSR	STATUS,5	;转到bank1
	BCR	STATUS,6
	;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
	;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	0CH		;--00 1100 :PORTB输入输出配置寄存器 (0-OUT;1-IN) 
	MOVAR	TRISB		;0-OUT, 1-IN  //PB0 PB1输出，PB3 PB2输入 
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H		;--00 0000 :PORTB变化中断唤醒寄存器 (1-EN;0=DIS)
	MOVAR	WUCON		;0-DIS, 1-EN
	
		;PBIC0(BANK1)(PORB驱动低电平控制寄存器)
		MOVIA	00H			;--00 0000 :
		MOVAR	PBIC0		;0-DIS, 1-EN
        
		;XTCON(BANK1)(外振模式控制寄存器)
		;MOVIA	00H			;--00 0000 :
		;MOVAR	XTCON		;与config同时有效 外置才生效
				;bit5: XTSEN1：外振软件增强使能位 1（与上位机配置共同控制） 0-en;1-dis
				;bit4: XTSEN0：外振软件增强使能位 0（与上位机配置共同控制） 0-en;1-dis
				;bit3: XTEN：外振软件使能位（与上位机配置共同控制）		 0-en;1-dis
				;bit2: XT_TC0S：TC0 低速时钟选择		0-内部低速时钟；1-外部32.768K 
				;bit1: XT_LRCS：低速模式系统时钟选择	0-dis ; 1-EN
				;bit0: XT_MONE：外振监测使能
	
	BCR	STATUS,5	;转到bank0
	BCR	STATUS,6
	;PDCON(BANK0)(内部下拉控制寄存器)
	MOVIA	07FH		;0111 ---- bit7:4 PORTB3:0下拉寄存器;1-DIS;0-EN
	MOVAR	PDCON		;0-EN, 1-DIS PB3开下拉
	
	;ODCON(BANK0)(PB漏极开路控制寄存器)
	MOVIA	00H		;--00 0000 :PORTB开漏寄存器 (1-EN;0-DIS)
	MOVAR	ODCON		;0-DIS, 1-EN
	
	;PHCON(BANK0)(PB 内部上拉控制寄存器)
	MOVIA	0FBH		;--11 1011 :PORTB上拉寄存器 (1-DIS;0-EN)
	MOVAR	PHCON		;0-EN, 1-DIS PB2开上拉
	
		;DRVC0(BANK0)(PB0 端口大驱动控制寄存器)
		MOVIA	0FFH		;---- -000 :
		MOVAR	DRVC0		;0-EN, 1-DIS
		
		;DRVC1(BANK0)(PB1 端口大驱动控制寄存器)
		MOVIA	0FFH		;---- -000 :
		MOVAR	DRVC1		;0-EN, 1-DIS
		
		;DRVC2(BANK0)(PB2 端口大驱动控制寄存器)
		MOVIA	0FFH		;---- -000 :
		MOVAR	DRVC2		;0-EN, 1-DIS
		RETURN
		
		