📄 c_decoder1527.c
字号:
//#include <pic.h>
//#include "EM78x156xx.h"
#include <C:\EMC\WicePlus\Example\EM78P156E\EM78x156xx.h>
//__CONFIG(INTOSCIO&MCLRDIS&BOREN&PWRTEN);//&CPD&CPROTECT);
#define D0 RC2
#define D1 RC1
#define D2 RC0
#define D3 RA2
#define VT RA1
#define RFIN RA3
#define LEARIN RA5
#define LEARNLED RA4
#define RESETIN RA3
#define LM RC5
//================================
#define MAX_SYNC 160//46
#define MIN_SYNC 100
#define MAX_DATA 16
#define MIN_DATA 2
#define DATA_HL 8
#define BITCNT 24
//================================
bit F_SYNC,F_OK,F_LEARN,PRE_H,F_ERROR;
unsigned char H_CNT,L_CNT,F_US;
unsigned char RX_BUF[3];
unsigned char BitCount,KEY_VALUE;
void InitialIO(void);
void RX_SUB(void);
void _intcall interrupt1(void) @ int 0
{
// PORTC=5;
}
/*
//backup C system
*/
/*
_asm
{
MOV A,0X10 // USE 1 BYTE C TYPE,C SYSTEM BACKUP
MOV 0X3C+1,A
MOV A,0X14
MOV 0X3B+1,A
MOV A,0X18
MOV 0X3A+1,A
MOV A,0X1B
MOV 0X39+1,A
MOV A,0X1C
MOV 0X38+1,A
}
*/
// Write your code (inline assembly or C) here
// ISR=0;
//restore C system
/*
_asm
{
MOV A,0X3C+1 // USE 1 BYTE C TYPE,C SYSTEM RESTORE
MOV 0X10,A
MOV A,0X3B+1
MOV 0X14,A
MOV A,0X3A+1
MOV 0X18,A
MOV A,0X39+1
MOV 0X1B,A
MOV A,0X38+1
MOV 0X1C,A
}
*/
//restore ACC,R3,R4
/*
_asm
{
SWAPA 0X3E ;restore R3
MOV 0X03,A
SWAPA 0X3F ;restore R4
MOV 0X04,A
SWAP 0X1F ;restore A
SWAPA 0X1F
}
}
*/
//interrupt ISR_time0 (void)
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
_asm
{
//save A --> 0x1F ; R3 --> 0x3E (ram bank 1); R4 --> 0x3F (ram bank 1)
MOV 0X1F,A ;backup A to 0x1F
SWAPA 0X04 ;backup R4 to 0x3F at bank 3
MOV 0X3F,A ;backup R4 to 0x3F at bank 3
SWAPA 0X03
MOV 0X3E,A ;backup R3 to 0x3E at bank 3
}
TCIF=0;
TMR0=212;
// PORTC^=0xf;
// if (!F_OK)
// RX_SUB();
// PORTC^=0x0f;
F_US=1;
_asm
{
SWAPA 0X3E ;restore R3
MOV 0X03,A
SWAPA 0X3F ;restore R4
MOV 0X04,A
SWAP 0X1F ;restore A
SWAPA 0X1F
}
}
void main(void)
{//OSCCAL=_READ_OSCCAL_DATA();
InitialIO();
F_OK=0;
F_ERROR=0;
F_SYNC=1;
L_CNT=0;
H_CNT=0;
PORTC=0x0;
//while(1);
//EEPROM_WRITE(0,55);
//while(1);
while(1)
{
if (F_US)
{F_US=0;
RX_SUB();
}
if (F_OK)
{
PORTC^=0x04;
F_OK=0;
}
}
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&*/
void InitialIO(void)
{
// CMCON=0x07;
TRISA=0x0f;//21; //all input
TRISC=0x00;
PORTC=0;
PORTA=0;
_asm
{
mov a,@0
contw
}
// OPTION=0x00;
TMR0=206;//-50;
INTCON=0x01;//20;
// GIE=1;
_asm
{
ENI
}
}
//=================================
void RX_SUB(void)
{if (RFIN) //如果输入是高
{
unsigned char temp;
// temp=PORTA;
// temp=0;
// D3=1; //in is H
// PORTC^=0x08;
if (PRE_H) //上次是高
{ //pre is High
H_CNT++;
if (F_SYNC)
{ //接收同步头
if (H_CNT>MAX_SYNC)
{
F_ERROR=1;
H_CNT=0;
F_SYNC=1;
}
}
else
{//接收数据段
if (H_CNT>MAX_DATA)
{
F_ERROR=1;
H_CNT=0;
F_SYNC=1;
}
}
}
else //上次是低
{ //pre is Low
// H_CNT++;
// PORTC^=0x08;
PRE_H=1;
if (F_SYNC)
{ //接收同步头
if ((L_CNT>MIN_SYNC)&&(L_CNT<MAX_SYNC))
{
F_ERROR=0;
L_CNT=0;
H_CNT=0;
F_SYNC=0;
BitCount=BITCNT;
// PORTC^=0x1;
// PRE_H=1;
}
else
{
F_ERROR=1;
H_CNT=0;
L_CNT=0;
F_SYNC=1;
BitCount=BITCNT;
}
}
else
{//接收数据段
if ((L_CNT>MIN_DATA)&&(L_CNT<MAX_DATA))
{//数据正确
if (L_CNT>DATA_HL)
{//data 0
_asm
{
bc 0x03,0;
// #endasm
} }
else
{//data 1
_asm
{
bs 0x03,0;
// #endasm
}
}
_asm
{
rlc _RX_BUF;//[0];
rlc _RX_BUF+1;//[0];
rlc _RX_BUF+2;//[0];
}
//_endasm
L_CNT=0;
H_CNT=0;
if (!(--BitCount))
{
F_OK=1;
F_ERROR=0;
F_SYNC=0;
BitCount=BITCNT;
// PORTC^=0x4;
}
// PORTC^=0x2;
// break;
}
else
{//数据错误
F_ERROR=1;
H_CNT=0;
F_SYNC=1;
BitCount=BITCNT;
}
}
}
}
else
{// PORTC^=0x08; //in is L
// PRE_H=0;
if (!(PRE_H)) //上次是低,本次也是低
{ //pre is High
L_CNT++;
if (F_SYNC)
{ //接收同步头
if (L_CNT>MAX_SYNC)
{
F_ERROR=1;
L_CNT=0;
H_CNT=0;
F_SYNC=1;
}
}
else
// if (!F_SYNC)
{//接收数据段
if (L_CNT>MAX_DATA)
{
F_ERROR=1;
H_CNT=0;
L_CNT=0;
F_SYNC=1;
BitCount=BITCNT;
}
}
}
else
{//上次是高,这次是低
PRE_H=0;
if (F_SYNC)
{//接收同步头段
L_CNT=0; //同步头开始
H_CNT=0;
}
else
{//接收数据段
L_CNT=0; //数据LOW段开始开始
// H_CNT=0;
}
// L_CNT=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -