红外解码的问题

2019-03-24 18:59发布

请问各位,怎样实现红外遥控器同一按键重复利用,例如每次按音量+键,音量就增大一点。

以下是我调试的一个程序,四个数码管显示。上电开机时,系统启动,当按下一号键时

四个数码管亮起,开始计时工作,此时再按2号键,则计时停止,且第一个数码闪烁,这里

请教大家,如何实现再按一下2号键,第二个数码管闪烁,再按一下,第三个数码管闪烁?

我曾经试着用轻触式按键在调整时钟的时候,设置一个位或设置一个char 型的数来计数

以实现按键调节时分秒模式切换的原理来编程,但是好像在红外身上实现不了。

我这里除非另外定义一个按键,如3号键,来使得下一个数码管闪烁,这个就能实现。

请各位高手帮帮忙,谢谢!。
/*------------------------------------------------*/#include 
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口 段锁存sbit LATCH2=P2^3;//                 位锁存
unsigned char Count = 0,Count1=0 ;unsigned IRCOM[7];sbit IRIN = P3^2;         //红外接收器数据线  
unsigned char shi=0,fen=0,miao=0;
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Delay(unsigned int t); //函数声明void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------                    主函数------------------------------------------------*/
void delay2(unsigned char x)    //x*0.14MS{ unsigned char i;  while(x--) {  for (i = 0; i<13; i++) {} }}
void Time1_Init(){ TMOD|=0x10; IE = 0x88; TH1  = (65536-45872)/256; TL1  = (65536-45872)%256; TR1 = 1; }

