51单片机水流灯入门(理解IO口的组操作)
51单片机流水灯入门(理解IO口的组操作)
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; }