红外解码的问题

2019-03-24 18:59发布

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

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

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

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

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

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

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

请各位高手帮帮忙,谢谢!。
/*------------------------------------------------*/#include<reg52.h> 
#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<Num;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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。