;//*****************************************************   
;//Copyright (c) 2025, 苏州华芯微电子股份有限公司
;//All rights reserved                                 
;//
;//文件名称: HS16P1886-RF_RECEIVE_1527
;//摘    要: HS16P1886-RF-RECEIVE_1527功能演示
;//  	    中断解码1527码型
;//
;//当前版本: 1.0                                      
;//作    者: 华芯微MCU组
;//完成日期: 2025.06.20
;//*****************************************************   

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

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

;***********************************************************
;用户IO定义
#define OUT      PORTB,0
#define RFIN     PORTB,1
#define OUT2     PORTB,2


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

LCODE           EQU     042H
MCODE           EQU     043H
HCODE           EQU     044H
REC_TMP         EQU     045H    ;防抖时间
REC_CNT         EQU     046H    ;测试脉冲计数
RELEASE_CNT     EQU     047H
HBIT            EQU     048H
LBIT            EQU     049H
FLAG1           EQU     04AH
FLAG            EQU     04BH
TIME_BASE	    EQU     04CH
DELAY_OUTSIDE	EQU		04DH
DELAY_INSIDE	EQU		04EH

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

;-------------------------------------------      
;标志位                    
;-------------------------------------------  
#define F_ONCE          FLAG,0
#define F_ACK           FLAG,1
#define F_LEARN_WAIT    FLAG,2
#define F_RF_OK         FLAG,3       
#define F_ON_OFF        FLAG,4       
#define F_RF_WIDTH      FLAG,5       
#define F_RF_LEVEL      FLAG,6       
#define F_GET_DATA      FLAG,7


#define F_KEY_SCAN      FLAG1,0
#define F_SHORT_KEY     FLAG1,1
#define F_LONG_KEY      FLAG1,2
#define F_KEY_DELETE    FLAG1,3       
#define F_DATA_EQU      FLAG1,4
#define F_FRAME         FLAG1,5         ;码型说明      
#define F_MODE          FLAG1,6

;***********************************************************
;/函数入口地址
	ORG	00H
	NOP
	NOP
	GOTO	MAIN_SETUP
	
;/中断入口地址04H
	ORG	04H
	GOTO	INT_PRO
	
TAB_REC:
    ANDIA    003H           ;@0xf
    ADDAR    PCL,R
    BCR      F_RF_WIDTH     ;0  
    RETURN                  ;1
    RETURN                  ;2
    BSR      F_RF_WIDTH     ;3 
    RETURN                  ;4	
	
	
INT_PRO:	
	MOVAR	ACC_BUF		;保存ACC
	SWAPR	STATUS,0
	MOVAR	STATUS_BUF	;保存STATUS
	BCR	STATUS,5
	BCR	STATUS,6
	;CLRR    INTFLAG         ;清中断标志	
TC0_JUDGE:
	BTRSS	TC0IF
	GOTO	TC0_JUDGE_END
	BCR	TC0IF
	
	MOVIA	206
	MOVAR	TC0L
	
	;MOVIA	0X04
	;XORAR	PORTB,R
	
TIME_BASE_JUDGE:	
	INCR	TIME_BASE,R 
	MOVIA	20
	SUBAR	TIME_BASE,A 
	BTRSS	C 
	GOTO	TIME_BASE_JUDGE_END
	CLRR	TIME_BASE
	BSR	F_KEY_SCAN	
TIME_BASE_JUDGE_END:		
;==================================================
;无线解码 2240 
;==================================================
RF_CHECK:               
        BSR     C
        BTRSS   RFIN
        BCR     C

        RLR     REC_TMP,R       ;接收电平信号左移
        MOVR    REC_TMP,A       ;
        CALL    TAB_REC         ;调表
        BTRSS   F_RF_WIDTH      ;接收无线到高低电平宽度标志
        GOTO    REC_LOW_LEVEL   ;接收低电平
