"); //-->
做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
每次送出的数据是不同,具体的数据如下表1所示
P1.7 |
P1.6 |
P1.5 |
P1.4 |
P1.3 |
P1.2 |
P1.1 |
P1.0 |
说明 |
D8 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
L1亮 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
L2亮 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
L3亮 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
L4亮 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
L5亮 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
L6亮 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
L7亮 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
L8亮 |
程序编写
第一种用最直接最为笨拙的方法,把每次的值赋给端口P1,如下:
#include<reg51.h>
void delay()
{
int i, j;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
void main()
{
while(1){
P1=0xfe;
delay();
P1=0xfd;
delay();
P1=0xfb;
delay();
P1=0xf7;
delay();
P1=0xef;
delay();
P1=0xdf;
delay();
P1=0xbf;
delay();
P1=0x7f;
delay();
P1=0xbf;
delay();
P1=0xdf;
delay();
P1=0xef;
delay();
P1=0xf7;
delay();
P1=0xfb;
delay();
P1=0xfd;
delay();
//P1=0xfe;
//delay();
}
}
这种方法比较的繁琐,但是在于直接。
第二种方法,利用左移右移,灯每次左移或右移一次,根据C语言的左移右移的方法来编写程序。如下:
#include<reg51.h>
unsigned char i;
unsigned char temp;
unsigned char a,b;
void delay()
{
int i, j;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
void main()
{
temp=0xfe;
P1=temp ;
delay();
while(1){
for(i=1;i<8;i++) {
a=temp<<(i);
b=temp>>(8-i);
P1=a | b;
delay();
}
for(i=1;i<=8;i++) {
a=temp>>(i);
b=temp<<(8-i);
P1=a | b;
delay();
}
}
}
这种方法对C语言的基础要求掌握比较好,要弄清楚C语言中左移右移的关系,不然就不容易理解为什么a左移,b右移,然后相或,就能让对应的端口值为0 ,让对应的灯亮,同理右移时。
这是广告灯的左移右移,我们还可以变化其他的样式,编写对应的程序即可实现。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。