]PARALLAX PIC16Cxx INSTRUCTION SET AND PRE-DEFINED SYMBOLS - PASMX v1.0 supports: PIC16C71, PIC16C84, PIC16C64 ------------------------------------------------------------------------------------------------------------------------------- Instruction Words Flags W used Description ------------------------------------------------------------------------------------------------------------------------------- ======================== byte-oriented operations ======================== mov w,#literal 1 - - Move literal into w mov w,fr 1 Z - Move fr into w mov fr,w 1 - - Move w into fr mov fr,#literal 2 - W Move literal into fr mov fr1,fr2 2 Z W Move fr2 into fr1 add w,#literal 1 C,DC,Z - Add literal into w add w,fr 1 C,DC,Z - Add fr into w add fr,w 1 C,DC,Z - Add w into fr add fr,#literal 2 C,DC,Z W Add literal into fr add fr1,fr2 2 C,DC,Z W Add fr2 into fr1 mov w,#literal-w 1 C,DC,Z - Move literal-w into w mov w,fr-w 1 C,DC,Z - Move fr-w into w sub fr,w 1 C,DC,Z - Subtract w from fr sub fr,#literal 2 C,DC,Z W Subtract literal from fr sub fr1,fr2 2 C,DC,Z W Subtract fr2 from fr1 and w,#literal 1 Z - AND literal into w and w,fr 1 Z - AND fr into w and fr,w 1 Z - AND w into fr and fr,#literal 2 Z W AND literal into fr and fr1,fr2 2 Z W AND fr2 into fr1 or w,#literal 1 Z - OR literal into w or w,fr 1 Z - OR fr into w or fr,w 1 Z - OR w into fr or fr,#literal 2 Z W OR literal into fr or fr1,fr2 2 Z W OR fr2 into fr1 xor w,#literal 1 Z - XOR literal into w xor w,fr 1 Z - XOR fr into w xor fr,w 1 Z - XOR w into fr xor fr,#literal 2 Z W XOR literal into fr xor fr1,fr2 2 Z W XOR fr2 into fr1 clr w 1 Z - Clear w clr fr 1 Z - Clear fr mov w,++fr 1 Z - Move fr+1 into w inc fr 1 Z - Increment fr mov w,--fr 1 Z - Move fr-1 into w dec fr 1 Z - Decrement fr mov w,>>fr 1 C - Move right-rotated fr into w rr fr 1 C - Rotate right fr mov w,<fr 1 - - Move nibble-swapped fr into w swap fr 1 - - Swap nibbles in fr not w 1 Z - Perform 1's-complement on w mov w,/fr 1 Z - Move 1's-complemented fr into w not fr 1 Z - Perform 1's-complement on fr test w 1 Z - Test w for zero test fr 1 Z - Test fr for zero ======================= bit-oriented operations ======================= clrb bit 1 - - Clear bit clc 1 - - Clear carry clz 1 - - Clear zero setb bit 1 - - Set bit stc 1 - - Set carry stz 1 - - Set zero movb bit1,bit2 4 - - Move bit2 into bit1 movb bit1,/bit2 4 - - Move not bit2 into bit1 ============================ inc/dec-conditional branches ============================ movsz w,++fr 1 - - Move fr+1 into w and skip if zero incsz fr 1 - - Increment fr and skip if zero ijnz fr,address 2 - - Increment fr and jump if not zero movsz w,--fr 1 - - Move fr-1 into w and skip if zero decsz fr 1 - - Decrement fr and skip if zero djnz fr,address 2 - - Decrement fr and jump if not zero ============================ compare-conditional branches ============================ csa fr,#literal 3 C,DC,Z W Compare and skip if above csa fr1,fr2 3 C,DC,Z W Compare and skip if above csae fr,#literal 3 C,DC,Z W Compare and skip if above or equal csae fr1,fr2 3 C,DC,Z W Compare and skip if above or equal csb fr,#literal 3 C,DC,Z W Compare and skip if below csb fr1,fr2 3 C,DC,Z W Compare and skip if below csbe fr,#literal 3 C,DC,Z W Compare and skip if below or equal csbe fr1,fr2 3 C,DC,Z W Compare and skip if below or equal cse fr,#literal 3 C,DC,Z W Compare and skip if equal cse fr1,fr2 3 C,DC,Z W Compare and skip if equal csne fr,#literal 3 C,DC,Z W Compare and skip if not equal csne fr1,fr2 3 C,DC,Z W Compare and skip if not equal cja fr,#literal,address 4 C,DC,Z W Compare and jump if above cja fr1,fr2,address 4 C,DC,Z W Compare and jump if above cjae fr,#literal,address 4 C,DC,Z W Compare and jump if above or equal cjae fr1,fr2,address 4 C,DC,Z W Compare and jump if above or equal cjb fr,#literal,address 4 C,DC,Z W Compare and jump if below cjb fr1,fr2,address 4 C,DC,Z W Compare and jump if below cjbe fr,#literal,address 4 C,DC,Z W Compare and jump if below or equal cjbe fr1,fr2,address 4 C,DC,Z W Compare and jump if below or equal cje fr,#literal,address 4 C,DC,Z W Compare and jump if equal cje fr1,fr2,address 4 C,DC,Z W Compare and jump if equal cjne fr,#literal,address 4 C,DC,Z W Compare and jump if not equal cjne fr1,fr2,address 4 C,DC,Z W Compare and jump if not equal ======================== bit-conditional branches ======================== sb bit 1 - - Skip if bit sc 1 - - Skip if carry sz 1 - - Skip if zero snb bit 1 - - Skip if not bit snc 1 - - Skip if not carry snz 1 - - Skip if not zero jb bit,address 2 - - Jump to address if bit jc address 2 - - Jump to address if carry jz address 2 - - Jump to address if zero jnb bit_addr,address 2 - - Jump to address if not bit jnc address 2 - - Jump to address if not carry jnz address 2 - - Jump to address if not zero ====================== unconditional branches ====================== skip 1 - - Skip following instruction word jmp address 1 - - Jump to address jmp pc+w 1 C,DC,Z - Add w into pcl jmp w 1 - - Move w into pcl call address 1 - - Call to address ret 1 - - Return from call retw literal,literal... 1 - - Return from call with literal in w reti 1 - - Return from interrupt Note: Skips should be followed only by single-word instructions. ========================== i/o and control operations ========================== mov !port_fr,w * 1 - - Move w into port_fr's tris mov !port_fr,#literal * 2 - W Move literal into port_fr's tris mov !port_fr,fr * 2 Z W Move fr into port_fr's tris mov !option,w * 1 - - Move w into option mov !option,#literal * 2 - W Move literal into option mov !option,fr * 2 Z W Move fr into option clr wdt 1 TO,PD - Clear wdt and prescaler sleep 1 TO,PD - Clear wdt and enter sleep mode nop 1 - - No operation * Not supported by PIC16C64 ========== directives ========== device setting,setting... Establish device parameters id 'text' Set id to 4-character text string label = value Equate label to value label equ value Equate label to value org address Set origin to address ds locs Define space: origin=origin+locs eeorg address (PIC16C84 only) Set data eeprom origin to address eedata data,data... (PIC16C84 only) Preload data eeprom with data include 'filename' Include file 'filename' in assembly end End assembly (not needed) ------------------------------------------------------------------------------------------------------------------------------- Pre-Defined Symbols ------------------------------------------------------------------------------------------------------------------------------- ******** Dynamic Equates (always reflect current values) $ = Current origin % = Current EEPROM origin (PIC16C84 only) ******** DEVICE directive equates - establish device and fuse settings Example: DEVICE PIC16C71,XT_OSC,WDT_ON,PWRT_OFF,PROTECT_ON PIC16C71 = 0000h Device (select one) PIC16C84 = 0100h PIC16C64 = 0200h LP_OSC = 001Ch Oscillator (select one) XT_OSC = 011Ch HS_OSC = 021Ch RC_OSC = 031Ch WDT_OFF = 001Bh Watchdog timer (select one) WDT_ON = 041Bh PWRT_OFF = 0017h Power-up timer (select one) PWRT_ON = 0817h PROTECT_ON = 000Fh Code protection (select one) Affects both bits on the PIC16C64 PROTECT_OFF = 100Fh ******** PIC16C71 Equates - enabled by DEVICE PIC16C71 page INDIRECT = 00h 0 Indirect addressing register RTCC = 01h 0 Real time clock/counter register PCL = 02h 0 Program counter low-byte register STATUS = 03h 0 Status register C = STATUS.0 0 Carry bit DC = STATUS.1 0 Digit carry bit Z = STATUS.2 0 Zero bit PD = STATUS.3 0 Power down bit TO = STATUS.4 0 Time out bit RP0 = STATUS.5 0 Register page bit 0 RP1 = STATUS.6 0 Register page bit 1 IRP = STATUS.7 0 Indirect register page bit FSR = 04h 0 File select register PORTA = 05h 0 RA i/o register RA = 05h 0 RA i/o register PORTB = 06h 0 RB i/o register RB = 06h 0 RB i/o register ADCON0 = 08h 0 ADC control register 0 ADON = ADCON0.0 0 ADC power control bit ADIF = ADCON0.1 0 ADC interrupt flag bit GO_DONE = ADCON0.2 0 ADC go command / done flag bit CHS0 = ADCON0.3 0 ADC channel select bit 0 CHS1 = ADCON0.4 0 ADC channel select bit 1 ADCS0 = ADCON0.6 0 ADC clock select bit 0 ADCS1 = ADCON0.7 0 ADC clock select bit 1 ADRES = 09h 0 ADC result register PCLATH = 0Ah 0 Program counter high-byte register INTCON = 0Bh 0 Interrupt control register RBIF = INTCON.0 0 RB4-RB7 change interrupt flag bit INTF = INTCON.1 0 RB0/INT interrupt flag bit RTIF = INTCON.2 0 RTCC overflow interrupt flag bit RBIE = INTCON.3 0 RB4-RB7 change interrupt enable bit INTE = INTCON.4 0 RB0/INT interrupt enable bit RTIE = INTCON.5 0 RTCC overflow interrupt enable bit ADIE = INTCON.6 0 ADC interrupt enable bit GIE = INTCON.7 0 Global interrupt enable bit OPTION = 01h 1 OPTION register PS0 = OPTION.0 1 Prescaler bit 0 PS1 = OPTION.1 1 Prescaler bit 1 PS2 = OPTION.2 1 Prescaler bit 2 PSA = OPTION.3 1 Prescaler assignment bit RTE = OPTION.4 1 RTCC signal edge bit RTS = OPTION.5 1 RTCC signal source bit INTEDG = OPTION.6 1 RB0/INT edge select bit RBPU = OPTION.7 1 RB weak pull-up enable bit TRISA = 05h 1 RA tristate control register TRISB = 06h 1 RB tristate control register ADCON1 = 08h 1 ADC control register 1 PCFG0 = ADCON1.0 1 RA port configuration bit 0 PCFG1 = ADCON1.1 1 RA port configuration bit 1 ******** PIC16C84 Equates - enabled by DEVICE PIC16C84 page IND0 = 00h 0 Indirect addressing register INDIRECT = 00h 0 Indirect addressing register RTCC = 01h 0 Real time clock/counter register PCL = 02h 0 Program counter low-byte register STATUS = 03h 0 Status register C = STATUS.0 0 Carry bit DC = STATUS.1 0 Digit carry bit Z = STATUS.2 0 Zero bit PD = STATUS.3 0 Power down bit TO = STATUS.4 0 Time out bit RP0 = STATUS.5 0 Register page bit 0 RP1 = STATUS.6 0 Register page bit 1 IRP = STATUS.7 0 Indirect register page bit FSR = 04h 0 File select register PORTA = 05h 0 RA i/o register RA = 05h 0 RA i/o register PORTB = 06h 0 RB i/o register RB = 06h 0 RB i/o register EEDATA = 08h 0 EEPROM data register EEADR = 09h 0 EEPROM address register PCLATH = 0Ah 0 Program counter high-byte register INTCON = 0Bh 0 Interrupt control register RBIF = INTCON.0 0 RB4-RB7 change interrupt flag bit INTF = INTCON.1 0 RB0/INT interrupt flag bit RTIF = INTCON.2 0 RTCC overflow interrupt flag bit RBIE = INTCON.3 0 RB4-RB7 change interrupt enable bit INTE = INTCON.4 0 RB0/INT interrupt enable bit RTIE = INTCON.5 0 RTCC overflow interrupt enable bit EEIE = INTCON.6 0 EEPROM interrupt enable bit GIE = INTCON.7 0 Global interrupt enable bit OPTION = 01h 1 OPTION register PS0 = OPTION.0 1 Prescaler bit 0 PS1 = OPTION.1 1 Prescaler bit 1 PS2 = OPTION.2 1 Prescaler bit 2 PSA = OPTION.3 1 Prescaler assignment bit RTE = OPTION.4 1 RTCC signal edge bit RTS = OPTION.5 1 RTCC signal source bit INTEDG = OPTION.6 1 RB0/INT edge select bit RBPU = OPTION.7 1 RB weak pull-up enable bit TRISA = 05h 1 RA tristate control register TRISB = 06h 1 RB tristate control register EECON1 = 08h 1 EEPROM control register 1 RD = EECON1.0 1 EEPROM read control bit WR = EECON1.1 1 EEPROM write control bit WREN = EECON1.2 1 EEPROM write enable bit WRERR = EECON1.3 1 EEPROM write error flag bit EEIF = EECON1.4 1 EEPROM interrupt flag bit EECON2 = 09h 1 EEPROM control register 2 ******** PIC16C64 Equates - enabled by DEVICE PIC16C64 page INDF = 00h 0 Indirect addressing register INDIRECT = 00h 0 Indirect addressing register TMR0 = 01h 0 Timer0 register PCL = 02h 0 Program counter low-byte register STATUS = 03h 0 Status register C = STATUS.0 0 Carry bit DC = STATUS.1 0 Digit carry bit Z = STATUS.2 0 Zero bit PD = STATUS.3 0 Power down bit TO = STATUS.4 0 Time out bit RP0 = STATUS.5 0 Register page bit 0 RP1 = STATUS.6 0 Register page bit 1 IRP = STATUS.7 0 Indirect register page bit FSR = 04h 0 File select register PORTA = 05h 0 RA i/o register RA = 05h 0 RA i/o register PORTB = 06h 0 RB i/o register RB = 06h 0 RB i/o register PORTC = 07h 0 RC i/o register RC = 07h 0 RC i/o register PORTD = 08h 0 RD i/o register RD = 08h 0 RD i/o register PORTE = 09h 0 RE i/o register RE = 09h 0 RE i/o register PCLATH = 0Ah 0 Program counter high-byte register INTCON = 0Bh 0 Interrupt control register RBIF = INTCON.0 0 RB4-RB7 change interrupt flag bit INTF = INTCON.1 0 RB0/INT interrupt flag bit RTIF = INTCON.2 0 RTCC overflow interrupt flag bit RBIE = INTCON.3 0 RB4-RB7 change interrupt enable bit INTE = INTCON.4 0 RB0/INT interrupt enable bit RTIE = INTCON.5 0 RTCC overflow interrupt enable bit PEIE = INTCON.6 0 Perpiheral interrupt enable bit GIE = INTCON.7 0 Global interrupt enable bit PIR1 = 0Ch 0 Peripheral interrupt flags register TMR1IF = PIR1.0 0 Timer1 interrupt flag bit TMR2IF = PIR1.1 0 Timer2 interrupt flag bit CCP1IF = PIR1.2 0 Capture/Compare/PWM interrupt flag bit SSPIF = PIR1.3 0 Synchronous Serial Port interrupt flag bit PSPIF = PIR1.7 0 Parallel Slave Port interrupt flag bit TMR1L = 0Eh 0 Timer1 low byte register TMR1H = 0Fh 0 Timer1 high byte register T1CON = 10h 0 Timer1 control register TMR1ON = T1CON.0 0 Timer1 enable bit TMR1CS = T1CON.1 0 Timer1 clock select bit T1INSYNC = T1CON.2 0 Timer1 sync enable bit T1OSCEN = T1CON.3 0 Timer1 oscillator enable bit T1CKPS0 = T1CON.4 0 Timer1 clock prescaler select bit0 T1CKPS1 = T1CON.5 0 Timer1 clock prescaler select bit1 TMR2 = 11h 0 Timer2 register T2CON = 12h 0 Timer2 control register T2CKPS0 = T2CON.0 0 Timer2 clock prescaler select bit0 T2CKPS1 = T2CON.1 0 Timer2 clock prescaler select bit1 TMR2ON = T2CON.2 0 Timer2 enable bit TOUTPS0 = T2CON.3 0 Timer2 postscaler select bit0 TOUTPS1 = T2CON.4 0 Timer2 postscaler select bit1 TOUTPS2 = T2CON.5 0 Timer2 postscaler select bit2 TOUTPS3 = T2CON.6 0 Timer2 postscaler select bit3 SSPBUF = 13h 0 Synchronous Serial Port receive/transmit register SSPCON = 14h 0 Synchronous Serial Port control register SSPM0 = SSPCON.0 0 SSP mode select bit0 SSPM1 = SSPCON.1 0 SSP mode select bit1 SSPM2 = SSPCON.2 0 SSP mode select bit2 SSPM3 = SSPCON.3 0 SSP mode select bit3 CKP = SSPCON.4 0 SSP clock polarity select bit SSPEN = SSPCON.5 0 SSP enable bit SSPOV = SSPCON.6 0 SSP receive overflow flag bit WCOL = SSPCON.7 0 SSP write collision detect bit CCPR1L = 15h 0 Capture/Compare/PWM low byte register CCPR1H = 16h 0 Capture/Compare/PWM high byte register CCP1CON = 17h 0 Capture/Compare/PWM control register CCP1M0 = CCP1CON.0 0 CCP mode select bit0 CCP1M1 = CCP1CON.1 0 CCP mode select bit1 CCP1M2 = CCP1CON.2 0 CCP mode select bit2 CCP1M3 = CCP1CON.3 0 CCP mode select bit3 CCP1Y = CCP1CON.4 0 CCP 10-bit PWM low order bit0 CCP1X = CCP1CON.5 0 CCP 10-bit PWM low order bit1 OPTION = 01h 1 OPTION register PS0 = OPTION.0 1 Prescaler bit 0 PS1 = OPTION.1 1 Prescaler bit 1 PS2 = OPTION.2 1 Prescaler bit 2 PSA = OPTION.3 1 Prescaler assignment bit RTE = OPTION.4 1 RTCC signal edge bit RTS = OPTION.5 1 RTCC signal source bit INTEDG = OPTION.6 1 RB0/INT edge select bit RBPU = OPTION.7 1 RB weak pull-up enable bit TRISA = 05h 1 RA tristate control register TRISB = 06h 1 RB tristate control register TRISC = 07h 1 RC tristate control register TRISD = 08h 1 RD tristate control register TRISE = 09h 1 RE tristate control register TRISE0 = TRISE.0 1 RE0 tristate control bit TRISE1 = TRISE.1 1 RE1 tristate control bit TRISE2 = TRISE.2 1 RE2 tristate control bit PSPMODE = TRISE.4 1 Parallel Slave Port mode bit IBOV = TRISE.5 1 PSP input buffer overflow flag OBF = TRISE.6 1 PSP output buffer full flag IBF = TRISE.7 1 PSP input buffer full flag PIE1 = 0Ch 1 Peripheral interrupt enable register TMR1IE = PIE1.0 1 Timer1 interrupt enable bit TMR2IE = PIE1.1 1 Timer2 interrupt enable bit CCP1IE = PIE1.2 1 Capture/Compare/PWM interrupt enable bit SSPIE = PIE1.3 1 Synchronous Serial Port interrupt enable bit PSPIE = PIE1.7 1 Parallel Slave Port interrupt enable bit PCON = 0Eh 1 Power-On-Reset detection register POR = PCON.1 1 Power-On-Reset flag bit PR2 = 12h 1 Timer2 period register SSPADD = 13h 1 Synchronous Serial Port I2C address register SSPSTAT = 14h 1 Synchronous Serial Port status register BF = SSPSTAT.0 1 SSP buffer full flag bit UA = SSPSTAT.1 1 SSP 10-bit I2C update address flag bit R_W = SSPSTAT.2 1 SSP I2C read/write status bit S = SSPSTAT.3 1 SSP I2C start flag bit P = SSPSTAT.4 1 SSP I2C stop flag bit D_A = SSPSTAT.5 1 SSP I2C data/address flag bit