思路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); } } }