让第一个小灯到最后一个依次闪烁,可以用移位来达到目的。
单片机有一个库文件已经写好了移位函数,储存在#include <intrins.h>库文件里。
1 _crol_字符循环左移
字符循环左移:
#include <reg52.h>
#include <intrins.h>
char tmp;
void delay() //延时函数
{
int i;
for(i=0;i<8888;i++)
;
}
void main()
{
tmp=0xfe;
P1=tmp; //第一个小灯亮
while(1)
{
tmp=_crol_(tmp,1); //字符左移
delay();
P1=tmp; //第二个小灯亮
}
}
运行程序可以看到第一个小灯,第二个小灯…依次闪烁。
2 _cror_字符循环右移
将代码tmp=_crol_(tmp,1);中的crol改成cror.
#include <reg52.h>
#include <intrins.h>
char tmp;
void delay() //延时函数
{
int i;
for(i=0;i<8888;i++)
;
}
void main()
{
tmp=0xfe;
P1=tmp;
while(1)
{
tmp=_cror_(tmp,1); //字符右移
delay();
P1=tmp;
}
}
运行程序后,可以看到第一个小灯,第八个小灯,第七个小灯…依次闪烁。
3 扩展(蜂鸣器)
加上蜂鸣器,蜂鸣器响一下,灯亮一下:
//flow light and beep
#include <reg51.h>
#include <intrins.h>
unsigned char a,b,k,j;
sbit beep=P2^3;
void delay10ms()
{
for(a=100;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
k=0xfe;
while(1)
{
delay10ms();
beep=0;
delay10ms();
beep=1;
j=_crol_(k,1);
k=j;
P1=j;
}
}
2+