思路1:
根据流水灯实现原理,即 IO 口由低往高或者由高往低逐个输出低电平特点,那么我们可以将移位操作以及循环结合进来。
进入 main 函数后首先定义一个变量 i,然后进入 while 循环,由于要实现 8个 LED 从 D1->D8 循环点亮,因此可以使用 for 循环语句循环 8 次,每循环一次,点亮的小灯向右移动一个,而 D1-D8 是连接到 P2.0-P2.7 的,因此输出的低电平要左移一位,因此可以使用 LED_PORT=~(0x01<<i);语句实现。0X01<<i 表示 i增加 1 次,0x01 中的 1 就移动多少位,因为 1(高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 LED_PORT 口,并且每次循环都要延时一段时间,这样才能分辨出来 LED 在实现流水灯。
代码如下:
原始代码如下:
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define LED_PORT P2
void delay_time(u16 ten_us)
{
while(ten_us--);
}
void time()
{
while(1)
{
u8 i=0;
for(i=1;i<=8;i++)
{
LED_PORT=(~0x01<<1);//循环亮灯
delay_time(50000);//延时
}
}
}
思路2:
使用左移_crol_、右移_cror_函数
除了使用 for 循环语句实现移位,KEIL C51 软件内还有对应的移位库函数,
左移函数是_crol_(),右移函数是_cror_(),要使用这两个函数在我们的程序中
必须包含 intrins.h 头文件。这两个移位函数大家可以百度了解下,其内部实现
过程是看不到的,该移位函数实现的移位功能就相当于一个队列内循环移动,如
果是左移,那么最高位就被移到最低位了,次高位变为最高位,依次类推。
代码如下:
原始代码如下:
#include"reg52.h"
#include"intrins.h"
//使用corl和cror函数需要头文件
typedef unsigned char u8;
typedef unsigned int u16;
#define PORT_LED P2
u8 delay_time(u16 ten_us)
{
while(ten_us--);
}
void main()
{
while(1)
{
u8 i=0;
for(i=0;i<=8;i++)//左移
{
PORT_LED=(_crol_(PORT_LED,1));
//crol是左移操作函数,需要传参
//第一个参数是目标值,第二个是移动几个
delay_time(50000);
}
for(i=0;i<7;i++)//右移
{
PORT_LED=(_cror_(PORT_LED,1));
//crol是右移操作函数,需要传参
//第一个参数是目标值,第二个是移动几个
delay_time(50000);
}
}
}