单片机-Led

移位操作

<<:左移指令。被操作数的最高位移入单片机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--);
	}
}
赞赏