永发信息网

单片机程序解读

答案:1  悬赏:0  手机版
解决时间 2021-11-24 22:19
单片机程序解读
最佳答案

我帮你一句一句的解释,也只是大概的,细节的还需要你自己去像。

有不对的请包涵。

#define ScreenData P2 //预处理,定义显示的内容由P2口送出。像数码管显示中的段码
#define ScreenLine P0 //预处理,定义显示的行P0口送出 。码管显示中的位选

#define LiftMotor P3 //电梯电机 //P3口控制电梯电机
#define LiftStop 0xff //电梯停
#define LiftUp 0x7f //电梯上升
#define LiftDown 0xbd //电梯下降

int8u code FontNum[] = //这个数组使用来存放显示内容的内码,内码是由显示器决定的
{
0xFF,0xC7,0xBB,0xBB,0xBB,0xBB,0xBB,0xC7,
0xFF,0xEF,0xCF,0xEF,0xEF,0xEF,0xEF,0xC7,
0xFF,0xC7,0xBB,0xFB,0xF7,0xEF,0x9F,0x83,
0xFF,0xC3,0xBB,0xFB,0xE7,0xFB,0xBB,0xC7,
0xFF,0xF7,0xE7,0xD7,0xB7,0xB7,0x83,0xF7,
0xFF,0x83,0xBF,0x87,0xFB,0xFB,0xBB,0xC7,
0xFF,0xC7,0xBF,0xBF,0x87,0xBB,0xBB,0xC7,
0xFF,0x83,0xB7,0xF7,0xEF,0xEF,0xEF,0xEF,
0xFF,0xC7,0xBB,0xBB,0xC7,0xBB,0xBB,0xC7,
0xFF,0xC7,0xBB,0xBB,0xC3,0xFB,0xFB,0xC7,
0xFF,0xEF,0xC7,0xAB,0xEF,0xEF,0xEF,0xFF,
0xFF,0xEF,0xEF,0xEF,0xAB,0xC7,0xEF,0xFF,
};
int8u FloorBegin = 0x01,FloorEnd = 0x01; //定义两个全局变量,FloorBegin表示电梯现在所在的楼层
//FloorEnd表示要到的楼层。

void LiftScreenDisplay(void); //下面有
void ScreenDisplay(int8u num,int8u lineBegin);
void T0Init(void);
函数名称 :LiftInit
函数功能 :电梯初始化
void LiftInit(void)
{
ScreenLine = 0x00; //把0x00送到P0口。显示器显示0行。 这里我解释不太准
ScreenData = 0xff; //把0xff送到P2口。显示器显示的内容,应该是电梯没人按的状态。
LiftMotor = LiftStop; //电机停止
T0Init();
}
函数名称 :LiftScreenDisplay
函数功能 :电梯屏幕显示
void LiftScreenDisplay(void)
{
static int8u DisplayCnt = 0x00,lineBegin = 0x00; //定义静态局部变量,DisplayCnt应该是用来模拟计时用的
//lineBegin是用来记显示数组显示到哪行的一个变量
if(FloorBegin == FloorEnd) //下面就是电梯现在所在层与要到层之间的三种关系
//显示处理简单的,在同一层的情况
{
LiftMotor = LiftStop;
ScreenDisplay(FloorBegin,0);
}
else
{
if(FloorBegin < FloorEnd) //电梯现在所在层在要到的层下面,电梯要上行
{
LiftMotor = LiftUp;
if(lineBegin == 0)
{
ScreenDisplay(FloorBegin,0); //
}
else
{
ScreenDisplay(10,lineBegin);
}
if(DisplayCnt++ > 100) //这里应该是用来模拟的,认为DisplayCnt*lineBegin显示完就走过了一层FloorBegin加一层
{
DisplayCnt = 0;
lineBegin++;
if(lineBegin >8)
{
lineBegin = 0;
FloorBegin++;
}
}
}
else //电梯现在所在层在要到的层上面,电梯要下行 。这与上行的一样
{
LiftMotor = LiftDown;
if(lineBegin == 0)
{
ScreenDisplay(FloorBegin,0);
}
else
{
ScreenDisplay(11,8-lineBegin);
}
if(DisplayCnt++ > 100)
{
DisplayCnt = 0;
lineBegin++;
if(lineBegin >8)
{
lineBegin = 0;
FloorBegin--;
}
}
}
}
}
函数名称 :ScreenDisplay
函数功能 :Screen显示
入口参数 :显示内容,显示开始行
void ScreenDisplay(int8u num,int8u lineBegin) //显示的地方不是。。。。。。
{
static int8u i,line=0x01;
ScreenLine = 0x00;
ScreenData = FontNum[num*8+(i+lineBegin)%8];
ScreenLine = line;
line <<= 1;
i++;
if(i>8)
{
i = 0;
line = 0x01;
}
}
函数名称 :T0Init
函数功能 :定时器0初始化程序
void T0Init(void) //这里是定时器,完成定时器的初始化,设置定时器的工作模式,定时时间等等。
{
TMOD = TMOD&0xf0;
TMOD = TMOD|0x01; //T0为定时器,方式1,TR0控制定时器启动或停止
TH0 = 0xf8;
TL0 = 0x30;
ET0 = 1; //T0允许中断
TR0 = 1; //启动T0
}
函数名称 :T0Isr
函数功能 :定时器0中断处理程序
void T0Isr(void) interrupt 1 //中断服务函数,主要是用来定时刷显示器的。
{
TH0 = 0xf8;
TL0 = 0x30;
LiftScreenDisplay();
}追问图形显示的那些在哪呢。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2018~2019学年全国高三大联考第二次月考卷子
合阳北火车站一天有几趟客车
怎么不能办理38元以下基础套餐
北京南站如何步行到永定门长途汽车站?
晋江市五通驾校地址在哪,我要去那里办事,
去英国旅游,往国内带回点什么礼物好
详见图片,请问那个37°夹角是什么意思,求详
魅族魅蓝E2多长多宽多厚
纹天眼代表什么?
左胯肌肉疼痛是什么原因
梦幻西游 辅助技能 打造技巧从140点到150 要
今年的大蒜价格怎么样
身体缺少无机盐,要怎么补充
九阴真经进了华山能学君子堂武学吗
晚年余庆什么意思?
推荐资讯
现在宜万铁路通了,请问湖北恩施到湖南永州乘
k1019次列车15车57座是靠窗户还是过道
《寡人之于国也》文中主要阐述了孟子的什么思
最近要去手机店做导购,OPPO导购好一点还是vi
回族用不用棺材?如果不用的话,为什么阿拉法
有关电锯的恐怖片
张策和孙禄堂比武谁赢
百拙千丑敬谢不敏什么意思
欢乐时光网咖地址在什么地方,我要处理点事!
金海洋台球地址在什么地方,我要处理点事!
28日足球比赛结果
胆字繁体字几画?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?