一、 实验简介:
本程序全面的表现了子程序的用法,它从对几个子程序的操作,显示不同的流灯技术,流水灯的不同需要不同的表现的形式,而这里主要介绍了移位操作和内部数据存储及读入操作。延时函数采用可重入标志,可进行函数的递归调用。
二、 实验原理图:
三、 实现代码:
//===================================================================== //
// 开发日期: 2009/01/20 //
// 修改日期: //
// 程序作者: guojun //
// 程序备注: 此程序仅为表现本机功能而演示用,当用作实际工程时请慎用. //
// 特别声明: 此程序可作研究之用,但引用,转载,使用请注明出处. //
//===================================================================== //
#include <AT89x51.h> //包含头文件
#define Led P1 //定义显示端口号
unsigned int code BToM[]={0x7E,0x3C,0x18,0x00}; //定义由两边到中间显示数据
unsigned int code MToB[]={0xE7,0xC3,0x81,0x00}; //定义由中间到两边显示数据
void Delay() reentrant //定义可重入的延时函数
{ unsigned int DelayTime="10000"; //定义延时时间基数
while(DelayTime--); //程序开始延时开始
}
void LeftToRight() //定义从左边到右边显示函数
{unsigned char TempCount="0"; //定义显示次数变量
Led=0xFE; //定义初步显示数据
for(TempCount=0;TempCount<8;TempCount++) //通过循环进行数据显示
{
Delay(); //延时,用在每次移动数据开始处
Led="Led"<<1; //由右边向左边移动数据
}
return; //空返回语句,表明此子程序的结束.
}
void RightToLeft() //定义从右边到左边显示函数
{ unsigned char TempCount="0"; //定义显示次数变量
Led="0x7F"; //定义初步显示数据
for(TempCount=0;TempCount<8;TempCount++) //通过循环进行数据显示
{
Delay(); //延时,用在每次移动数据开始处
Led="Led">>1; //由左边向右移动数据
}
return; //空返语句,表明此子程序的结束.
}
void BothToMid() //定义由两边到中间显示子程序
{ unsigned char TempCount="0"; //定义临时次数变量
Led="0xFF";
for(TempCount=0;TempCount<5;TempCount++) //通过循环依次进行次数运行
{
Delay(); //延时,在每次运行前.
Led="BToM"[TempCount]; //读入当次显示数据.
}
return; //空返回,表明此子程序的结束.
}
void MidToBoth() //定义由中间到两边子程序
{unsigned char TempCount="0"; //定义临时次数变量
Led=0xFF;
for(TempCount=0;TempCount<5;TempCount++) //通过循环进行数据显示
{
Delay(); //延时,在每次数据显示前.
Led="MToB"[TempCount]; //读入当次显示数据.
}
return; //空返回,表明此次子程序的结束.
}
void main() //主程序入口处.
{
while(1) //无穷循环开始.
{ LeftToRight(); //从左到右进行显示
RightToLeft(); //从右到左进行显示
BothToMid(); //由两边到中间进行显示
MidToBoth(); //由中间到两边进行显示
}
}
四、 运行效果:
程序运行效果为:开机后,指示灯向从左向右依次点亮,从右向左依次点亮,由两边向中间依次点亮,由中间向两边依次点亮。
文章评论(0条评论)
登录后参与讨论