2.6 使用库函数实现流水灯
2.6.1 循环移位函数
使用C51库自带的循环左移或循环右移函数可以方便、简洁地实现流水灯。当我们打开Keil\C51\HLP文件夹,再打开C51lib文件(这个文件是C51自带库函数的帮助文件),在索引栏我们可找到循环左移函数_crol_和循环右移函数_cror_。这两个函数都包含在intrins.h这个头文件之中。所以,如果程序中要使用循环移位函数,则必须在程序的开头包含intrins.h这个头文件。
1.循环左移函数_crol_
函数的原形是:unsignedchar_crol_(unsignedch ar c,unsigned char b)。其中c是一个变量,b是一个数字。这是一个有返回值(前面不加void)、带参数的函数。它的意思是将字符C的二进制值循环左移b位。该函数返回的是移位后所得到的值。
例如,设c=0x5f=0101 1111B,执行一次temp=_crol_(c,3)_的过程是:将c循环左移3位,即:c的二进制数值的各位都左移3位,c的高3位(即010)会被移出,移到c的低3位,于是变为11111010B,所以_crol_(c,3)_的值为11111010B,temp=11111010B。每执行一次,c的二进制数值循环左移3位。
2.循环右移函数_cror_
函数的原形是:unsigned char_cror_(unsigned char c,unsigned char b)。每执行一次,c的二进制值会被循环右移b位,右移后所得到的值返回给该函数。
2.6.2 使用循环移位函数实现流水灯
1.任务书
8个LED由左至右间隔1s流动,其中每个LED亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
2.参考程序
3.部分程序代码详解
while(1)的{}内的语句是从上到下、循环地逐条执行的。每一次执行到第19行,temp的二进制数值就循环左移一位,移位后的值再赋给temp,当下一次执行第13行时,temp赋给P2口,使点亮的灯移动了一位。例如,第一次执行到第19行,循环移位后的值变为11111101B,temp=1111 1101B,然后再从上到下逐字逐条执行,当执行到第13行时,temp的值(即1111 1101B)赋给P2,使P^1=0,使D1点亮,其余端口均为高电平,使其他的LED熄灭。这样,点亮的灯流动了一位。