MOVLW 0x08;将常数0x08送至W
XORWF6,1 ;W和F6相异或结
果存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”
MOVLW0x3C ;把常数D‘60’置入W
XORWF 20,0 ;寄存器F20计数是
;否等于60秒
BTFSS STATUS,2 ;若F20的计数等于 ;60(零标志位Z=1)
GOTO INTSUB2 ;则跳
INCF 21,1 ;分计数寄存器F21
;“增1”
…
INTSUB2 RETFIE;中断返回
从上述例子中可以看到,异或运算指令XORWF跟PIC中的其它指令一样,只要灵活运用其功能是非常强大的。
宁波 张春峰
