新手求助51达人 红外遥控数码管显示的问题,我用红外遥控控制数码管显示0-9
红外解码的程序没有问题,可以成功解码,数码管显示的程序是从之前的程序贴过来的,原程序也能正常显示,但用遥控器控制点亮时,按了按键却没有反应,求达人指教!!!!
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//unsigned char code seg_we[]={0x10,0x20,0x40,0x80}; //11111110 11111101 11111011 11110111
uchar ir
time,startflag,bitnum,irreceok; //11101111 11011111 10111111 01111111
uchar irdata[33];
uchar irprosok;
uchar display[4];
uchar ircode[8] ;
/***********************************************************************
函数功能:延时函数,在数码管显示时使用,不需要很精确
************************************************************************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
void delaynms(unsigned int n) //nms延时函数,用n的数值设定延时的毫秒数
{
unsigned int i;
for(i=0;i<n;i++)
{
delay1ms();
}
}
/**************************************************************************
函数的功能:定时器0的初始化
**************************************************************************/
void timer0init()
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
TR0=1;
EA=1;
}
/************************************************************************
外部中断0的初始化
***********************************************************************/
void int0init()
{
IT0=1;
EX0=1;
EA=1;
}
/**********************************************************************
定时器0的功能函数,每中断一次irtime++,用于计时
***********************************************************************/
void timer0() interrupt 1
{
irtime++;
}
/***********************************************************************
外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中
断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能
是,把信号从高低电平变成时间的代码放入irdata【】中
************************************************************************/
void int0() interrupt 0
{
if(startflag)
{
if(irtime>40)
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
irreceok=1;
}
}
/*************************************************************************
函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中
**************************************************************************/
void irpros()
{
uchar k=17,value,j,i;
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6)
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
/****************************************************************************
函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示
***************************************************************************/
void irwork()
{
display[0]=ircode[0]/16;
display[1]=ircode[0]%16;
display[2]=ircode[1]/16;
display[3]=ircode[1]%16;
}
/*************************************************************************
函数功能:数码管显示程序
**************************************************************************/
void dis8(uchar a)
{
P2&=0x0F;
P0=seg_du[a];
P2|=0x80;
delaynms(1);
}
/************************************************************************
主函数功能:用解码的按键控制数码管点亮
************************************************************************/
void main()
{
timer0init();
int0init();
irpros();
irwork();
while(1)
{
uchar i;
i=0;
if (display[4]==0x08)
{
dis8(i++);
if(i==0x10) i=0;
delaynms(500);
}
}
}
一周热门 更多>