注释如下:

uint r= 0; //定义一个无符号整型变量r,初始值为0 char offset = 0; //定义一个字符型变量offset,初始值为0 uchar Current_Level = 1,Dest_Level=1,x=0,t =0; //定义三个无符号字符型变量Current_Level、Dest_Level、x和一个无符号整型变量t,初始值都为1或0

void main() //主函数 { P1 = 0x80; //将P1口设置为高电平 Current_Level = 1; //设置初始楼层为1 TMOD = 0x21; //设置定时器1和定时器0的工作方式 TH0 = (65536-4000)/256; //设置定时器0的初值为4ms TL0 = (65536-4000)%256; TR0=1; //启动定时器0 SCON=0x50; //设置串口模式为模式1 TH1=0xFD;TL1=0xFD; //设置波特率为9600 TR1=1; //启动定时器1 IE = 0x92; //开启中断 EA =1; //开启总中断 while(1); //进入死循环 }

void Serial_Receive() interrupt 4 //串口接收中断函数 { unsigned char val=0; //定义一个无符号字符型变量val,初始值为0 val=SBUF; //将接收到的数据存入val中 P2=val; //将val的值输出到P2口 if (Dest_Level == Current_Level && val != 0xff) //如果目标楼层等于当前楼层且接收到的数据不为0xff { if (val ==0x09)Dest_Level =9; //如果接收到的数据为0x09,将目标楼层设置为9 if (val ==0x08)Dest_Level =8; //如果接收到的数据为0x08,将目标楼层设置为8 if (val ==0x07)Dest_Level =7; //如果接收到的数据为0x07,将目标楼层设置为7 if (val ==0x06)Dest_Level =6; //如果接收到的数据为0x06,将目标楼层设置为6 if (val ==0x05)Dest_Level =5; //如果接收到的数据为0x05,将目标楼层设置为5 if (val ==0x04)Dest_Level =4; //如果接收到的数据为0x04,将目标楼层设置为4 if (val ==0x03)Dest_Level =3; //如果接收到的数据为0x03,将目标楼层设置为3 if (val ==0x02)Dest_Level =2; //如果接收到的数据为0x02,将目标楼层设置为2 if (val ==0x01)Dest_Level =1; //如果接收到的数据为0x01,将目标楼层设置为1 } RI = 0; //清除接收中断标志位 }

void Led_Dispaly() interrupt 1 //LED显示中断函数 { uchar i; //定义一个无符号字符型变量i //发送当前楼层信息 if (Dest_Level == Current_Level) //如果目标楼层等于当前楼层 { SBUF = 0xff; //发送0xff } TH0 = -4000/256; //设置定时器0的初值为4ms TL0 = -4000%256; P1 =crol(P1,1); //P1口逐行扫描 i = Current_Level *8 + r + offset+1; //计算LED数字在表格中的位置 P0 = ~Table[i]; //将LED数字的值输出到P0口 //电梯上升 if (Current_Level < Dest_Level ) //如果电梯正在往上,电梯当前层数小于目标层数 { if ( ++r ==8) //偏移量r按照顺序从0~7 { r =0; if( ++x ==4) //x代表LED的行数 { x = 0; if(++offset ==8) //offset代表LED的列数 { offset = 0; Current_Level++; //当前楼层加1
}

        }
    }
    
}
//电梯下降
else if(Current_Level > Dest_Level )  //如果电梯正在往下,电梯当前层数大于目标层数
{
    if ( ++r ==8)  //偏移量r按照顺序从0~7
    {
        r =0;
        if( ++x ==4)  //x代表LED的行数
        {
            x = 0;
            if(--offset == -8)  //offset代表LED的列数
            {
                offset = 0;
                Current_Level--;  //当前楼层减1               
            }
            
        }
    }
    
}
//电梯停止
else  //如果电梯没有移动
{
    if ( ++r ==8) r =0;  //偏移量r每次加1,r增加到8时,复位为0    
}
uint r= 0;char offset = 0;uchar Current_Level = 1Dest_Level=1x=0t =0;定义一些变量分别表示当前电梯所在楼层、目标楼层、LED数字的偏移量等void main P1 = 0x80; Current_Level = 1;设置初始楼层为1 TMOD = 0x21; 定时器1工作方式为方式2 TH0 = 6

原文地址: https://www.cveoy.top/t/topic/d7TJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录