51单片机快速入门之左移右移流水灯
左移操作:
- <<1 每次往左移动一位
- 假设一个八位数为0000 1111
- 当这个数左移一次之后 0 0001 1110
- 当这个数左移两次之后 00 0011 1100
注意观察 橙色 数字
Python代码如下: 0b表示这是一个二进制 注意这里前置0被省略了
右移操作:
- 1>> 每次往右移动一位
- 假设一个八位数为 1111 0000
- 当这个数右移一次之后 0111 1000 0
- 当这个数右移两次之后 0011 1100 00
注意观察 橙色 数字
Python代码如下: 0b表示这是一个二进制 注意这里前置0被省略了
51单片机代码
(注意 要移动的=要移动的 <<1 等同于 要移动的 <<=1)
理解了左移右移,我们开始51单片机 代码,以下是完整代码:
void main()
{
unsigned char i,TMP;
P1=0x01;//这里我的led 为低电平点亮 所以0000 0001 p1.0 会熄灭 其余灯点亮
for(; i<8; i++) {
P1 <<=1;
delay(60000);
}
}
void delay(unsigned int t)
{
while(--t);
}
// 第一次移动之后:
// 二进制: 0000 0010
// LED状态: p1.1会熄灭, p1.0点亮
// 第二次移动之后:
// 二进制: 0000 0100
// LED状态: p1.2会熄灭, p1.1点亮
// 第三次移动之后:
// 二进制: 0000 1000
// LED状态: p1.3会熄灭, p1.2点亮
// 第四次移动之后:
// 二进制: 0001 0000
// LED状态: p1.4会熄灭, p1.3点亮
// 第五次移动之后:
// 二进制: 0010 0000
// LED状态: p1.5会熄灭, p1.4点亮
// 第六次移动之后:
// 二进制: 0100 0000
// LED状态: p1.6会熄灭, p1.5点亮
// 第七次移动之后:
// 二进制: 1000 0000
// LED状态: p1.7会熄灭, p1.6点亮
以上代码有时候会遇到一个很严重的问题:
当我们直接操作P1时,程序有很大概率会跑飞,也就是说实际体现上不会执行移位效果,所以我们这里运用一个中间变量,先运算后应用以下是关键代码:
void delay(unsigned int t);//延时函数声明
void main()
{
unsigned char i,TMP;
TMP=0xff;
i=0;
for(;i<8;i++)
{ P1=TMP;//把中间变量赋值给 P1
delay(60000);//延迟一会
TMP<<=1;//变化中间变量,进入下一个循环
}
}
void delay(unsigned int t)
{
while(t--);
}
往右移动
void delay(unsigned int t);//延时函数声明
void main()
{
unsigned char i,TMP;
TMP=0x7f;
for(;i<8;i++)
{ P1=TMP;
delay(60000);
TMP>>=1;
}
}
void delay(unsigned int t)
{
while(t--);
}