51单片机流水灯入门(理解IO口的组操作)

来源:互联网 发布:北大青鸟消防编程公式 编辑:程序博客网 时间:2024/04/29 21:43

P1口接8个LED的负极,然后LED的正极经过电阻直接接Vcc


1:手工实现

1  流水灯单个闪过代码

#include <reg52.h>void delayms(int X){int i, j;for(i = X;  i ; --i)for(j = 110;j ; --j);return;}int main(){int i;for(i = 0; i < 8; ++i){P1 = 0xff - (1 << i);delayms(500);}return 0;}

PS:给新同学解释下,单个引脚赋值0的时候点亮

(P1只能采用十六进制数来赋值)

0xff的二进制 :             1 1 1 1 1 1 1 1 

如果要点亮第一个:    1 1 1 1 1 1 1 0

同理要点亮第二个:    1 1 1 1 1 1 0 1

即要点亮第二个,需要把 二进制的 11111101转换成十六进制数,然后赋值给P1口。

11111101的由来:

                                        1 1 1 1 1 1 1 1       => 0xff

                                   -    0 0 0 0 0 0 1 0       => 1 << 1

                                  =    1 1 1 1 1 1 0 1       =>OK~

所以代码中赋值语句为 : P1 = 0xff - (1 << i);   记住要给<<加括号哦~   (运算符优先级问题);

最后的delayms为延时函数。


2:8个灯逐个点亮,最后全亮

#include <reg52.h>void delayms(int X){int i, j;for(i = X;  i ; --i)for(j = 110;j ; --j);return;}int main(){int i, j = 0xff;for(i = 0; i < 8; ++i){P1 = j <<= i;delayms(500);}return 0;}

2:库函数实现

#include <reg52.h>#include <intrins.h>/* _crol_ (value, ctr) *//* _cror_ (value, ctr) */void delayms(int x){int i, j;for(i = x; i; --i)for(j= 110; j; --j);return ;}int main(){int dps = 0xfe;while(1){P1 = dps;delayms(500);dps = _crol_(dps, 1);}return 0;}



原创粉丝点击