英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: PIC单片机或运算指令XORWF的应用 [打印本页]

作者: kingman    时间: 2009-4-18 19:54
标题: PIC单片机或运算指令XORWF的应用
PIC单片机的大多数寄存器,包括RAM数据存储器的每个存储单元都能实现移位、清位、位测试等系列复杂操作功能。然而,协调它们运行的(应用最广泛的基本级、中级)精简指令集中,却没有对寄存器的某进行取反运作的现成指令,而在实际应用中对某些进行取反运作是很需要的。如下图所示。单片机PIC16C622单片机的端口RB作为输出端口的8个引脚,分别控制着8个不同的电器设备。按动按钮AN一下,继电器J吸合,再按一下J释放,即按动AN一下,端口RB3引脚的输出状态改变一下,而RB口的其它7个引脚输出保持原有状态不变。在这种情况下最好的方法是按动一下AN,对PORTB(3)“取反一次”——这对于MCS51单片机来讲是极容易的。只要写一条(CPL P33)位取反指令就可以了。而PIC16C622单片机只有对字节取反指令,却没有对位取反的直接指令。笔者运用了“Wf相异或的指令,也轻易地解决了位取反问题。

 实例:
  MOVLW 0x08;将常数0x08送至
W
  XORWF 61  ;WF6相异或结

          
果存
F6
  这样就实现了对F6(3)RB3脚的取反运作。假如当时寄存器F6的状态为“B01101001”则经过上述指令运作后,有

  异或前 W   00001000
      F6
01101001
异或后 F6  01100001 结果寄存器F6的内容为“B01100001”。可见除了F6(3)“1”取反为“0”外,其它位保持不变,实现了预期的目的。这种方法,可以对寄存器其中的1位、2……几位同时取反”——只要对工作寄存器W送常数时,常数的相应上为逻辑“1”就可以了。
还有像两个数据比较一类程序的编写,通常人们是用减法指令来完成的。运用异或运算指令同样可以解决问题,
而且更为简洁(它只影响状态寄存器中的零标志位“Z”,对其它概不影响)。如建立时钟程序,当秒计数寄存器计数至60秒时,
应向分计数寄存器1”,若设秒计数寄存器为F20,分计数寄存器是F21
则定时器中断子程序为:
INTSUB1
    
INCF 20
1  ;秒计数寄存器F20          1”
MOVLW 0x3C
  ;把常数D‘60’置入W
XORWF 20
0   ;寄存器F20计数是
          ;否等于60
BTFSS STATUS
2 ;若F20的计数等于           60(零标志位Z=1)
GOTO INTSUB2 ;则跳
INCF 21
1   ;分计数寄存器F21
          1”
    
INTSUB2
  RETFIE ;中断返回
  从上述例子中可以看到,异或运算指令XORWFPIC中的其它指令一样,只要灵活运用其功能是非常强大的。

  





欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2