51系列单片机逻辑运算类指令系统


  51系列有24条逻辑运算类指令,逻辑与(ANL)、逻辑或(ORL)、逻辑异或指令各6条,累加器A清零、求反指令各1条,循环移位指令4条。除了以A为目标操作数的指令对标志位P有影响,A带进位位循环左移、右移指令对CY有影响外,其余指令均不对任何标志位产生影响。

  1.逻辑与指令
  
  逻辑与指令是将目标操作数与源操作数按位相与,由于1∧1=1,1∧=O,因此逻辑与指令通常用于将某字节中的指定位清零,其余位保持不变的场合。如P1口的高4位为键盘输入口,低4位作其他用途,要读取键盘的状态并存于A中,可用以下指令:  

  MOVA.P1:(P1)→AANLA,#0FOH;低4位清零SWAPA;A高4位与低4位互换执行以上3条指令后,P1口高4位的键盘的状态就存放在累加器A的低4位中了。

  2.逻辑或指令
  
  逻辑或指令是将目标操作数与源操作数按位相或,由于1∨1=1,1∨O=1,0∨0=0,因此逻辑或指令通常用于将某字节中的指定位置1,其余位保持不变的场合。如P27口为输出控制口,该口置1继电器通电,该口清零继电器断电,要控制继电器通电、断电,又不影响P2口的其他位的状态,可用以下指令:

  ORLP2,#80H;P27置1,继电器通电ANLP2,#7FH;P27清零,继电器断电
  
  3.逻辑异或指令
  
  逻辑异或指令是将目标操作数与源操作数按位相异或,由于1(+)1=O,0(+)=1,0(+)0=0,1(+)0=1,即当用1与某位异或时,原来为1的变为O,原来为O的变为1,而当用O与某位异或时,该位的状态保持不变。因此,逻辑异或指令可用于将操作数中指定位求反,其余位不变的场合。如P1口接了8只,要让8只隔两只亮两只,每0.5秒交换一次,可用如下指令:

  L1:MOVP1.#33HL2:CALLD05SXRLP1.#OFFHAJMPL2其中,D05S是延时0.5S子程序,此处略。

  4.循环移位指令
  
  有4条针对累加器的循环移位指令,分别是A循环左移一位、带进位位循环左移一位、循环右移一位、带进位位循环右移一位。应当注意的是,执行带进位位循环移指令之前,应当根据程序的需要先将进位位CY清零或置1。我们在第九讲的7位数码动态显示的程序中就使用了累加器A循环右移指令来改变单片机P2口输出的位控信号,相关语句如下:

  MOVR2,#40H;01000000B→R2,指向显示首位P26MOVP2.R2;位码送P2,相应的数码管点亮MOVA.R2:

  修改R2:R2→ARRA:A右环移1位,如原为01000000B,则现为00100000B,指向P25MOVR2,A:

  A→R2上述程序假设P27口的状态应为0,如果P27口的状态应为1,则该程序可改为:

  MOVR2.#40H;01000000B→R2,指向显示首位P26MOVA.R2;R2→AORLA.#80H:1→A7MOVP2,A;位码送P2,相应数码管点亮,P27置1MOVA,R2:修改R2:R2→ARRA;A右环移1位,如原为01000000B,则现为00100000B,指向P25MOVR2.A:A→R2从以上实例可以看出,灵活地使用逻辑运算类指令可以帮助我们方便地控制I/O口的状态,改变各种数据。