立即数与控制操作指令
SLEEP 单片机进入低功耗休眠模式
语法形式:SLEEP
操作数:无
执行时间:一个指令周期
执行过程:
看门狗计数器清0
看门狗计数器的预分频器清0
STATUS寄存器的“TO”标志位置1
STATUS寄存器的“PD”标志位清0
状态标志影响:TO PD
说明:SLEEP指令可以让单片机停止所有的工作进入低功耗休眠模式,在休眠模式下芯片的功耗降至最低。在休眠状态下,单片机的主时钟振荡器将停止,所有内部寄存器的内容保持不变,直到出现某一条件将单片机从休眠状态下唤醒。
指令范例:
CALL PrepSleep ;关闭所有不需要的负载,准备进入休眠模式
SLEEP ;现在进入休眠模式
NOP ;唤醒后开始执行指令
CLRWDT 清除看门狗计数器
语法形式:CLRWDT
操作数:无
执行时间:一个指令周期
执行过程:
看门狗计数器清0
看门狗计数器的预分频器清0
STATUS寄存器的“TO”标志位置1
STATUS寄存器的“PD”标志位置1
状态标志影响:TO PD
说明:如果芯片在编程烧写时启用了独立的片上看门狗电路,则在程序运行的过程中必须隔一段时间就执行这条清除看门狗的命令。如果过了足够长的时间而没有执行这条指令,到了看门狗计数器计数溢出时就会让单片机产生复位,程序将会从复位地址处重新运行。PIC单片机的看门狗一旦被打开就不能通过软件的方式关闭,在芯片休眠的时候照样工作,故可以作为让单片机退出休眠的一个条件。通过启用看门狗可以避免软件死循环的故障。需要强调的是在一个好的程序设计中CLRWDT这条指令只在程序的主循环中出现一次,尽量避免到处放置清看门狗指令,绝对不能把这条指令放到中断服务程序中。
指令范例:
MainLoop:~~~ ;程序主循环
CLRWDT ;清看门狗
CALL KeyCheck ;检查按键
CALL Display ;显示刷新
GOTO MainLoop ;重复主循环体
RETLW 子程序结束返回并在W寄存器内赋一8位立即数
语法形式:RETLW k
操作数:k为8位立即数
执行时间:2个指令周期
执行过程:弹出栈顶内容到PC
k→W
状态标志影响:无
说明:除了在子程序返回时从W寄存器带出一个8位立即数外,其他的执行情况和指令“RETURN”完全相同。该指令经常被用于查表功能中。
指令范例:
MOVF Index,W ;W中设定查表索引值(0~3)
CALL Lookup ;调用查表子程序
…… ;其他指令
Lookup:ADDWF PCL,f ;对PC值作修改
RETLW ‘0’ ;返回0对应的ASCII码
RETLW ‘1’ ;返回1对应的ASCII码
RETLW ‘2’ ;返回2对应的ASCII码
RETLW ‘3’ ;返回3对应的ASCII码
RETFIE 中断服务程序结束并返回
语法形式:RETFIE
操作数:无
执行时间:2个指令周期
执行过程:弹出栈顶内容到PC
INTCON寄存器的第7位GIE自动置1
状态标志影响:无
说明:该指令把硬件堆栈栈顶的内容(中断发生时的返回地址)弹送到程序计数器PC内,对堆栈的影响如下图所示
和指令“RETURN”的情形基本相同,关键区别是该指令会把INTCON寄存器的第7位全局中断使能位(GIE)置1(在响应中断时该位自动清0)。然后返回到中断发生时的下一条指令处继续运行。
指令范例:
MOVF status_temp,w ;准备恢复STATUS寄存器的内容
MOVWF STATUS ;STATUS寄存器被恢复
SWAPF w_temp,f ;准备恢复W寄存器内容
SWAPF w_temp,w ;W寄存器被恢复
RETFIE ;中断返回并允许新的中断响应
RETURN 子程序结束返回
语法形式:RETURN
操作数:无
执行时间:2个指令周期
执行过程:弹出栈顶内容到PC
状态标志影响:无
说明:该指令将栈顶的内容(子程序调用时的返回地址)弹送到程序计数器PC内。注意特殊寄存器PCLATH的内容不会因此改变。程序将会回到在子程序调用时的下一条指令处开始执行。
影响见该图
指令范例:
CALL Dly4Tcy ;延时4个指令周期
…… ;其他指令
Dly4Tcy:RETURN ;CALL和RETURN总共消耗4个指令周期