python流水灯 闪烁 实现流水灯的代码
转载
在上篇博文发出之后,有同学说,程序代码太繁琐了,不如用移位啊,数组啊一步就搞定了。由于是入门,我们当然是一步一步来了。这里我们来看一看实现流水灯的三种代码书写形式:
①顺序赋值式
#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);
}
}
}
不得不说,这段代码,就是前两串代码的进阶版了,因为这里引用到了数组,我也最欣赏这种代码的书写方式。
具体代码而言:
uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; 对于数组定义,方便分析,我们把所有十六进制转换为二进制:
0xfe:11111110 0xfd:11111101 0xfb:11111011 0xf7:11110111 ;
0xef:11101111 0xdf:11011111 0xbf:10111111 0x7f:01111111 ;
这样一写,我们就看的很清楚了,和上一串代码中的移位操作,可以说有异曲同工之妙。
具体功能函数而言,很简单,就是一个for循环,i累加一次,给P2端口赋一个值,数组的定义我们知道,
table[0] = 0xfe、table[1] = 0xfd、table[2] = 0xfb ......table[7] = 0x7f ; 这里明白为什么要定义这样的数组了吧,P2口共8个端口,我们每次一个位置0,给低电平,其余位都给高电平,再加上延迟函数,即实现了流水灯,这里解释一下,延时函数中的数字是我们可以更改的,以调试效果最佳为好。
好了,以上就是这三种实现代码了,后面有很好了,我们再补充。
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。