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

📄 c_decoder1527.c

📁 EMC单片机解码EV1527
💻 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 + -