REC_HIGH_LEVEL:
        BTRSS   F_GET_DATA
        GOTO    REC_HIGH_LEVEL_ON
        BCR     F_GET_DATA
        MOVIA   4              ;判断之前的低电平是否太短   
        SUBAR   LBIT,A
        BTRSS   C
        GOTO    REC_ERROR        
        MOVR    LBIT,A
        SUBAR   HBIT,A
        RRR     HCODE,R         ;24位数据左移
        RRR     MCODE,R         ;24位数据左移
        RRR     LCODE,R         ;24位数据左移        
        CLRR    HBIT
REC_HIGH_LEVEL_ON:        
        BSR     F_RF_LEVEL      ;无线电平标志
        INCR    HBIT,R          ;高电平加1
        MOVIA   60
        SUBAR   HBIT,A
        BTRSC   C               ;超过最大值，溢出      
        GOTO    REC_ERROR       ;超出范围，跳转
        CLRR    LBIT            ;清除低电平宽度暂存器
        GOTO    RF_CHECK_END    ;
        
REC_LOW_LEVEL:
        INCR    LBIT,R          ;低电平加1
        MOVIA   60              
        SUBAR   LBIT,A
        BTRSC   C               ;超过最大值，溢出   
        GOTO    REC_ERROR_L     ;低电平超出范围超出范围，跳转
        
        BTRSS   F_RF_LEVEL      ;无线电平标志
        GOTO    RF_CHECK_END    ;       
        BCR     F_RF_LEVEL      ;无线电平标志
        BSR     F_GET_DATA

        INCR    REC_CNT,R       ;接收码型的位数
        MOVIA   26
        SUBAR   REC_CNT,A
        BTRSC   C
        GOTO    REC_ERROR    

        MOVIA   4
        SUBAR   HBIT,A
        BTRSS   C
        GOTO    REC_ERROR       ;码宽太窄 出错   
        GOTO    RF_CHECK_END    ;返回主程序
REC_ERROR_L:
        MOVR    REC_CNT,A
        XORIA   25              ;判断是否为25个脉冲 
        BTRSC   Z
        GOTO    RF_CHECK_SUCCESS;25脉冲即为解码成功
        GOTO    REC_ERROR

RF_CHECK_END:                   ;等一帧码接完 
        GOTO    TC0_JUDGE_END 


;解码出错        
REC_ERROR:
        CLRR    REC_CNT         ;清接收码型位数
        CLRR    LBIT            ;清低电平宽度
        CLRR    HBIT            ;清高电平宽度
        BCR     F_RF_LEVEL      ;无线电平标志
        BCR     F_GET_DATA
        GOTO    TC0_JUDGE_END                  
;==================================================
;解码成功
;==================================================
RF_CHECK_SUCCESS:
        BCR     F_GET_DATA
        CLRR    REC_CNT        
        CLRR    HBIT
        CLRR    LBIT            
        CLRR    RELEASE_CNT
	
	BSR	F_RF_OK
	GOTO    TC0_JUDGE_END 
TC0_JUDGE_END:	


		
INT_BACK:	
	SWAPR	STATUS_BUF,0
	MOVAR	STATUS		;恢复STATUS
	SWAPR	ACC_BUF,1
	SWAPR	ACC_BUF,0	;恢复ACC
	RETFIE
