红外程序流程图.docx
《红外程序流程图.docx》由会员分享,可在线阅读,更多相关《红外程序流程图.docx(18页珍藏版)》请在冰豆网上搜索。
红外程序流程图
voidIRdelay(unsignedcharx)//延时子程序
{
unsignedchara,b;
while(x--)
{
for(b=6;b>0;b--)
for(a=127;a>0;a--);
}
voiddelay(uinti)
{
charb;
while(i--)
{
b=bb;
while(b--);
}
}
voiddelay2(uintt)
{
inti;
while(t--)
for(i=0;i<5;i++);
}
voidsend_data(unsignedchard)//发送一层当中的一行显示数据,8位
{
unsignedchari;
for(i=0;i<8;i++)
{
DS=d&0x80;//发送最低位
SH_CP=1;
SH_CP=0;//移位寄存器移位
d=d<<1;//数据移位f
}
}
voidmain()
ST_CP2=0;//控制显示层
if(layer<7)
layer++;//为扫面上一层做准备(光立方一个静止图形是从最底层开始扫描)
else
layer=0;
delay
(2);
}
}
while(amenu==1)//显示心形
{
staticucharlayer=0;
for(j=0;j<8;j++)//LED正极驱动循环扫描8层
{
for(i=0;i<8;i++)//循环8次,每一次将光立方的一层动画数据装入buffer[]数组
{
buffer[i]=~display2[layer][i];//调用层暂存数组将用于光立方显示的二维数组里的一层显示数据装入其中
}
xiansi1();//单片机发送数据给74HC595
cheng=0x01<{
uchard,dd,i,j,cheng;
timer0init();
initial595();
initial5952();
ABL=0;
menu=1;
out=0;
bb=0;
RR=1;//红色控制
GG=1;//绿色控制
BB=0;//蓝色控制
d=60000;
dd=60000;
while(menu==1)//显示全亮
{
staticucharlayer=0;
for(j=0;j<8;j++)//LED正极驱动循环扫描8层
{
for(i=0;i<8;i++)//循环8次,每一次将光立方的一层动画数据装入buffer[]数组
{
buffer[i]=display1[layer][i];//调用层暂存数组将用于光立方显示的二维数组里的一层显示数据装入其中
}
xiansi1();//单片机发送数据给74HC595
cheng=0x01<DS2=~cheng&0x01;//发送层扫描数据
SH_CP2=1;
SH_CP2=0;//移位寄存器移位
ST_CP=1;
ST_CP=0;//控制显示列
ST_CP2=1;
DS2=~cheng&0x01;//发送层扫描数据
SH_CP2=1;
SH_CP2=0;//移位寄存器移位
ST_CP=1;
ST_CP=0;//控制显示列
ST_CP2=1;
ST_CP2=0;//控制显示层
if(layer<7)
layer++;//为扫面上一层做准备(光立方一个静止图形是从最底层开始扫描)
else
layer=0;
if(out==0)
{
break;
}
delay(65535);
delay(65535);
delay(65535);
delay(65535);
}
}
}
N=0;
}//endfork
}//endforj
if(IRCOM[2]!
=~IRCOM[3])
{EX0=1;
return;
}
if(IRCOM[2]==0x0c)//1键
{//复位-音频
menu=1;
out=0;
amenu=0;
}
if(IRCOM[2]==0x18)//2键
{//上位机
menu=0;
out=0;
amenu=1;
}
if(IRCOM[2]==0x5e)//3键
{//脱机动画
menu=0;
out=1;
amenu=0;
}
if(IRCOM[2]==0x4a)//9键
{
}
voidIR_IN(void)interrupt0
{
unsignedcharj,k,N=0;
EX0=0;
IRdelay(15);
if(IRIN==1)
{EX0=1;
return;
}
//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay
(1);}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay
(1);}
while(!
IRIN)//等IR变为高电平
{IRdelay
(1);}
while(IRIN)//计算IR高电平时长
{
IRdelay
(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”
k2=1;
}
if(IRCOM[2]==0x15)//+键
{//音量加
k3=0;
delay2(50000);
delay2(50000);
delay2(50000);
delay2(50000);
k3=1;
}
if(IRCOM[2]==0x46)//CH键
{//待机
IAP_CONTR=0x20;
}
if(IRCOM[2]==0x42)//7号键亮度
{
ABL=~ABL;
}
EX0=1;
}
if(IRCOM[2]==0x09)//EQ键
{
}
if(IRCOM[2]==0x44)//<<键
{//上一曲
k3=0;
delay2(20000);
k3=1;
}
if(IRCOM[2]==0x40)//>>键
{//下一曲
k2=0;
delay2(20000);
k2=1;
}
if(IRCOM[2]==0x43)//||键
{//播放暂停
k1=0;
delay2(20000);
k1=1;
}
if(IRCOM[2]==0x07)//-键
{//音量减
k2=0;
delay2(50000);
delay2(50000);
delay2(50000);
delay2(50000);