版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpu_zhn/article/details/83025137
在上篇博文发出之后,有同学说,程序代码太繁琐了,不如用移位啊,数组啊一步就搞定了。由于是入门,我们当然是一步一步来了。这里我们来看一看实现流水灯的三种代码书写形式:
①顺序赋值式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
// 函数名称: main()
// 函数功能: 实现一个LED灯一闪一闪的效果
void main(void)
{
while(1)
{
LED1 = 0; //灯亮
delay(1000); //持续亮1s
LED1 = 1; //灯灭
delay(1000); //持续灭1s
LED2 = 0;
delay(1000);
LED2 = 1;
delay(1000);
LED3 = 0;
delay(1000);
LED3 = 1;
delay(1000);
LED4 = 0; //灯亮
delay(1000); //持续亮1s
LED4 = 1; //灯灭
delay(1000); //持续灭1s
LED5 = 0;
delay(1000);
LED5 = 1;
delay(1000);
LED6 = 0;
delay(1000);
LED6 = 1;
delay(1000);
LED7 = 0;
delay(1000);
LED7 = 1;
delay(1000);
}
}
这个便是我们昨天列出的程序,是的,这个程序代码十分冗长,但是这个程序最大的特点就是逻辑简单,用来入门,以及理解单片机的控制原理,以及sbit的用法,再合适不过了。这里对于这段代码我们就不多说了。
②移位操作式
#include <reg52.h>
#define uint unsigned int
/* ********************************************* */
// 函数名称: delay()
// 函数功能:毫秒延时
/* ********************************************* */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void main(void)
{
int i; //循环变量
while(1)
{
P2 = 0xff; //设定LED灯初始值
delay(1000);
for(i = 0;i < 8;i++)
{
P2 = P2 << 1; //移位、依次点亮
delay(1000); //延时
}
}
}
这段代码较上一段代码,很明显简明多了,但是逻辑性强了些,下面我们来解释一下功能函数,以及它的亮点之所在--移位。先说移位,即C语言中的移位运算符,左移运算符<<、右移运算符>>;对于移位运算符,我们简单地介绍一下,
<< 左移运算符:
移位规则:左边抛弃,右边补零
>>右移运算符
移位规则: 左边用0补充,右边丢弃;
具体函数来说,首先 赋值语句 P2 = 0xff; 0xff转换为二进制即是11111111,八个一,这里实现的作用便是给P2端口的8个I\O口全部赋高电平1,对于LED灯来说,也就是灭;接着for循环,i加1,往左移动一位,随着补0操作,即实现了对应端口的LED灯点亮,如此循环往复,也就实现了流水灯操作。
③数组赋值式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数组
/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P2 = table[i];
delay(300);
}
}
}