标题一:左右位移的理解和使用
标题二:编程思路
标题三:实验总结
左右位移:
C语言提供了两种位移操作符:
1.左位移操作符(<<):将一个数的二进制位全部左移若干位,左边操作数的右边空出的位用0补上,对于左边操作数,其左边超出的位将被丢弃。
2.右移操作符(>>):将一个数的各二进制位全部右移若干位,右边操作数的左边空出的位根据数的进行填补,如 1111 1110 右移一位为 0111 1111。
编程思路:
该单片机低电平LED亮灯想要实现流水灯有如下两种流水灯模式:
1.:0111 1111 0011 1111 0001 1111 0000 1111 0000 0111 0000 0011 0000 0001 0000 0000
2.:0111 1111 1011 1111 1101 1111 1110 1111 1111 0111 1111 1011 1111 1101 1111 1110
对于第一种都是在初始状态0111 1111的基础上左移0~7位实现的,那么就可以使用for循环来实现,对于第二种因为我们观测可以得到左右位移只会添加零元素,因此在0000 0001中进行位移操作后在进行取反(~)操作即可如0000 0001左位移0为 0000 0001 取反为 1111 1110 ,0000 0001左位移1为0000 0010 取反为 1111 1101....依次进行下去即可实现
以下是代码实现
1.
#include <STC15F2K60S2.H>
#include "intrins.h"
//关闭外设
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void mian()
{
unsigned char i;
cls_buzz();
while(1)
{
for(i=0;i<8;i++)
{
P2=((P2&0x1f)|0x80);
P0=0xfe<<i;
Delay500ms();
P2&=0x1f;
}
}
}
2.
#include <STC15F2K60S2.H>
#include "intrins.h"
//关闭外设
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void mian()
{
unsigned char i;
cls_buzz();
while(1)
{
for(i=0;i<8;i++)
{
P2=((P2&0x1f)|0x80);
P0=~(0x01<<i);
Delay500ms();
P2&=0x1f;
}
}
}
实验总结:在单片机编程中大多都是十六进制其中涉及大量的二进制操作,对于左右位移的操作需要熟练。