解答:
实现流水灯有很多种方法,主要运用程序变量类型、运算符、逻辑结构、
数据结构等软件设计思维来实现对应的效果。
位移法
(1)、运用右移位运算符”<<”,对变量 0x01 进行右移 i 位的操作;然
后再用按位取反运算法”~”来实现对移位后变量的取反变换,对应硬件电
路的功能。
LEDVar=0x01; //对应的二进制:0000 0001
while(1)
{
for(i=0;i<8;i++)
{
P1=~(LEDvar<
DelayXms(1000);
}
}
(2)、运用 C51 自带库函数中的循环右移_crol_函数来实现对 0xFE 的循
环右移操作,注意使用此函数要加上它的头文件,即#include。
LEDVar=0xFE; //对应的二进制:1111 1110
while(1)
{
for(i=0;i<8;i++)
{
P1=_crol_(LEDVar,i);
DelayXms(1000);
}
}
查表法
unsigned char i;
unsigned char code LEDTable[]=
{
//把流水效果对应的变量值预先存储在一个数组里面,并依次访问
它
0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F
};
…………
(1)在循环中渐增索引值 i 的大小,并加上 if 判断条件,以保证索引
值 i 始终访问数组的合理范围。
i=0;
while(1)
{
P1=LEDTable[i];
i++;
if(i>=8)i=0;
DelayXms(1000);
}
(2)通过对索引值 i 进行取余操作,来保证索引值 i 始终访问数组的
合理范围
i=0;
while(1)
{
P1=LEDTable[i%8]; //i%8 的值为 0-7
DelayXms(1000);