#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f};
uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;
uint tn;
sbit start=P1^0;
sbit F1=P1^1;
sbit F2=P1^2;
sbit F3=P1^3;
sbit UPI=P1^4;
sbit DNI=P1^5;
sbit UPO=P1^6;
sbit DNO=P1^7;
sbit UP1=P3^0;
sbit UP2=P3^1;
sbit DN2=P3^2;
sbit DN3=P3^3;
void display(uchar now);
void delay(uint z);
uchar keyscan();
void pause();
void ocdoor();
void main()
{
now=1; //初始化
flag=1;
num=0;
P1=0xff;
P2=0xfd;
P3=0x0f;
TMOD=0x01;//设置为定时器0 方式1
TH0=0X3C;
TL0=0XB0;
EA=1;//CPU允许中断
ET0=1;//开定时器0中断
while(1)
{
display(now);//显示初始楼层
if(P2!=0xfc)// 有按键按下则扫描
{
delay(20);
if(P2!=0xfc)
{
keyscan();}
}
//************************************
//1楼的分析程序
while(now==1)
{
display(now);
if(UP2==0||F2==0||DN2==0)
{
TR0=1;UPI=1;flag=1;floor=2;}//delay(50);UPI=0;开启定时到2
else if(DN3==0||F3==0)
{
TR0=1;
UPO=UPI=0;
TR0=1;
floor=3;
flag=1;
}
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
//********************************
//2楼的分析程序
while(now==2)
{
display(now);
if(UP2==0||DN2==0) TR0=1;
if(DN3==0||F3==0)
{TR0=1;UPO=0;flag=1;floor=3;}//delay(50);UPI=0;开启定时到2
else if(UP1==0||F1==0)
{
TR0=1;
DNI=0;
floor=1;
flag=0;
} if(DN3==1&&F3==1&&UP1==1&&F1==1&&DN2==1&&floor!=now)
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
//3楼的分析程序
while(now==3)
{
display(now);
if(DN3==0)
TR0=1;
if(DN2==0||UP2==0||F2==0)
{
TR0=1;DNO=0;flag=0;floor=2;}
else if(UP1==0||F1==0)
{
TR0=1;
DNO=DNI=0;
floor=1;
flag=0;
}
if(DN2==1&&UP2==1&&UP1==1&&DN3==1&&floor!=now) TR0=1;
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
}
}
//中断服务程序
void time0() interrupt 1
{
tn++;
TH0=0X3C;TL0=0XB0;TR0=1;TF0=0;
if(tn==40)
{
tn=0;
display(now);
if(now==floor)
{
switch(now)
{
case 1:TR0=0;
pause();
ocdoor();
F1=1;
UP1=1;
flag=1;
start=1;
UPI=UPO=DNI=DNO=1;
break;
case 2:UP2=1;
TR0=0;
pause();
DN2=1;
TR0=0;
pause();
F2=1;
start=1;
TR0=0;
UPI=UPO=DNI=DNO=1;
break;
case 3:TR0=0;
pause();
F3=1;
DN3=1;
flag=0;
start=1;
UPI=UPO=DNI=DNO=1;
break;
default:TR0=0;now=1;break;
}
}
else
{
if(floor<now&&flag==1)
flag=0;
if(floor>now&&flag==0)
flag=1;
if(flag==0)
now--;
if(flag==1)
now++;
}
}
}//***********************************
//键盘扫描子程序
uchar keyscan()
{
P2=0xfe; //扫描第一行
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
delay(5);
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
temp=P2;
switch(temp)
{
case 0xfa :num=0;start=0;break;
case 0xf6 :num=1;F1=0;floor=1;break;
case 0xee :num=2;F2=0;floor=2;break;
case 0xde :num=3;F3=0;floor=3;break;
}
while(temp!=0xfc)
{
temp=P2;
temp=temp&0xfc;
}
}
}
P2=0xfd;//扫描第二行
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
delay(5);
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
temp=2;
switch(temp)
{
case 0xf9 :num=4;UP1=0;break;
case 0xf5 :num=5;UP2=0;break;
case 0xed :num=6;DN2=0;break;
case 0xdd :num=7;DN3=0;break;
}
while(temp!=0xfc)
{
temp=P2;
temp=temp&0xfc;
}
}
}
return num;
}
//******************************************
//数码管显示函数
void display(uchar now)
{
P0=table[now];
delay(15);
}
//*****************************************
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=222;y>0;y--);
}
//*********************************************
//到达目的层,灯闪烁
void pause()
{
int i=0;
for(i=0;i<30;i++)
{
start=1;
delay(20);
start=0;
delay(20);
}
}
|