请问各位,怎样实现红外遥控器同一按键重复利用,例如每次按音量+键,音量就增大一点。
以下是我调试的一个程序,四个数码管显示。上电开机时,系统启动,当按下一号键时
四个数码管亮起,开始计时工作,此时再按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~9 unsigned 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 编辑 ]
|