The bit test and skip may be followed by a single instruction to be carried out conditionally, but GOTO and CALL allow a block of conditional code. Using GOTO label simply transfers the program execution point to some other point in the program indicated by a label in the first column of the source code line, but CALL label means that the program returns to the instruction following the CALL when RETURN is encountered at the end of the subroutine.
Another option, which is useful for making program data tables, is RETLW (Return with Literal in W). See the KEYPAD program later for an example of this. RETFIE (Return From Interrupt) is explained below.
CONTROL
NOP simply does nothing for one instruction cycle (four clock cycles). This may seem pointless, but is in fact very useful for putting short delays in the program so that, for example, external hardware can be synchronised or a delay loop adjusted for an exact time interval. In the LCD driver program (Chapter 4), NOP is used to allow in-circuit debugging to be incorporated later when the program is downloaded, and to pad a timing loop so that it is exactly
1 ms.
SLEEP stops the program, such that it can be restarted with an external interrupt. It should also be used at the end of any program that does not loop back continuously, to prevent the program execution continuing into unused locations. The unused locations contain the code 3FFF (all 1 s), which is a valid instruction (ADDLW FF). If the program is not stopped, it will run through, repeating this instruction, and start again when the program counter rolls over to 0000.
CLRWDT means clear the watchdog timer. If the program gets stuck in a loop or stops for any other reason, it will be restarted automatically by the watchdog timer. To stop this happening when the program is operating nor- mally, the watchdog timer must be reset at regular intervals of less than, say,
10 ms, within the program loop, using CLRWDT.