本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
做一个红外遥控的电子钟时,用了两个中断函数,T0做定时器,EX0做红外解码, T0 高优先级。主程序里包含红外解码出的键值扫描处理函数,和一个显示的函数;键值扫描处理函数里面也包含了各个相关的显示函数。 现在问题是: 当按遥控器时 能进行解码也能进行T0的中断处理但就是回不到主程序里了 也不知道跑哪去了。请各位帮帮忙看看,小弟在此感激不尽!
uchar day_flag=1,fun_flag=0,left=0,right=0,add=0,sub=0,ok_flag=0; 设置的与红外解码相关的标志位
/************************************************
键值扫描
************************************************/
void keyscan()
{
if(left==1) //显示闹钟
{
while(!ok_flag)
display(hour1,minu1,0);
left=0;
ok_flag=0;
fun_flag=0;
}
////////////////////////////////////////////
if(right==1) //显示日期
{
while(!ok_flag)
display(year,month,day);
right=0;
ok_flag=0;
fun_flag=0;
}
////////////////////////////////////////////////
if(fun_flag!=0)
{
if(fun_flag==1) //////////设置时间///////////////
{
while(!ok_flag)
{
if(left==1) //设置hour
{
display1(hour,minu,secnd); //hour闪
if(add==1)
{
add=0;
hour++;
}
if(sub==1)
{
sub=0;
hour--;
}
}
else if(right==1) //设置minu
{
display4(hour,minu,secnd); //minu闪
if(add==1)
{
add=0;
minu++;
}
if(sub==1)
{
sub=0;
minu--;
}
}
else
display2(hour,minu,secnd); //都闪烁
}
}
if(fun_flag==2) /////////////设置闹钟//////////////////////
{
while(!ok_flag)
{
if(left==1) //设置hour1
{
display1(hour1,minu1,0); //hour1闪
if(add==1)
{
add=0;
hour1++;
}
if(sub==1)
{
sub=0;
hour1--;
}
}
else if(right==1) //设置minu1
{
display4(hour1,minu1,0); //minu1闪
if(add==1)
{
add=0;
minu1++;
}
if(sub==1)
{
sub=0;
minu1--;
}
}
else
display2(hour1,minu1,0); //都闪烁
}
}
if(fun_flag==3) /////////////设置日期//////////////////////
{
while(!ok_flag)
{
if(day_flag==0)
display2(year,month,day);
else if(day_flag==1) //设置year
{
display1(year,month,day); //year闪
if(add==1)
{
add=0;
year++;
}
if(sub==1)
{
sub=0;
year--;
}
}
else if(day_flag==2) //设置month
{
display4(year,month,day); //month闪
if(add==1)
{
add=0;
month++;
}
if(sub==1)
{
sub=0;
month--;
}
}
else if(day_flag==3) //设置day
{
display5(); //day闪
if(add==1)
{
add=0;
day++;
}
if(sub==1)
{
sub=0;
day--;
}
}
}
}
left=0;
right=0; //各标志位复原
fun_flag=0;
day_flag=0;
ok_flag=0;
}
}
/************************************************
功能主函数
************************************************/
void main()
{
//uchar i;
init();
while(1)
{
if(left==1||right==1||fun_flag!=0)
keyscan();
display(hour,minu,secnd);
}
}
/************************************************
中断服务函数 T0
************************************************/
void timer0(void) interrupt 1
{
TH0=(65536-48500)/256; //
TL0=(65536-48500)%256;
num++;
if(num==19) //根据实验测得的精确数字 计到一秒了
{
num=0;
secnd++;
P33=~P33;
P36=~P36;
}
if(secnd==60)
{
}
.......//各时间标志的处理 此略
}
/************************************************
红外解码 外部中断0
************************************************/
void extinter0(void) interrupt 0 using 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH1=0; //定时器T0的高8位清0
TL1=0; //定时器T0的低8位清0
TR1=1; //开启定时器T0
while(IR==0); //如果是低电平就等待,给引导码低电平计时
TR1=0; //关闭定时器T0
LowTime=TH1*256+TL1; //保存低电平时间
TH1=0; //定时器T0的高8位清0
TL1=0; //定时器T0的低8位清0
TR1=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时
TR1=0; //关闭定时器T0
HighTime=TH1*256+TL1; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1) // 执行遥控解码功能
{
beep();////////////////////////////////////////////////////////////////////////
switch(a[2])
{
case 0xb0 : {add=1;break;}
case 0xac : {left=1;ok_flag=0;right=0;day_flag--;if(day_flag==0)day_flag=3;break;}
case 0xa0 : {sub=1;break;}
case 0xbc : {right=1;ok_flag=0;left=0;day_flag++;if(day_flag==4)day_flag=1;break;}
case 0x9c : {ok_flag=1;fun_flag++;if(fun_flag==4)fun_flag=0;day_flag=0;break;}
default : break;
}
// keyscan(); 测试用
}
// keyscan(); 测试用
}
EX0=1;//开启外中断EX0
}
[ 此帖被jingshilin在2010-11-27 08:41重新编辑 ] |
|