⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_nec.asm

📁 .ifnz I2C_SUPPORT ************************************************************** Function : fPro
💻 ASM
字号:
.ifnz IR_NEC

		lda		IR_PORT
		and		#IR_IN
		cmp		rIrBitStatus
		bne		lIrBitChange
		inc		rIrBitKeepLen			;;increase len
		lda		rIrBitKeepLen
		cmp		#IR_MAX_PULSE_LEN
		bcs		lAddHiByte				;;if len count > max -> from head
		jmp		lIrqIrExit

lAddHiByte:
		inc		rIrBitKeepLenH
		lda		rIrBitKeepLenH
		cmp		#IR_MAX_TWO_DATA_LEN
		bcc		lCheckFromHead			;;max count to 9
		;;clear repeat control bit
		stz		rIrBitKeepLenH
        stz		rRepValid				;;can't accept repeat code

lCheckFromHead:
		jmp		lIrDetectFromHead

lIrBitChange:

		;;IR bit is change
		sta		rIrBitStatus			;;keep now status
		tax								;;save on x
		jmp		lProcessIrState

;;--------------------------------------------------------------
SRAM_PG1:		.section				;;PAGE1 start
;;--------------------------------------------------------------

lProcessIrState:

		;;clear Hi-Byte counter
		stz		rIrBitKeepLenH

		;;do process according current state
		lda		rIrState
		cmp		#IR_CHK_HEAD
		bne		lContinueCheck
		jmp		lProcHeadCode

lContinueCheck:
		cmp		#IR_CHK_OFF
		bne		lCheckNextState00
		jmp		lProcOffCode

lCheckNextState00:
		cmp		#IR_CHK_ADDR_DAT
		beq		lProcAddrData

lCheckNextState01:
		jmp		lIrDetectFromHead

lProcAddrData:
		;;check the bit sign
		txa
		and		#IR_IN
		bne		lSignDetectIsHi001

		;;pervious sign is high
		lda		rIrBitKeepLen
		cmp		#IR_HI_PULSE			;;1680us
		bcs		lDataIsHi
		cmp		#IR_LOW_PULSE
		bcs		lDataIsLow
		jmp		lIrDetectFromHead

lDataIsLow:
		clc
		bcc		lToMakeIrData

lDataIsHi:
		sec

lToMakeIrData:
		rol		rIrReceiver
		rol		rIrReceiver+1
		rol		rIrReceiver+2
		rol		rIrReceiver+3
		bcs		lGetIrDataOk			;;check the last bit shift out ?
        jmp     lClearLenExit

lGetIrDataOk:
		bbs		4,IOP_DATA5_H,lSkipCheckData	;;iop[5] , bit 12

		;;check IR code is right?
		lda		rIrReceiver
		eor		rIrReceiver+1
		cmp		#$ff
		bne		lIrCodeErr

lSkipCheckData:
		;;check and save customer code
		;;lda		rIrReceiver+3
		;;sta		rRecIrCustCode+1		;;save customer code
		;;lda		rIrReceiver+2
		;;sta		rRecIrCustCode			;;save customer code
		;;cmp		rIrCustCode
		;;bne		lIrCodeErr
		;;lda		rIrReceiver+3
		;;cmp		rIrCustCode+1
		;;bne		lIrCodeErr

		;;save address code
		lda		rIrReceiver+3
		sta		IOP_DATA6_H
		lda		rIrReceiver+2
		sta		IOP_DATA6_L

		;;IR code is right
		bbs		4,IOP_DATA5_H,lGet16bitLow
		lda		rIrReceiver+1
		bra		lGetLastIrDataOk

lGet16bitLow:
		lda		rIrReceiver

lGetLastIrDataOk:
		sta		IOP_DATA5_L				;;save to IOP_DATA5_L

.if 0	;;standby mode code
		;;check power key
		lda		bCheckIRPower
		beq		lNotEqualIR
		lda		IOP_DATA5_L
		cmp		IRPowerCode
		bne		lNotEqualIR
		jmp		lResetAll

lNotEqualIR:
.endif

		lda		IOP_DATA5_H
		and		#!IR_REPEAT				;;clear repeat flag

lCheckTheReplaceFlag:
		bit		IOP_DATA5_H
		bpl		lPerviousNoKey
		ora		#IR_REPLACE				;;set replace flag
		bne		lSetReplaceFlagOk

lPerviousNoKey:
		and		#!IR_REPLACE			;;clear replace flag

lSetReplaceFlagOk:
		ora		#IR_READY				;;set ready flag
		sta		IOP_DATA5_H
		sta		rRepValid				;;can accept repeat code
		and		#$0f					;;reset repeat count
		sta		rIrRepeateRate
        jmp		lIrDetectFromHead

lSignDetectIsHi001:
		;;pervious sign is low
		lda		rIrBitKeepLen
		cmp		#IR_LOW_PULSE			;;560us
		bcs		lCheckNextPulse

lIrCodeErr:
		jmp		lIrDetectFromHead

lCheckNextPulse:
		jmp		lClearLenExit

;;**************************************************************
lProcHeadCode:

        ;;check the bit sign
        txa
        and     #IR_IN
        beq     lIrDetectFromHead       ;;0 is fail


        lda     rIrBitKeepLen
        cmp     #IR_HEAD_PULSE_LEN      ;;70~80 (9000us)
        bcc     lIrDetectFromHead

lHeadCodeIsRight:

        lda     #IR_CHK_OFF             ;;go next state
        sta     rIrState
        jmp     lClearLenExit

;;**************************************************************
lProcOffCode:

        ;;check the bit sign
        txa
        and     #IR_IN
        bne     lIrDetectFromHead       ;;1 is fail

        lda     rIrBitKeepLen
        cmp     #IR_OFF_PULSE_LEN       ;;35~40 (4500us)
        bcs     lOffCodeIsRight
        cmp     #IR_REP_PULSE_LEN       ;;20 ~22 (2500us)
        bcs     lOffCodeIsRepeat
        jmp     lIrDetectFromHead

lOffCodeIsRight:

        lda     #IR_CHK_ADDR_DAT        ;;go next state
        sta     rIrState

        ;;lda     #0
        stz     rIrReceiver+1
        stz     rIrReceiver+2
        stz     rIrReceiver+3

        lda     #1                      ;;32 bit = 0x00000001
        sta     rIrReceiver

        jmp     lClearLenExit

lOffCodeIsRepeat:

        lda     rRepValid               ;;if has code
        beq     lIrDetectFromHead

        lda     rIrRepeateRate
        bne     lNoAcceptRepeat

        lda     IOP_DATA5_H
        ora     #IR_REPEAT
        jmp     lCheckTheReplaceFlag

lNoAcceptRepeat:
        dec     rIrRepeateRate

        ;;detect from head
;;**************************************************************
lIrDetectFromHead:
        lda     #IR_CHK_HEAD            ;;process state from head code
        sta     rIrState
lClearLenExit:
        lda     #1
        sta     rIrBitKeepLen
.endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -