2.6 使用库函数实现流水灯
2.6.1 循环移位函数
使用C51库自带的循环左移或循环右移函数可以方便、简洁地实现流水灯。打开Keil\C51\HLP文件夹,再打开C51lib文件(这个文件是C51自带库函数的帮助文件),在索引栏可以找到循环左移函数crol和循环右移函数cror。这两个函数都包含在intrins.h这个头文件中。如果程序中要使用循环移位函数,则必须在程序的开头包含intrins.h这个头文件。
1.循环左移函数_crol_
函数的原形是unsigned char_crol(unsigned char 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位,于是变为1111 1010B,因此crol_(c,3)_的值为1111 1010B,temp=1111 1010B。每执行一次,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赋给P0口,使点亮的灯移动了一位。例如,第一次执行到第19行,循环移位后的值变为1111 1101B,temp=1111 1101B,然后再从上到下逐条执行,当执行到第13行时,temp的值(即1111 1101B)赋给P0,使P0^1=0,使VL1点亮,其余端口均为高电平,使其他的LED熄灭。这样,点亮的灯流动了一位。