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

📄 xray.c

📁 HT6221,PT2221红外编码遥控器处理模块VER1.0 作 者: David Wang Email: wy94081@sina.com.cn
💻 C
字号:
/************************************************
 HT6221,PT2221红外编码遥控器处理模块VER1.0
 
全局调用变量:bit keyflag;            //按键标志
              unsigned char prekey ;  //返回按键值   
占用硬件资源:INT0

6MHZ晶振  CPU: 51系列  单指令周期:2us.

作 者: David Wang
Email:  wy94081@sina.com.cn
日 期: 2001年2月16日*************************************************/
#pragma code debug symbols
#include <reg51.h>
#include <intrins.h>
#include  "xray.h"

#define uchar unsigned char
#define uint unsigned int

#define MS108   0Xd2  //108ms
#define MS9R0   0X11  //9ms
#define MS4R5   0X08  //4.5ms
#define MS2R2   0x04  //2.24ms
#define MS1R6   0x03  //1.68ms
#define MSR56   0x01  //0.56ms

void ex0(void);
uchar GetL(void);
uchar GetH(void);

bit keyflag;
unsigned char prekey ;  //press key value 


/*********************************************
   中断函数 39KHZ 载波检测
**********************************************/
void ex0(void) interrupt 0 using 1
{
  uchar i,k,h,temp;
  unsigned char rec[4];
  
  EX0=0;
  k=GetL();
  if(k!=9) goto end;  /* 检测9ms */
  k=GetH();

  if(k==2)    /* 检测2.24ms 红外遥控器连续按键*/
   {              //置连续按键标志
    //keyflag=1;
    goto ddd;
    }

  if(k!=4) goto end;  /* 检测4.5ms 红外遥控器单次按键*/

  for(h=0;h<4;h++)        //读取键值
  {
    temp=0;
    for(i=0;i<8;i++)
    {
      GetL();
      k=GetH();
      if(k==1) temp++;
      if(i<7) temp<<=1;
      if(k==255) goto end;
      }
    rec[h]=temp;
   }
  if((rec[2]+rec[3])!=0xff) goto end;

  switch(rec[2])  //分析红外遥控键值
  {
     case 0xC1: prekey=KEYMODE;
                break;
     case 0x61: prekey=KEYESC;
                break;
     case 0x91: prekey=KEYENT;
                break;
     case 0x09: prekey=KEYADD;
                break;
     case 0x31: prekey=KEYSUB;
                break;
     default: goto end;
              break;
     }
   keyflag=1;
ddd:
   _nop_();
end:
   EX0=1;
}


/*********************************************

**********************************************/
uchar GetH(void)
{
  TH0=0;
  TL0=0;
  TR0=1;
  do
  {
    if(TH0>MS9R0) return(255); /* 脉宽>9ms */
   }while(INT0!=0);
  TR0=0;

  if(TH0==MS4R5) return(4);   //4.5ms
  if(TH0==MS2R2) return(2);   //2.24ms
  if(TH0==MS1R6) return(1);   //1.68ms
  if(TH0==MSR56) return(0);   //0.56ms

}


/*********************************************

**********************************************/
uchar GetL(void)
{
  TH0=0;
  TL0=0;
  TR0=1;
  while(INT0!=1);
  TR0=0;
  if(TH0<MS9R0) return(0); //判断9ms低电平
    else return(9);
}



⌨️ 快捷键说明

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