for(b=500;b>0;b--);
}
voiddelay2()//延时0.5秒
{
uinta,b;
for(a=300;a>0;a--)
for(b=200;b>0;b--);
}
voiddelay1()//延时0.1秒
{
uintx,y;
for(x=100;x>0;x--)
for(y=100;y>0;y--);
}
voidpwm(intx)
{
while(x--);
}
voidsoft_reset(void)//复位
{
((void(code*)(void))0x0000)();
}
voidpwmled()
{
intt=0;
uintres=1400;
charf=0;//亮暗标志,0为亮
while(res--)
{
P2=0x00;D9=0;
pwm(t);//Toff,亮的时间
P2=0xff;D9=1;
pwm(T-t);//Ton,暗的时间
if(!
f)t+=N+1;//亮速率较快,模拟呼吸
elset-=N;//暗速率较慢
if(t>T){f=1;t=T;}
//超过最大值时,返回最大值,标志为暗
if(t<0){f=0;t=0;}//超过最小值时,返回最小值,标志为亮
}
}
//////////////////
voidzhuan()
{
D1=0;delay1();
D2=0;delay1();
D3=0;delay1();
D6=0;D1=1;delay1();
D9=0;D2=1;delay1();
D8=0;D3=1;delay1();
D7=0;D6=1;delay1();
D4=0;D9=1;delay1();
D5=0;D8=1;delay1();
D7=1;delay1();
D4=1;delay1();
}
//////////////////////////////
voidorigin()
{
P2=0x55;D9=0;delay2();//红亮
P2=0xaa;D9=1;delay2();//绿亮
P2=0x6d;D9=1;delay2();//左到右再到左
P2=0xb6;D9=1;delay2();//
P2=0xdb;D9=0;delay2();//
P2=0xb6;D9=1;delay2();//
P2=0x6d;D9=1;delay2();//
P2=0xd5;D9=1;delay2();//斜着
P2=0xfc;D9=0;delay2();//下到上再到下
P2=0xe3;D9=1;delay2();//
P2=0x1f;D9=1;delay2();//
P2=0xe3;D9=1;delay2();//
P2=0xfc;D9=0;delay2();//
P2=0xff;D9=1;delay2();//全暗
P2=0x00;D9=0;delay2();//全亮
P2=0xff;D9=1;delay2();//全暗
//P2=0x00;D9=0;delay2();全亮
P2=0x08;D9=0;delay2();//除5外亮
P2=0xf7;D9=1;//5亮/**/
}
//////////////////
voidtim0_isr(void)interrupt1using1//定时器0中断服务函数
{
irtime++;
}
///////////////////////////////////////////////////////////////////////
voidex0_isr(void)interrupt0using0//外部中断0服务函数
{
staticunsignedchari;
staticbitstartflag;
if(startflag)
{
if(irtime<42&&irtime>=33)//引导码TC9012的头码
i=0;
irdata[i]=irtime;//一次存储32位电平宽度
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{irtime=0;startflag=1;
}
}
////////////////////////////////////////////////////////////////////
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//reloadvalue
TL0=0x00;//initialvalue
ET0=1;//开中断
TR0=1;
}
///////////////////////////////////////////////////////////////////
voidEX0init(void)
{
IT0=1;//Configureinterrupt0forfallingedgeon/INT0(P3.2)
EX0=1;//EnableEX0Interrupt
EA=1;
}
/******************************************************************/
voidIr_work(void)//红外键值散转程序
{
switch(IRcord[2])//判断第三个数码值
{
case0:
xie();break;//1显示相应的按键值ledcrol()
case1:
ledup();break;//2上
case2:
D3=0;break;//3
case3:
pwmled();break;//4
case4:
ledleft();break;//5
case5:
leddown();break;//6左
case6:
ledright();break;//7下
case7:
origin();break;//8右
case8:
soft_reset();break;//9
}irpro_ok=0;//处理完成标志
}
/*****************************************************************/
voidIrcordpro(void)//红外码值处理函数
{
unsignedchari,j,k;
unsignedcharcord,value;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++)//处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
}irpro_ok=1;//处理完毕标志位置1
}
///////上/////////
ledup()
{
if(D4==0){D4=1;D1=0;}
if(D5==0){D5=1;D2=0;}
if(D6==0){D6=1;D3=0;}
if(D7==0){D7=1;D4=0;return;}
if(D8==0){D8=1;D5=0;return;}
if(D9==0){D9=1;D6=0;return;}
}
/////////下///////
leddown()
{
if(D1==0){D1=1;D4=0;return;}
if(D2==0){D2=1;D5=0;return;}
if(D3==0){D3=1;D6=0;return;}
if(D4==0){D4=1;D7=0;}
if(D5==0){D5=1;D8=0;}
if(D6==0){D6=1;D9=0;}
}
/////////////左//////////////
ledleft()
{
if(D2==0){D2=1;D1=0;}
if(D5==0){D5=1;D4=0;}
if(D8==0){D8=1;D7=0;}
if(D3==0){D3=1;D2=0;return;}
if(D6==0){D6=1;D5=0;return;}
if(D9==0){D9=1;D8=0;return;}
}
/////////右////////
ledright()
{if(D2==0){D2=1;D3=0;}
if(D5==0){D5=1;D6=0;}
if(D8==0){D8=1;D9=0;}
if(D1==0){D1=1;D2=0;return;}
if(D4==0){D4=1;D5=0;return;}
if(D7==0){D7=1;D8=0;return;}
}
voidmain()
{P1=0xff;//按键高电平
zhuan();
EX0init();//EnableGlobalInterruptFlag
TIM0init();//初始化定时器0
while
(1)
{if(irok)
{
Ircordpro();//码值处理
irok=0;
}
if(irpro_ok)//steppresskey
{
Ir_work();//码值识别散转
}
if(key2==0)//下
{delay1();
if(key2==0)
{
leddown();
}while(!
key2);delay1();while(!
key2);
}
if(key1==0)//上
{delay1();
if(key1==0)
{
ledup();
}while(!
key1);delay1();while(!
key1);
}
if(key3==0)//左
{delay1();
if(key3==0)
{
ledleft();
}while(!
key3);delay1();while(!
key3);
}
if(key4==0)//右
{delay1();
if(key4==0)
{
ledright();
}while(!
key4);delay1();while(!
key4);
}
}
}
参考文献:
[1]高吉数字电子技术(第二版)电子工业出版社,2004。
[2]高吉祥全国大学生电子设计竞赛电子工业出版社,2007。
[3]阎石数字电子技术基础(第四版)北京:
高等教育出版社,2000。