第八篇提到了一种制作流水灯的方式,可是代码显得很冗杂,仔细想想原因也就是当时用的位定义,每一步操作都需要对位进行操作,那我们是否有一种方法可以不对位操作,而是直接对那一组端口进行操作呢?理论上说是可以做到的,还是用上一篇的原理图,简单操作一下。当然,对于51来说,对整组端口进行操作制作出流水灯的效果还是有两种方案。首先用到了我们在第四篇“各种各样的符号你认识吗”中的左移右移,按自己的需求进行选择。第一种,我们以从led1到led8依次点亮作为例子来讲解。
#include<reg51.h>
void delay()
{
int x,y,z;
for(x=0;x<100;x++)
for(y=0;y<100;y++)
for(z=0;z<100;z++);}
int main()
{
int i;
unsigned char temp;
temp=0x01;
for(i=0;i<8;i++)
{PA=temp;
temp<<=1;
delay();}
}
程序很简单吧,很短,比上一篇提到的要少不少吧!这就是直接对整组端口惊醒操作。有一点需要指出来,就是许多51的板子上用的并不是PA,而是P1,这一点一定要注意,总的来说,问题不大,详情大家可以比照前面写过的一篇文章点亮一个LED比对一下,运行一下FOR函数的执行方式,很容易就可以了解到这个程序的运行方式。
第二种程序也很简单,就是加入了一个库,少了一些其他的东西。
#include<reg51.h>
#include<intrins.h>
void delay()
{
int x,y,z;
for(x=0;x<100;x++)
for(y=0;y<100;y++)
for(z=0;z<100;z++);}
int main()
{
int i;
unsigned char temp;
temp=0x01;
while(1)
{
P1=temp;
delay();
temp= _crol_(temp,1);}
}
第二种方法和第一种方法差不多,只是引入了一个新的库函数,intrin.h;在这个库里有一个子函数是_crol_(char s,int x)和_cror_(char s,int x)分别是将s按位左移和右移x位,当然,这个是循环的,当左移时1到达最高位,下一次左移一位时,1便是最低位。