移位操作
<<:左移指令。被操作数的最高位移入单片机PSW寄存器的CY位,CY位中的数丢弃,最低位补0。
>>:右移指令。被操作数的最低位移入单片机PSW寄存器的CY位,CY位中的数丢弃,最高位补0。
循环左移:最高位移入最低位。_crol_实现。
循环右移:最低位移入最高位。_cror_函数实现。
PSW寄存器
程序状态字标志寄存器。8位寄存器,字节地址D0H。
sfr PSW = 0xD0;
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | CY | AC | F0 | RS1 | RS0 | OV | - | P |
CY:进位标志
- 表示运算是否有进位,如果操作结果在最高位有进位或者借位,则该位为1,否则为0。
AC:辅助进位标志
- 半进位标志,指两个8位数运算低四位是否有半进位,即低四位相加或相减是否进位,如有AC为1,否则为0。
F0:用户使用的状态标志位
- 可用软件来置1或清0。
RS1、RS0:4组工作寄存器区选择控制位
- 在汇编语言中,这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区。
OV:溢出标志位
- 反映带符号数的运算结果是否有溢出。
P:奇偶标志位
- 反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1,则P为0,否则为1。
流水灯程序
#include <reg52.h> //包含头文件
#include <intrins.h> //包含_crol_函数所在的文件
#define uint unsigned int //宏定义
#define uchar unsigned char
//sbit led1=P2^0; 单个led延时
//void delayms(uint xms)
//{
// uint i,j;
// for(i=xms;i>0;i--)
// {
// for(j=110;j>0;j--);
// }
//}
//void main()
//{
// while(1)
// {
// led1=0;
// delayms(2000);
// led1=1;
// delayms(2000);
// }
//}
void delayms(uint);
uchar aa;
void main()
{
aa=0xfe; //赋初值1111 1110
while(1)
{
P2=aa; //点亮一个led
delayms(500);
aa=_crol_(aa,1); //循环左移
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //延时xms
{
for(j=110;j>0;j--);
}
}