listp=16c73
:
actlonstopflagequOx6e;位定义
lefthandfla8cqu0x0;0表示停止左手动作
rightbandflagequOxl;O表示停止右手动作
:
MOV lwOx03
MOV Wfactionstopflag
calllefthanduo
callrighthandup
L2callreadinsignal
btfsscsl_v,lefthandhght3
calllefthatldotop
btfsscsl_v,righthandlight4
callrighthandstop
MOV lwOx00
subwfactionstopflag,w
btfssstatus,z
gotoL2
继续下面的程序
actionstopflag表示动作标志位参数,给动作标志位赋值,动作停止函数中将清零标志位的值。上述程序和前面所述程序的功能一样,实现两支手臂的动作。上面程序描写左手是否到达鼓掌位,到达停止,右手是否到达举手位,到达停止。看动作标志位是否为零,不是,不断地循环检测;是,执行下面的程序。
2、GOTO,CALL指令的不同使用
在PIC的汇编程序中,CALL与GOT0指冷使用的场合不同。一般情况下,在于程序与主程序之间大多用CALL指令;而状态转换模块之间大多用GOTO指令,即由此状态进入另一种状态不需返回。由于PIC 单片机 的堆栈有限,在程序中,不能无止境地使用GOTO语句,这样会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆栈的级数不多,使用GOTO指令是可行的,但在大的程序中用GOTO则无法返回到调用前程序的下一条指令。CALL指令完成调用完子程序后返回到调用前的程序。程序如下:
listD=16c76
start:ca11setcpu
callautomatlsn、statel
L3callreadinsignal
btfsccs2_v,ultrasonicdetectl
gotoL3
gotoautonatlsmstate2
:
automatlsmstate2:
return
auatomatismstatel、automatismstate2表示两种状态,uhrasonicdetectl表示一个输入超声检测信号。上面程序描写调用automatistmstate1状态,执行完后进行下面的检测ultrasonicdetect],没有触发就一直循环检测,触发就进入autornatismstate2状态,执行完也不再回到下面的程序。
3、状态标志位Z、C的不同使用情况
在进行判断标志位时,Z(零标志)、C(借位标志)是不同的。Z为l时,表示上面的结果为0,Z为0时,则结果不为0。C为l时,借位,C为0时,没有借位。在使用定时器的时候,一般使用C标志位,这是由于当完成某一动作去检查定时器时,时间可能没到,或是正好,或是已经超过时间,只要到了或超过时间,都要按照要求关闭定时器,如下面程序所述。如果用Z标志位,等于0时可能没有检测到,无法判断停止的状态,而用z可以很好地控制时间定时。进行一般的计算时大多用Z,如前面的动作标志位中就是如此使用的。
listD=16c76
callopentimerO
L4 MOV lwd’30’