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
注释如下:
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
}
原文地址: https://www.cveoy.top/t/topic/d7TJ 著作权归作者所有。请勿转载和采集!