📄 rf73c1.c
字号:
/***************************************/
// 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 + -