Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2012763
  • 博文数量: 356
  • 博客积分: 8284
  • 博客等级: 中将
  • 技术积分: 4580
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-15 20:25
个人简介

天行健,君子以自强不息

文章分类

全部博文(356)

文章存档

2018年(1)

2016年(4)

2015年(13)

2014年(14)

2013年(2)

2012年(25)

2011年(43)

2010年(65)

2009年(189)

分类: C/C++

2010-03-31 14:58:30


 //使用12M晶振 适用于TC9012芯片,其他芯片请自行更改解码时序
#include
#include
#include
////////////////////////////////////////////////
#define TURE 1
#define FALSE 0
////////////////////////////////////////////////
sbit IR=P3^2;//红外接口标志,仅此一根数据线
//数码管断码
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
////////////////////////////////////////////
unsigned char  irtime;//红外用全局变量
bit irpro_ok,irok;//分别为处理完标志,
unsigned char IRcord[4];
unsigned char   irdata[33];
//////////////////////////////////////////////
void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
////////////////////////////////////////////////////////////////// 
void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
  irtime++;
}
///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
  static unsigned char  i;
  static bit startflag;
 if(startflag)
 {
  
    if(irtime<42&&irtime>=33)//引导码 TC9012的头码
            i=0;
    
      irdata[i]=irtime;//一次存储32位电平宽度
      irtime=0;
      i++;
       if(i==33)
         {
       irok=1;   //红外接收完毕标志
     i=0;
      }
          }
 
    else
  {irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器0初始化
{
  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00;//reload value
  TL0=0x00;//initial value
  ET0=1;//定时器0中断溢出允许
  TR0=1;//允许T0计数
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
 IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
 EX0 = 1;   // Enable EX0 Interrupt,定时器0溢出中断允许
 EA = 1;    //开总中断
}
/****************************************************************/
/******************************************************************/
  void Ir_work(void)//红外键值散转程序
  {
       switch(IRcord[2])//判断第三个数码值
          {
    case 0:P0=dofly[1];break;//1 显示相应的按键值
    case 1:P0=dofly[2];break;//2
    case 2:P0=dofly[3];break;//3
    case 3:P0=dofly[4];break;//4
    case 4:P0=dofly[5];break;//5
    case 5:P0=dofly[6];break;//6
    case 6:P0=dofly[7];break;//7
    case 7:P0=dofly[8];break;//8
    case 8:P0=dofly[9];break;//9
    }
  
    irpro_ok=0;//处理完成标志
  }
/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;
  k=1;
  for(i=0;i<4;i++)//处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1
      {
             value=value|0x80;
   }
          else
      {
             value=value;
   }
          if(j<8)
      {
    value=value>>1;
   }
           k++;
         }
     IRcord[i]=value;
     value=0;    
     } irpro_ok=1;//处理完毕标志位置1
   
}
 

/////////////////////////////////////////////////////////////////
void main(void)
{
 EX0init(); // Enable Global Interrupt Flag
 TIM0init();//初始化定时器0
 P2=0x00;//1位数码管全部显示,开最高位数码管位选
 while(1)//主循环
   {
    if(irok)
   {  
    Ircordpro();//码值处理
     irok=0;
   }
    if(irpro_ok)//step press key
   {
    Ir_work();//码值识别散转
     }
   }
}
 

红外线+1602
//该程序使用LCD1602显示
#include
#include
#include

////////////////////////////////////////////////
#define TURE 1
#define FALSE 0

////////////////////////////////////////////////

sbit IR=P3^2;//红外接口标志
sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6;//Pin6

#define Data  P0    //数据端口

unsigned int hour,minute,second,count;
char code Tab[16]="0123456789ABCDEF";

char data TimeNum[]="                ";
char data Test1[]="                  ";

////////////////////////////////////////////

unsigned char  irtime;//红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char   irdata[33];
void ShowString (unsigned char line,char *ptr);

//////////////////////////////////////////////

void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);


////////////////////////////////////////////////////////////////
void Delay(unsigned char mS)//delay mS
{
 unsigned char us,usn;

 while(mS!=0)
  {
   usn = 4;
   while(usn!=0)
    {
     us=0xf0;
     while (us!=0) {us--;};
     usn--;
    }

   mS--;

  }
}


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

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
  irtime++;
}

///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
  static unsigned char  i;
  static bit startflag;

 if(startflag)
 {
  
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码
            i=0;
    
      irdata[i]=irtime;
      irtime=0;
      i++;
       if(i==33)
         {
       irok=1;
     i=0;
      }
          }
 
    else
  {irtime=0;startflag=1;}

}

////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00;//reload value
  TL0=0x00;//initial value
  ET0=1;//开中断
  TR0=1;
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
 IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
 EX0 = 1;   // Enable EX0 Interrupt
 EA = 1; 
}
/****************************************************************/

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

  void Ir_work(void)//红外键值散转程序
  {
      
       TimeNum[5] = Tab[IRcord[0]/16];
    TimeNum[6] = Tab[IRcord[0]%16];
    TimeNum[8] = Tab[IRcord[1]/16];
    TimeNum[9] = Tab[IRcord[1]%16];
    TimeNum[11] = Tab[IRcord[2]/16];
    TimeNum[12] = Tab[IRcord[2]%16];
    TimeNum[14] = Tab[IRcord[3]/16];
    TimeNum[15] = Tab[IRcord[3]%16];
 
       ShowString(1,TimeNum);

    irpro_ok=0;

  }

/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)//处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1
      {
             value=value|0x80;
   }
          else
      {
             value=value;
   }
          if(j<8)
      {
    value=value>>1;
   }
           k++;
         }
     IRcord[i]=value;
     value=0;    
     } irpro_ok=1;//处理完毕标志位置1
   
}

 

/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;/* Crystal frequency in 12MHz*/
 while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
  DelayUs(250);
  DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
 DelayMs(5);//short delay before operation
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
 DelayMs(5);   //short delay before operation
 E=0;
 RS=1;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
 RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
 else
    p=pos+0x80; //是第二行则命令代码高4位为0x8
 WriteCommand (p);//write command
 WriteData (c);   //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for (i=0;i<16;i++)
 ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
 DelayMs(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏

}


/////////////////////////////////////////////////////////////////

void main(void)
{
 EX0init(); // Enable Global Interrupt Flag
 TIM0init();

 InitLcd();//
 DelayMs(15);

sprintf(Test1," ");//the first line
 ShowString(0,Test1);

sprintf(TimeNum,"Code            ");//the second line
 ShowString(1,TimeNum);


 while(1)//主循环
   {
    if(irok)
   {  
    Ircordpro();
     irok=0;
   }

    if(irpro_ok)//step press key
   {
    Ir_work();
     }
   }
}
 

阅读(2353) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~