
#include <reg51.h>//51系列单片机头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
/******************************************************
基础定义
*******************************************************/
/*uchar m=0,n=0;
uchar o,p,d;
uchar time=0;*/
uchar f=1,f_now=1,way=0;//f按键楼层 f_now显示楼层 way按键向上
/******************************************************
数码显示数据定义
*******************************************************/
uchar code taba[]={0xff,0xef,0xef,0xef,0xab,0xc7,0xef,0xff};//编码定义
uchar code tab1[]={0xff,0xef,0xcf,0xef,0xef,0xef,0xef,0xc7};//编码定义
uchar code tab2[]={0xff,0xc7,0xbb,0xfb,0xf7,0xcf,0xbf,0x83};//编码定义
uchar code tab3[]={0xff,0xc7,0xbb,0xfb,0xe7,0xfb,0xbb,0xc7};//编码定义
uchar code tab4[]={0xff,0xf7,0xe7,0xd7,0xb7,0xb7,0x83,0xf7};//编码定义
uchar code tab5[]={0xff,0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7};//编码定义
uchar code tab6[]={0xff,0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7};//编码定义
void delay(uint i)//延时子函数
{
uint j;
while(i--)
{
for(j=123;j>0;j--);
}
}
main()
{
uchar i,j;
TMOD = 0x01;//设定定时器0为工作方式1
TH0 = (65536-20000)/256;//装初值
TL0 = (65536-20000)%256;//装初值
EA = 1; //开总中断
ET0 = 1;//开定时器0中断
TR0 = 1;//启动定时器0
while(1)
{
if(way==0)
{
for(j=10;j>0;j--)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
switch(f_now)//判断按键按的楼层。显示屏显示的是否是对应的数字
{
case 1: P2=tab1[i];break;
case 2: P2=tab2[i];break;
case 3: P2=tab3[i];break;
case 4: P2=tab4[i];break;
case 5: P2=tab5[i];break;
case 6: P2=tab6[i];break;
default:break;
}
delay(2);
}
}
}
else if(way==1)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
P2=taba[(7-i-j/2)%8];
delay(2);
}
j++;
if(j==33)
{
f_now++;
way=0;
j=0;
}
}
else if(way==2)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
P2=taba[(i-j/2)%8];
delay(2);
}
j++;
if(j==33)
{
f_now--;
way=0;
j=0;
}
}
}
}
timer0() interrupt 1//中断系统
{
TH0=(65536-20000)/256;//每过20秒刷新一次
TL0=(65536-20000)%256;
switch(P1)//判断开关
{
case 0XFB: f=1;break;
case 0XF7: f=2;break;
case 0Xef: f=3;break;
case 0Xdf: f=4;break;
case 0Xbf: f=5;break;
case 0X7f: f=6;break;
default:break;
}
if(f>f_now&&f>=4)//按键按的数字比显示楼层大
{
way=1;//显示屏向上
}
else if(f<f_now&&f<=4)//。。。。。。小
{
way=2;//显示屏向下
}
else
{
way=0;
}
}
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
/******************************************************
基础定义
*******************************************************/
/*uchar m=0,n=0;
uchar o,p,d;
uchar time=0;*/
uchar f=1,f_now=1,way=0;//f按键楼层 f_now显示楼层 way按键向上
/******************************************************
数码显示数据定义
*******************************************************/
uchar code taba[]={0xff,0xef,0xef,0xef,0xab,0xc7,0xef,0xff};//编码定义
uchar code tab1[]={0xff,0xef,0xcf,0xef,0xef,0xef,0xef,0xc7};//编码定义
uchar code tab2[]={0xff,0xc7,0xbb,0xfb,0xf7,0xcf,0xbf,0x83};//编码定义
uchar code tab3[]={0xff,0xc7,0xbb,0xfb,0xe7,0xfb,0xbb,0xc7};//编码定义
uchar code tab4[]={0xff,0xf7,0xe7,0xd7,0xb7,0xb7,0x83,0xf7};//编码定义
uchar code tab5[]={0xff,0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7};//编码定义
uchar code tab6[]={0xff,0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7};//编码定义
void delay(uint i)//延时子函数
{
uint j;
while(i--)
{
for(j=123;j>0;j--);
}
}
main()
{
uchar i,j;
TMOD = 0x01;//设定定时器0为工作方式1
TH0 = (65536-20000)/256;//装初值
TL0 = (65536-20000)%256;//装初值
EA = 1; //开总中断
ET0 = 1;//开定时器0中断
TR0 = 1;//启动定时器0
while(1)
{
if(way==0)
{
for(j=10;j>0;j--)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
switch(f_now)//判断按键按的楼层。显示屏显示的是否是对应的数字
{
case 1: P2=tab1[i];break;
case 2: P2=tab2[i];break;
case 3: P2=tab3[i];break;
case 4: P2=tab4[i];break;
case 5: P2=tab5[i];break;
case 6: P2=tab6[i];break;
default:break;
}
delay(2);
}
}
}
else if(way==1)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
P2=taba[(7-i-j/2)%8];
delay(2);
}
j++;
if(j==33)
{
f_now++;
way=0;
j=0;
}
}
else if(way==2)
{
for(i=0;i<8;i++)
{
P0=0X80>>i;
P2=taba[(i-j/2)%8];
delay(2);
}
j++;
if(j==33)
{
f_now--;
way=0;
j=0;
}
}
}
}
timer0() interrupt 1//中断系统
{
TH0=(65536-20000)/256;//每过20秒刷新一次
TL0=(65536-20000)%256;
switch(P1)//判断开关
{
case 0XFB: f=1;break;
case 0XF7: f=2;break;
case 0Xef: f=3;break;
case 0Xdf: f=4;break;
case 0Xbf: f=5;break;
case 0X7f: f=6;break;
default:break;
}
if(f>f_now&&f>=4)//按键按的数字比显示楼层大
{
way=1;//显示屏向上
}
else if(f<f_now&&f<=4)//。。。。。。小
{
way=2;//显示屏向下
}
else
{
way=0;
}
}
