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

📄 rf73c1.c

📁 以C语言和Java语言、嵌入式开发、算法实现为主
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************/
// pic c for rf301 at 20050715
// pic16f73 use 4.00MHz
// with rf73.asm
/***************************************/
#include <pic.h>
#include "f73m.h"
#include "rf73c.h"

/*=====================================*/
void inirf(void)
{
	CSR3=0;
	OLD_BUT=0;
	FLAGS=0;
	CSR1=0;
	CSR0=0;
	SREG==NORMAL;
}
/*-------------------------------------*/
//RF函数声明
/*-------------------------------------*/
void tst_learn(void);
void receive(void);
void tst_rtcc(void);
void tx_lookup(void);
void rot_shift(void);
void chk_pass2(void);
void ee_read1(void);
void decrypt(void);
void ee_write1(void);
void but_lookup(void);
void key_lookup(void);
void tx_lookup2(void);
void rotl(void);
void sendc(void);
void rotr(void);
void chk_timer(void);

/*=====================================*/
unsigned char rf_receive(void)
{
	OPTION=0x87;

#asm	// a1
	CLRWDT

	BTFSC	_SREG,2
	GOTO	M_LOOP2

	BTFSC	_FLAGS,7
	BCF	_O_RFLED

M_LOOP2

#endasm	// a1n

	tst_learn();
	receive();

	if(CARRY)	{goto	M_LOOP;}
	else
	{
#asm	// a2
	MOVLW	0FH
	ANDWF	_CSR7,F

	MOVF	_CSR7,W
	IORWF	_CSR6,W
	IORWF	_CSR5,W
	IORWF	_CSR4,W
#endasm	// a2n
	}

	if(ZERO)	{goto	M_LOOP;}
	else	{NOP();}
	chk_pass2();

	if(!ZERO)	{TXNUM=0;}
	else	{NOP();}
M_SERIAL:
	tx_lookup();
	asm("BSF	_ADDRESS,1");
	ee_read1();

#asm	// a3
	MOVF	_TMP1,W
	XORWF	_CSR5,W
#endasm	// a3n

	if(!ZERO)	{goto	M_SER_ERR;}
	else	{NOP();}
#asm	// a4
	MOVF	_TMP2,W
	XORWF	_CSR4,W
#endasm	// a4n

	if(!ZERO)	{goto	M_SER_ERR;}
	else	{NOP();}
	ADDRESS++;
	ee_read1();

#asm
	MOVF	_TMP1,W
	XORWF	_CSR7,W
#endasm

	if(!ZERO)	{goto	M_SER_ERR;}
	else	{NOP();}	asm("MOVF	_TMP2,W");
	asm("XORWF	_CSR6,W");
	if(!ZERO)	{goto	M_SER_ERR;}
	else	{NOP();}
	asm("MOVLW	0C9H");
	asm("XORWF	_SREG,W");
	if(ZERO)	{goto	CALC_KEY;}
	else	{NOP();}
	chk_pass2();
	if(ZERO)	{goto	M_HOP;}
	else	{NOP();}
	asm("MOVLW	5CH");
	asm("XORWF	_SREG,W");
	if(ZERO)	{goto	M_HOP;}
	else	{goto	RFRECIVE0;}
//=======
CALC_KEY:
	ETMP1=HOP1;
	ETMP2=CSR1;
	ETMP3=HOP3;
	ETMP4=CSR3;

	tx_lookup();
	asm("BSF	_ADDRESS,1");

	TMP1=CSR5;
	TMP2=CSR4;
	ee_write1();

	TMP1=CSR7;
	TMP2=CSR6;
	ee_write1();

	if(FLAGS&&0X20)	{DAT1=CSR7^0X2B;}
	else	{NOP();}	DAT1=CSR7^0X20;

	DAT2=CSR6;
	DAT3=CSR5;
	DAT4=CSR4;

NTQ_KEYGEN:
	FSR=KEY7;
	asm("MOVLW	(MAS_KEY-KEYBASE+7)");
	asm("MOVWF	_CNT1");
	CNT0=8;

	for(;CNT0>0;CNT0--)
	{
		asm("MOVF	_CNT1,W");
		key_lookup();
		asm("MOVWF	_INDF");
		FSR--;
		CNT1--;
	}
	OUTBYT=KEY0;
	KEY0=TMP1;
	TMP1=OUTBYT;

	decrypt();

	TMP1=CSR1;
	TMP2=HOP1;
	ee_write1();

	TMP1=CSR3;
	TMP2=HOP3;
	ee_write1();

	if(ADDRESS&&0X02)	{goto	S_SEED2;}
	else	{NOP();}// CALC_END
	HOP1=ETMP1;
	CSR1=ETMP2;
	HOP3=ETMP3;
	CSR3=ETMP4;

	CNT_HI=0;
	CNT_LW=0;

	goto	M_HOP;

S_SEED2:
	tx_lookup();
	asm("BSF	_ADDRESS,1");
	ee_read1();
	DAT3=TMP1;
	DAT4=TMP2;

	ADDRESS++;
	ee_read1();
	if(FLAGS&&0X02)	{DAT1=TMP1^0X65;}
	else	{NOP();}	DAT1=TMP1^0X60;
	DAT2=TMP2;

	ADDRESS++;
	ADDRESS++;
	ADDRESS++;

	goto	NTQ_KEYGEN;
//=======
M_SER_ERR:
	chk_pass2();
	if(ZERO)	{goto	RFRECIVE0;}
	else	{NOP();}
	TXNUM++;
	if(TXNUM<6)	{goto	M_SERIAL;}
	else	{NOP();}
	if(SREG^PASS1)	{goto	M_LOOP;}
	else	{NOP();}
	ADDRESS=1;
	ee_read1();

	TXNUM=TMP2&&0X07;

	if(TXNUM&&0X02)	{goto	CALC_KEY;}
	else	{NOP();}
	if(TXNUM&&0X01)
	{
		TXNUM=0;
		goto	CALC_KEY;
	}
	else	{NOP();}
M_HOP:

	tx_lookup();
	asm("BSF	_ADDRESS,2");

	ADDRESS+=3;
	FSR=KEY7;
	CNT2=3;
	for(;CNT2>0;CNT2--)
	{
		ee_read1();
		INDF=TMP1;
		FSR--;
		INDF=TMP2;
		FSR--;
		ADDRESS--;
	}
	ee_read1();

	decrypt();

	if(!SREG^PASS1)	{goto	M_SL_UPDATE;}
	else	{NOP();}
	chk_pass2();
	if(ZERO)	{goto	M_DIS;}
	else	{NOP();}
	if(!SREG^NORMAL)	{goto	M_DIS;}
	else	{NOP();}
	goto	RFRECIVE0;

M_SL_UPDATE:
	ADDRESS=1;
	ee_read1();

	TMP1=BUSY;
	TMP2=TMP2&&0X0F;
	if(TMP2>=6)	{TMP2=0;}
	else	{NOP();}
#asm	// a5
	SWAPF	_TXNUM,W
	IORWF	_TMP2,F
#endasm	// a5n

	ee_write1();
	but_lookup();
	asm("MOVWF	_ADDRESS");

	TMP1=CSR3;
	TMP2=DISC;

	ee_write1();

	TMP1=CSR1;
	TMP2=CSR0;

	tx_lookup();
	ee_write1();

	O_RFLED=0;
	SREG=PASS2;
	goto	M_RESYNC;

M_DIS:
	but_lookup();
	asm("MOVWF	_ADDRESS");
	ee_read1();
	chk_pass2();
	if(!ZERO)	{goto	M_DIS2;}
	else	{NOP();}
	if(!TMP1^CSR3&&0XF0)	{goto	RFRECIVE0;}
	else	{NOP();}
M_DIS2:
	if(TMP2^DISC)	{goto	M_CNT;}
	else	{NOP();}
	asm("BCF	_FLAGS,6");
	chk_pass2();
	if(ZERO)	{goto	RFRECIVE0;}
	else	{NOP();}
	goto	M_LOOP;

//=======
M_CNT:
	if(!FLAGS&&0X40)
	{
		TMP1=RAM_HI;
		TMP2=RAM_LW;
		goto	M_SUB;
	}
	else	{NOP();}
	tx_lookup();
	ee_read1();

	TMP3=TMP1;
	TMP4=TMP2;
	ADDRESS++;
	ee_read1();
	if((TMP1^TMP3))
	{
		if((TMP2^TMP4))
		{goto	M_SUB;}
		else	{NOP();}
	}
	else	{NOP();}
	goto	M_RESYNC;

M_SUB:

#asm	// a6
	MOVF	_TMP2,W
	SUBWF	_CSR0,W
	MOVWF	_TMP2
	SKPC
	INCF	_TMP1
	MOVF	_TMP1,W
	SUBWF	_CSR1,W
	MOVWF	_TMP1
#endasm	//a6n

	if(TMP1^TMP2)	{goto	M_TZERO;}
	else	{NOP();}
	if(!FLAGS&&0X40)	{goto	M_CHECK1;}
	else	{NOP();}
	asm("BCF	_FLAGS,6");
	asm("MOVF	_TMP1,W");
	if(ZERO)
	{
		if(TMP2&&0XFE)	{goto	M_UPDATE;}
		else	{NOP();}
	}
	else	{NOP();}
	chk_pass2();
	if(ZERO)	{goto	RFRECIVE0;}
	else	{NOP();}
	goto	M_LOOP;

M_CHECK1:
	if(TMP1&&0X80)	{goto	M_LOOP;}
	else	{NOP();}
	asm("MOVF	_TMP1,W");
	if(!ZERO)	{goto	M_RESYNC;}
	else	{NOP();}
	asm("MOVF	_TMP2,W");
	if(ZERO)	{goto	M_LOOP;}
	else	{NOP();}
	if(TMP2&&0XF0)	{goto	M_UPDATE;}
	else	{NOP();}
M_RESYNC:
	asm("BSF	_FLAGS,6");
	RAM_HI=CSR1;
	RAM_LW=CSR0;
	goto	M_LOOP;

M_UPDATE:
	tx_lookup();
	TMP1=CSR1;
	TMP2=CSR0;
	ee_write1();

	TMP1=CSR1;
	TMP2=CSR0;
	ee_write1();

	chk_pass2();
	if(ZERO)	{goto	M_PTR;}
	else	{NOP();}
	if(SREG^NORMAL)	{goto	M_BUT;}
	else	{NOP();}	goto	M_LOOP;

M_PTR:
	ADDRESS=1;
	ee_read1();

	TMP2=TMP2&&0X07;
	if(TXNUM^TMP2)	{TMP2++;}
	else	{NOP();}	if(TMP2>=6)	{TMP2=0;}
	else	{NOP();}	TMP1=0;

	ADDRESS=1;
	ee_write1();

	SREG=NORMAL;

//	LEARN_OK
	CNT_HI=0;
	CNT_LW=0;

LEARN_OK2:
	asm("CLRWDT");

	if(!TMR0&&0X80)	{goto		LEARN_OK2;}
	else	{NOP();}	asm("BCF	_TMR0,7");
	CNT_LW++;
	if(ZERO)	{CNT_HI++;}
	else	{NOP();}
	if(!CNT_LW&&0X02)	{O_RFLED=0;}
	else	{O_RFLED=1;}

	if(!CNT_LW&&0X80)	{goto	LEARN_OK2;}
	else	{goto	RFRECIVE0;}

M_BUT:
	asm("BCF	_FLAGS,7");

	but_lookup();
	asm("MOVWF	_ADDRESS");
	ee_read1();

#asm
	MOVF	_CSR3,w
	XORWF	_TMP1
	BTFSS	3,2

	MOVF	_CSR3,W
	MOVWF	_OLD_BUT

	MOVLW	0F0H
	ANDWF	_CSR3,F
	SWAPF	_CSR3,F

	BTFSC	_CSR3,0
	BSF	_CSR3,4
	CLRC

	RRF	_CSR3,W
	IORWF	_M_CODE,F
#endasm

M_TZERO:
	CNT_HI=0;
	CNT_LW=0;
	TMR0=0;

	goto	M_LOOP;

RFRECIVE0:
	CSR3=0;
	OLD_BUT=0;
	FLAGS=0;
	CSR1=0;
	CSR0=0;

	SREG=NORMAL;

M_LOOP:
	OPTION=0x8f;

//-------
	return	M_CODE;

}
/*=====================================*/
void tst_learn(void)
{
	asm("CLRWDT");

	if(!I_RFLRN)
	{
		CNT_HI=0;
		CNT_LW=0;
		while(!I_RFLRN)
		{
			tst_rtcc();

			if(CNT_HI&&0x01)
			{
				SREG=PASS1;
// NTQ_ERASE
				O_RFLED=1;
				ADDRESS=1;

				TMP1=0;
				TMP2=0;
				ee_write1();
				TXNUM=0;
				do
				{
					tx_lookup();
					asm("BSF	_ADDRESS,2");

					TMP1=0;
					TMP2=0;
					ee_write1();

					TMP1=0;
					TMP2=0;
					ee_write1();

					TXNUM++;

				}while(TXNUM-6>=0);
				O_RFLED=0;

				while(!I_RFLRN)
				{
					asm("CLRWDT");
				}
				asm("BCF	_CNT_HI,0");	// ?
			}
			else	{NOP();}
			O_RFLED=1;
		}
		if(CNT_LW>=2)	{return;}
		else
		{
			SREG=PASS1;
			return;
		}
	}
	else	{NOP();}
}
/*=====================================*/
void receive(void)
{
	asm("CLRWDT");

	asm("BCF	_FLAGS,5");
	if(!RFIN)	{goto	RMT_0;}
	else	{NOP();}
	for(CNT1=10;CNT1;--CNT1)
		for(CNT0=200;CNT0;--CNT0)
		{
			if(!RFIN)

⌨️ 快捷键说明

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