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

📄 remote_drv.c

📁 atmel at89c51snd1c mp3芯片方案源码
💻 C
字号:

#include "config.h"                         /* lib configuration header */
#include "remote_drv.h"
#include "lib_mcu\timer\timer_drv.h"        /* timer driver definition */
#include "lib_mcu\lcd\lcd_drv.h" 
#include "lib_mcu\kbd\key_drv.h"            /* Keyboard driver definition */
#include <stdio.h>


INT8U  gl_rmt;
bit    gl_rmt_ok;

INT32U u32RmtValue;           /*用于存放接收到的遥控信号*/
INT8U  u8BitPoint;
INT8U  u8ReceiveEnd;



/////////////////////////////////////////////////////////////////////////////
void  remote_disable(void)    
{
  EX1 = 0;
}


/////////////////////////////////////////////////////////////////////////////
void  remote_enable(void)     
{
  u32RmtValue = 0;      //32bit receive value = 0
  u8ReceiveEnd = 0;     //not start to receive
  u8BitPoint = 0;       //bit point reset
  gl_rmt = 0xff;
  gl_rmt_ok = FALSE; 
  EX1 = 1;              //enable ext1 interrupt
}


/////////////////////////////////////////////////////////////////////////////
void t1_remote_init(void)
{
  T1_init(0,0,0x10);    //T1工作于方式1,16BIT计数器
  T1_start();           //开计数器1,用于判断遥控脉冲周期
  IT1 = 1;              //外部中断INT1管脚电平下降沿触发中断
  remote_enable();
}



/////////////////////////////////////////////////////////////////////////////
INT8U remote_value(void)
{
   INT8U u8Value;

   if(gl_rmt_ok == TRUE)
   {
      switch(gl_rmt)
	  {
		 case 0x90:  u8Value = REMOTE_0;      break;  
         case 0x00:  u8Value = REMOTE_1;      break;
         case 0x10:  u8Value = REMOTE_2;      break;
         case 0x08:  u8Value = REMOTE_3;      break;
         case 0x18:  u8Value = REMOTE_4;      break;
         case 0x04:  u8Value = REMOTE_5;      break;
         case 0x14:  u8Value = REMOTE_6;      break;
         case 0x0c:  u8Value = REMOTE_7;      break;
         case 0x1c:  u8Value = REMOTE_8;      break;
         case 0x80:  u8Value = REMOTE_9;      break;
         case 0x50:  u8Value = REMOTE_CHUP;   break;
         case 0x48:  u8Value = REMOTE_CHDN;   break;
         case 0x4c:  u8Value = REMOTE_MUTE;   break;
         case 0x40:  u8Value = REMOTE_POWN;   break;
         case 0x44:  u8Value = REMOTE_VOUP;   break;
         case 0x54:  u8Value = REMOTE_VODN;   break;
		 case 0xd8:  u8Value = REMOTE_CALL;   break;
		 case 0xcc:  u8Value = REMOTE_LUUP;   break;
		 case 0xdc:  u8Value = REMOTE_LUDN;   break;
         case 0x88:  u8Value = REMOTE_10UP;   break;
         case 0xe8:  u8Value = REMOTE_TIME;   break;
         case 0xec:  u8Value = REMOTE_NONE;   break;
         default :   u8Value = REMOTE_NONE;   break;
	  }
      remote_disable();
	  return (u8Value);
   }
   else
      return (0xff);
} 




//////////////////////////////////////////////////////////////////////////////////
Interrupt(remote_int(void), IRQ_INT1)
{
  INT8U  bTbit;
  INT8U  i;
  INT16U u16TimeValue;

  EX1 = 0;                  //关中断

  T1_stop();                //关定时器
  u16TimeValue = TH1;       //取定时器值
  u16TimeValue <<= 8;
  u16TimeValue += TL1;
  TH1 = 0x00;
  TL1 = 0x00;
  T1_start();               //开定时器  

  if((u16TimeValue > 1800)&&(u16TimeValue < 2200))
     bTbit = 1;
  else if((u16TimeValue > 900)&&(u16TimeValue < 1100))
     bTbit = 0;             //判断出得到的位是1还是0
     
  if(u8BitPoint < 32)
  {
    u32RmtValue += bTbit;
    u8BitPoint ++;
    u32RmtValue <<= 1;
  }
  else 
  {
	u8ReceiveEnd = 1; 
	u8BitPoint = 0;
  }

  if(u8ReceiveEnd == 1)     //收满4个字节的数据后,进行字节内容判断
  {
	for(i=0; i<16; i++)
	{
	   if((u32RmtValue & 0xff000000) == 0xe2000000)
	   {
		  gl_rmt = (u32RmtValue >> 16);
          gl_rmt_ok = TRUE; 
		  break;
	   }
	   else
	   {
		  u32RmtValue <<= 1;
	   }
 	} 
	u8ReceiveEnd = 0;
	u32RmtValue = 0;
  }

  EX1 = 1;    
}

⌨️ 快捷键说明

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