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