;//中断代码结束
;==========================================================================
;主程序开始
MAIN_SETUP:	
;***********************************************************
;系统寄存器和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	02H		;--00 0010 :PORTB输入输出配置寄存器 (0-OUT;1-IN) 
	MOVAR	TRISB		;0-OUT, 1-IN  //PB0输出 PB1输入 
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H		;--00 0000 :PORTB变化中断唤醒寄存器 (1-EN;0=DIS)
	MOVAR	WUCON		;0-DIS, 1-EN
	
	MOVIA	000H
	MOVAR	INTEN1  ;Bit7 空	
                    ;Bit6 空
                    ;Bit5 空
                    ;Bit4 空	
                    ;Bit3 空	
                    ;Bit2 空 
                    ;Bit1 COMINTEN  端口比较器中断使能位
                    ;Bit0 空 
	
		;PBIC0(BANK1)(PORB驱动低电平控制寄存器)
		MOVIA	00H			;--00 0000 :
		MOVAR	PBIC0		;0-DIS, 1-EN
        
		;XTCON(BANK1)(外振模式控制寄存器)
		MOVIA	00H			;--00 0000 :
		MOVAR	XTCON		;
				;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	0FFH		;1111 ---- 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 1111 :PORTB上拉寄存器 (1-DIS;0-EN)
	MOVAR	PHCON		;0-EN, 1-DIS  
	
		;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
	 
	MOVIA	000H
	MOVAR	INTEN  		  
					  ;//Bit7 GIE 使能全局中断     1-使能 0-禁止	
					  ;//Bit6 空 
					  ;//Bit5 INT1IE 使能外部中断1 1-使能 0-禁止
					  ;//Bit4 TP0IE 使能T2溢出中断  1-使能 0-禁止
					  ;//Bit3 TC0IE 使能T1溢出中断 1-使能 0-禁止
					  ;//Bit2 INTIE 使能外部中断0  1-使能 0-禁止
					  ;//Bit1 PBIE 使能端口变化中断1-使能 0-禁止 
					  ;//Bit0 空 
	MOVIA	000H
	MOVAR	INTFLAG 	
					  ;//Bit7 空	
					  ;//Bit6 空 
					  ;//Bit5 INT1IF 外部中断1标志位
					  ;//Bit4 TP0IF T2溢出中断标志位	
					  ;//Bit3 TC0IF TC1溢出中断标志位		
					  ;//Bit2 INTIF 外部中断0标志位		
					  ;//Bit1 PBIF PA/PB输入状态变化中断标志位	
					  ;//Bit0 空 
		
	MOVIA	000H
	MOVAR	INTFLAG1 	
					  ;//Bit7 空	
					  ;//Bit6 空
					  ;//Bit5 空
					  ;//Bit4 空	
					  ;//Bit3 空	
					  ;//Bit2 空 
					  ;//Bit1 COMINTF 端口比较器翻转标志位， 软件复位
					  ;//Bit0 空 
	 
;TC0定时器初始化，50US进一次中断。
;Fcpu=4M/2;   TC0使用2分频 ,得时钟为1/1M   计时为50US
;计数值=50/1 = 50;   所以计数初值 = 256-50 = 206
	MOVIA	0XF0 
	MOVAR	TC0M  
		;Bit7 	TC0 启动控制位 1-开启 0-禁止
		;Bit6~Bit4：111  Fcpu/2 	
		;Bit3  TC0 时钟信号控制位   0 = Fcpu    1 = Fosc	
		;Bit2: TC0S16：TC0 溢出位选择； 0-8bit timer ；1-16bit timer
	MOVIA	206 
	MOVAR	TC0L    
	BSR	TC0IE ;   //定时器使能
	BCR	TC0IF ;   //定时器中断标识清零
	BSR	GIE;    //开总中断
;***********************************************************
;函数名：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
MAIN_LOOP:	
	CLRWDT	  		;清看门狗

KEY_SCAN_JUDGE:
	BTRSS	F_KEY_SCAN
	GOTO	KEY_SCAN_JUDGE_END
	BCR	F_KEY_SCAN
;--------------------------------------------------
;无线松键判断
;松键累加，1.024*150ms后清同一次按键标志
;--------------------------------------------------
RELEASE_JUDGE:
    INCR    RELEASE_CNT,R
    MOVIA   150
    SUBAR   RELEASE_CNT,A
    BTRSS   C
    GOTO    RELEASE_JUDGE_END
    CLRR    RELEASE_CNT
    BCR     F_ONCE   
RELEASE_JUDGE_END:



KEY_SCAN_JUDGE_END:
RF_JUDGE:
	BTRSS	F_RF_OK
	GOTO	RF_JUDGE_END
	BCR	F_RF_OK
	MOVIA   001H
    XORAR   PORTB,R
	BTRSC	F_ONCE	
	GOTO	KEY_COMMON
RF_ACTION:	
	
KEY_COMMON:
    BSR     F_ONCE
    CLRR    RELEASE_CNT
RF_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  
;***********************************************************
 		
			
			
			
			
			
			