void Time1_Int() interrupt 3{ TH1  = (65536-45872)/256; TL1  = (65536-45872)%256; Count1++; if(Count1==20) { Count1=0; miao++;
if(miao==60)
{   miao=0;   fen++; }
if(fen==60)
{   fen=0;   shi++; }
if(shi==24) {   shi=0; }
} }
/*---------------------------------------------------*/void IR_IN() interrupt 1 using 0{  unsigned char j,k,N=0;     EX0 = 0;    delay2(15); if (IRIN==1)      { EX0 =1;   return;  }                            //确认IR信号出现  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。    {delay2(1);}
 for (j=0;j<4;j++)         //收集四组数据 {   for (k=0;k<8;k++)        //每组数据有8位  {   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。     {delay2(1);}    while (!IRIN)          //等 IR 变为高电平     {delay2(1);}     while (IRIN)           //计算IR高电平时长      {    delay2(1);    N++;               if (N>=30) { EX0=1; return;}                  //0.14ms计数过长自动离开。      }                        //高电平计数完毕                     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”     N=0;  } }      if (IRCOM[2]!=~IRCOM[3])   { EX0=1;     return; }
   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
   if(IRCOM[5]>9)    { IRCOM[5]=IRCOM[5]+0x37;}   else  IRCOM[5]=IRCOM[5]+0x30;
   if(IRCOM[6]>9)    { IRCOM[6]=IRCOM[6]+0x37;}   else  IRCOM[6]=IRCOM[6]+0x30;      EX0=1;   }main(){  unsigned int i,k,j; unsigned char s=0; bit FlashFlag;//闪烁标志位 bit star;Time1_Init(); IE=0x89; TCON=0xc3;   IRIN=1;                    //I/O口初始化TR1=0;
while(1)      {        if(IRCOM[2]==0x01)     {       star=1;TR1=1;   TempData[0]=DuanMa[fen/10];TempData[1]=DuanMa[fen%10];   TempData[2]=DuanMa[miao/10];TempData[3]=DuanMa[miao%10];//分钟和秒在运转   Display(0,4);EX0 = 1;//IRCOM[0]=0xff;       
if(IRCOM[2]==0x02&&star==1)//当按键1已经按下后,按下2号键才有效
{   TR1=0;j++; 
 if(j==20)  //检测当前数值显示了一小段时间后,              //需要显示的数值,实现数据显示的变化     {  j=0;  FlashFlag=!FlashFlag;
}
 if(FlashFlag)    {         TempData=DuanMa[fen/10];      }  else    {     TempData=0;           }   //s为0,也就是第一个数码管闪烁     Display(0,4);//四个数码管亮起 



 }  
  } /*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535------------------------------------------------*/void Delay(unsigned int t){ while(--t);}/*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num)//这里数码管用的段选和位选都是74HC573{      unsigned char i;      for(i=0;i {       DataPort=0;   //清空数据,防止有交替重影       LATCH1=1;     //段锁存       LATCH1=0;       DataPort=WeiMa[i+FirstBit]; //取位码        LATCH2=1;     //位锁存       LATCH2=0;         DataPort=TempData;//DuanMa[q]; //取显示数据,段码       LATCH1=1;     //段锁存       LATCH1=0;          Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 }      
[ 本帖最后由 mianbaoyjttao 于 2012-5-28 00:10 编辑 ] 此帖出自小平头技术问答
请问各位,怎样实现红外遥控器同一按键重复利用,例如每次按音量+键,音量就增大一点。

以下是我调试的一个程序,四个数码管显示。上电开机时,系统启动,当按下一号键时

四个数码管亮起,开始计时工作,此时再按2号键,则计时停止,且第一个数码闪烁,这里

请教大家,如何实现再按一下2号键,第二个数码管闪烁,再按一下,第三个数码管闪烁?

我曾经试着用轻触式按键在调整时钟的时候,设置一个位或设置一个char 型的数来计数

以实现按键调节时分秒模式切换的原理来编程,但是好像在红外身上实现不了。

我这里除非另外定义一个按键,如3号键,来使得下一个数码管闪烁,这个就能实现。

请各位高手帮帮忙,谢谢!。
/*------------------------------------------------*/#include 
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口 段锁存sbit LATCH2=P2^3;//                 位锁存
unsigned char Count = 0,Count1=0 ;unsigned IRCOM[7];sbit IRIN = P3^2;         //红外接收器数据线  
unsigned char shi=0,fen=0,miao=0;
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Delay(unsigned int t); //函数声明void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------                    主函数------------------------------------------------*/
void delay2(unsigned char x)    //x*0.14MS{ unsigned char i;  while(x--) {  for (i = 0; i<13; i++) {} }}
void Time1_Init(){ TMOD|=0x10; IE = 0x88; TH1  = (65536-45872)/256; TL1  = (65536-45872)%256; TR1 = 1; }

void Time1_Int() interrupt 3{ TH1  = (65536-45872)/256; TL1  = (65536-45872)%256; Count1++; if(Count1==20) { Count1=0; miao++;
if(miao==60)
{   miao=0;   fen++; }
if(fen==60)
{   fen=0;   shi++; }
if(shi==24) {   shi=0; }
} }
/*---------------------------------------------------*/void IR_IN() interrupt 1 using 0{  unsigned char j,k,N=0;     EX0 = 0;    delay2(15); if (IRIN==1)      { EX0 =1;   return;  }                            //确认IR信号出现  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。    {delay2(1);}
 for (j=0;j<4;j++)         //收集四组数据 {   for (k=0;k<8;k++)        //每组数据有8位  {   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。     {delay2(1);}    while (!IRIN)          //等 IR 变为高电平     {delay2(1);}     while (IRIN)           //计算IR高电平时长      {    delay2(1);    N++;               if (N>=30) { EX0=1; return;}                  //0.14ms计数过长自动离开。      }                        //高电平计数完毕                     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”     N=0;  } }      if (IRCOM[2]!=~IRCOM[3])   { EX0=1;     return; }
   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
   if(IRCOM[5]>9)    { IRCOM[5]=IRCOM[5]+0x37;}   else  IRCOM[5]=IRCOM[5]+0x30;
   if(IRCOM[6]>9)    { IRCOM[6]=IRCOM[6]+0x37;}   else  IRCOM[6]=IRCOM[6]+0x30;      EX0=1;   }main(){  unsigned int i,k,j; unsigned char s=0; bit FlashFlag;//闪烁标志位 bit star;Time1_Init(); IE=0x89; TCON=0xc3;   IRIN=1;                    //I/O口初始化TR1=0;
while(1)      {        if(IRCOM[2]==0x01)     {       star=1;TR1=1;   TempData[0]=DuanMa[fen/10];TempData[1]=DuanMa[fen%10];   TempData[2]=DuanMa[miao/10];TempData[3]=DuanMa[miao%10];//分钟和秒在运转   Display(0,4);EX0 = 1;//IRCOM[0]=0xff;       
if(IRCOM[2]==0x02&&star==1)//当按键1已经按下后,按下2号键才有效
{   TR1=0;j++; 
 if(j==20)  //检测当前数值显示了一小段时间后,              //需要显示的数值,实现数据显示的变化     {  j=0;  FlashFlag=!FlashFlag;
}
 if(FlashFlag)    {         TempData=DuanMa[fen/10];      }  else    {     TempData=0;           }   //s为0,也就是第一个数码管闪烁     Display(0,4);//四个数码管亮起 



 }  
  } /*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535------------------------------------------------*/void Delay(unsigned int t){ while(--t);}/*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num)//这里数码管用的段选和位选都是74HC573{      unsigned char i;      for(i=0;i {       DataPort=0;   //清空数据,防止有交替重影       LATCH1=1;     //段锁存       LATCH1=0;       DataPort=WeiMa[i+FirstBit]; //取位码        LATCH2=1;     //位锁存       LATCH2=0;         DataPort=TempData;//DuanMa[q]; //取显示数据,段码       LATCH1=1;     //段锁存       LATCH1=0;          Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 }      
[ 本帖最后由 mianbaoyjttao 于 2012-5-28 00:10 编辑 ] 此帖出自小平头技术问答
11条回答
snailow   
  • 97  
  • 579  技术员
    1楼-- · 2019-03-25 00:28
    看不懂,为楼主顶帖
    查看更多
    wrlsohu   
  • 194  
  • 343  技术员
    2楼-- · 2019-03-25 02:24
    关注中,同样困惑
    查看更多
    tzl   
  • 31  
  • 130  技术员
    3楼-- · 2019-03-25 03:47
    你程序太多,我也没时间看。
    我是这样做的:把音量给一个变量,按一次键音量+1,加到最大值后可以归0,同时用这个变量去控制实际音量。
    查看更多
    谢谢,不过我仍然不知道怎么做。其实我的程序相当简单的,定时器就是让数码管走时,还有一个红外解码的过程,仅此而已。
    查看更多
    先保证你的红外解码程序是对了。可以这样做,没接受到一个正确的红外按键就设置一个标志,比如点亮一个LED,或者数码管的某一个位或者某一个段,反正能让你知道接受的红外信号是正确的就行了。保证了这一点,就和按键没什么区别了,没收到一个正确的红外编码,就相当于按下了一个按键,只不过这个不需要去抖罢了。
    查看更多
     精彩回答 2  声望值 偷偷看……
    查看更多
    谢谢。我也试过,但是我没弄出来,好像接收到码值,执行相应的动作后,要将IRCOM[2]=0xff,但是我这样做的直接后果是,不闪烁了。
    查看更多
    呵呵,就是想用一个键来控制,类似调节电视音量一样,按一下,增大一下的原理一样。
    查看更多
    红外解码没问题吗?我是用计数器去计脉冲个数来编码的,楼主这里好像没这么做,我没试过
    查看更多
    p7885572   
  • 4  
  • 565  技术员
    10楼-- · 2019-03-25 18:56
    请问能加一下你的QQ吗?有些红外编码问题想向你请教一下
    查看更多
    limmy321   
  • 171  
  • 501  技术员
    11楼-- · 2019-03-26 00:18
    我也和楼主遇到同样的问题,就是重复用同一个键来计数就不行。跪求高人指点
    查看更多

    一周热门 更多>