2608|0

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TC9012红外遥控器的,请教高手 [复制链接]

弄不清楚为什么处理后的红外码液晶显示会是00 FF 数据码 数据码反码
而不是客服码、客服码、数据码、数据码反码

/*-----------------------------------------------
  名称:遥控器红外解码液晶显示
  但是------------------------------------------------*/
#include<reg52.h>  
#include<intrins.h>    //包含NOP空指令函数_nop_()和位移函数
#include<stdio.h>

#define uchar unsigned char
#define uint unsigned int
#define Data P0

sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit Lock=P3^7;
bit irok,irpro_ok;

char data TimeNum[]="                ";
char data Test1[]="                  ";
uchar data Tab[]="0123456789ABCDEF";
/******************************************************************/
/*                    变量声明                                    */
/******************************************************************/


uchar irtime;
uchar ircode[4];
uchar irdata[33];

/******************************************************************/
/*                    函数声明                                    */
/******************************************************************/
void Ir_work(void);
void Ircordpro(void);
void ShowString (unsigned char line,char *ptr);

/******************************************************************/
/*                    定时器0中断服务函数                         */
/******************************************************************/
void tim0_isr (void) interrupt 1 //定时器0中断服务函数
{
  irtime++;                             //用于计数2个下降沿之间的时间
}

/******************************************************************/
/*                    外部中断0函数                               */
/******************************************************************/
void ex0_isr (void) interrupt 0 //外部中断0服务函数
{
 static uchar i;
 static bit startflag;                //是否开始处理标志位
 if(startflag)
 {
  if(irtime>=25&irtime<60)   //9ms+4.5ms 
  {
   i=0;
  }
  irdata=irtime;
  irtime=0;
  i++;
  if(i==33)
  {
   irok=1;
   i=0;
  }
 }
 else
 {
  irtime=0;
  startflag=1;
 }  
}

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

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00; //重载值
  TL0=0x00; //初始化值
  ET0=1;    //开中断
  TR0=1;   
}

/******************************************************************/
/*                   外部中断初始化                               */
/******************************************************************/
void EX0init(void)
{
 IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
 EX0 = 1;   //使能外部中断
 EA = 1;    //开总中断
}

/******************************************************************/
/*                    红外键值处理                                */
/******************************************************************/
void Ir_work(void)        //红外键值散转程序
{
 TimeNum[5]=Tab[ircode[0]/16];
 TimeNum[6]=Tab[ircode[0]%16];

 TimeNum[8]=Tab[ircode[1]/16];
 TimeNum[9]=Tab[ircode[1]%16];

 TimeNum[11]=Tab[ircode[2]/16];
 TimeNum[12]=Tab[ircode[2]%16];

 TimeNum[14]=Tab[ircode[3]/16];
 TimeNum[15]=Tab[ircode[3]%16];
 ShowString(1,TimeNum);  

}
/******************************************************************/
/*                    红外解码函数处理                            */
/******************************************************************/
void Ircordpro(void)//红外码值处理函数
{
 uchar i,j,k,value,cord;
 k=1;
 for(i=0;i<4;i++)
 {
  for(j=0;j<8;j++)
  {
   cord=irdata[k];
   if(cord>5)
   {
    value=value|0x80;
   }
   else
   {
    value=value;
   }
   if(j<7)
   {
    value=value>>1;
   }
   k++; 
  }
  ircode=value;
  value=0;
 }
 
}

/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
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);//操作前短暂延时,保证信号稳定
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
}

/******************************************************************/
/*                   写入数据函数                                 */
/******************************************************************/
void WriteData(unsigned char c)
{
 DelayMs(5);  //操作前短暂延时,保证信号稳定
 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);//写命令
 WriteData (c);   //写数据
}

/******************************************************************/
/*                   写入字符串函数                               */
/******************************************************************/
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)
{
 InitLcd();
 TIM0init();
 EX0init();
 DelayMs(15);
 sprintf(Test1,"   my mcu      ");
 ShowString(0,Test1);
 
 sprintf(TimeNum,"code            ");
 ShowString(1,TimeNum);

 while(1)
 {
  if(irok)
  {
   Ircordpro();
   irok=0; 
   irpro_ok=1;
  }
 
  if(irpro_ok)
  {
   Ir_work();
   irpro_ok=0; 
  }
 }    
}

 

 

 

 

 

 


 

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表