英锐恩单片机论坛,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)“
取反一次
”——
这对于
MCS
-
51
单片机来讲是极容易的。只要写一条
(
如
CPL P3
3)
位取反指令就可以了。而
PIC16C622
单片机只有对字节取反指令,却没有对位取反的直接指令。笔者运用了
“W
和
f
相异或
”
的指令,也轻易地解决了位取反问题。
实例:
MOVLW 0x08
;将常数
0x08
送至
W
XORWF 6
,
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”
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
;中断返回
从上述例子中可以看到,异或运算指令
XORWF
跟
PIC
中的其它指令一样,只要灵活运用其功能是非常强大的。
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2