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

📄 yjred.c

📁 实现了对红外遥控器的解码及响应
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
//引脚定义
sbit CS = P0^2;//片选
sbit SID = P0^1;	//数据
sbit SCLK = P0^0;	//时钟
sbit BACKLIGHT = P1^0;   //背光
sbit POWER = P1^1;   //电源开关控制口

volatile unsigned long IRcode=0x00000000;  //32位的键代码
volatile unsigned int customcode=0x0000;      //16位用户码
volatile unsigned int time_us=0x0000;      //两个下降沿之间的时间
volatile unsigned char timeH,timeL;  //保存TH1 TL的值
unsigned char Lcustomcode=0x00;      //低8用户码
unsigned char Hcustomcode=0x00;     //高8
unsigned char datacode=0x00;    //8位键数据码
unsigned char Rdatacode=0x00;      //8位键数据反码
bit NewIRcode=0;  //指示当处理完了32位码后,就有了新的遥控码
bit DataRight=0;   //为1时读取数据正确

void init(void);
void lcdinit(void);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void SendByte(unsigned char dat);
void sendbyte(unsigned char bbyte);
void delay(unsigned int n) ;
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2);


void lcdinit(void)	//初始化LCD
{ CS=0;
  delay(100); //启动等待,等LCM讲入工作状态
  CS=1;
  BACKLIGHT=0;
  SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
  SendCMD(0x0C);//0000,1100  整体显示,游标off,游标位置off
  SendCMD(0x01);//0000,0001 清DDRAM
  SendCMD(0x02);//0000,0010 DDRAM地址归位
  SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}

void SendCMD(unsigned char dat)    //发送指令
{
     CS=1;
     SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
     CS=0;
}
void SendDat(unsigned char dat)    //发送数据
{
     CS=1;
     SendByte(0xFA);//11111,01,0 RW=0,RS=1
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
     CS=0;
}
void SendByte(unsigned char dat)   //发送字节
{
     unsigned char i;
     for(i=0;i<8;i++)
           {
                 SCLK=1;
                 if(dat&0x80) SID=1;else SID=0;
                 SCLK=0;
                 dat=dat<<1;
            }
}

void delay(unsigned int n)
{
  unsigned int i;
  for(i=0; i<n; i++) {;}
}


void display(unsigned char x_add,unsigned char dat1,unsigned char dat2){
     SendCMD(x_add);
     SendDat(dat1);
     SendDat(dat2);
}


void main(void)
{
 unsigned char i;
 ONOFF=1;
 lcdinit();
  init(); //定时器,中断初始化
     for(i=0;i<10;i++)
     {
           delay(100);
           display(0x82,0xbd,0xf5);//锦
           display(0x83,0xcd,0xbc);//图
           display(0x84,0xca,0xfd);//数
           display(0x85,0xc2,0xeb);//码
           SendCMD(0x00);
         }
    while(1)
  {
    if(NewIRcode==1)    //如果有新的遥控码就读
   {
    customcode=IRcode;    //取红外码中的用户码
    Lcustomcode=IRcode;   //取低8位用户码
    IRcode=IRcode>>8;
    Hcustomcode=IRcode;  //取高8位用户码
       IRcode=IRcode>>8;
    datacode=IRcode;      //取数据码
       IRcode=IRcode>>8;
       Rdatacode=IRcode;   //取数据码的反码
      if((customcode!=0xFF80)||(~Rdatacode!=datacode)) {DataRight=0;IRcode=0;} //校验用户码,反码
      else DataRight=1;
     NewIRcode=0; //读完之后清零,表示新码已读
    }
         if(datacode==0x58)// 播放/暂停/确定
        {
           display(0x92,0xbd,0xf5);//锦
           display(0x93,0xcd,0xbc);//图
        }
         if(datacode==0x1e)  //开机/关机
        {
         if(POWER==0)
         POWER=1;
         else POWER=0;
        }
        if(datacode==0x12)  //返回
        {
        }
        if(datacode==0x40)  //上一曲/上
        {
        }
        if(datacode==0x0c)  // 根据客户定义该键功能
        {
        }
        if(datacode==0x42) //  左/快退
       {
        }
        if(datacode==0x43) // 右/快进
        {
        }
        if(datacode==0x19) // 点播
        {
        }
        if(datacode==0x41)//  下一曲/下
        {
        }
        if(datacode==0x0d)//停止
        {
        }
        if(datacode==0x1c)//选台
        {
        }
        if(datacode==0x0b)//音量减
        {
        }
        if(datacode==0x0a)//音量加
        {
        }
  }
  }
void init(void)
{
  TMOD=0x11; //定时器0,工作方式1 ;  定时器1,工作方式1
  TCON=0x01; //外中断0下降沿触发,(包括TR1=0,TR0=0)
  TH1=0x00;  //初始化定时器1
  TL1=0x00;

  EA=1;    //开全中断
  ET0=1;   //开放T0中断
  ET1=1;      //开放T1中断
  EX0=1;   //开放INT0

}

//-------------------------------------interrupt0-------------------------------------
void IR_ISR() interrupt 0 using 1 //遥控器中断处理函数
{
  static unsigned char cn=0;

  TR1=0;
  timeH=TH1;
  timeL=TL1;
  TH1=0;
  TL1=0;
  TR1=1;

  time_us=(unsigned int)timeH;
  time_us=time_us<<8;
  time_us=time_us|timeL;

  if(time_us>24600&&time_us<25370) {cn=1;IRcode=0;}  //遇到引导码,就把cn清0,IRcode清0  13300 13700 12m


  if(cn<34)
  {
  if(time_us>1851&&time_us<2407) //0   12m:1000 1300
          {IRcode=IRcode|0x00000000; if(cn<33) IRcode=IRcode>>1;}

  else if(time_us>3703&&time_us<4537) //1   12:2000 2450
          {IRcode=IRcode|0x80000000;if(cn<33) IRcode=IRcode>>1;}
  }

  else if(time_us>20370&&time_us<21296) {IRcode=IRcode;}; //遇到重复码     12m: 11000  11500

   cn++;

  if(cn==34) {NewIRcode=1;TR1=0;}  //读完32位码,则有新码产生

}

//--------------------------------------timer_ISR------------------------------
void Timer0_ISR() interrupt 1 using 2  //定时器0中断函数
{
 //TR1=0;
 //TR1=1;
}
void Timer1_ISR() interrupt 3 using 3  //定时器1中断函数
{

}




⌨️ 快捷键说明

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