Hi Bruce, thanks for the reply,

I use the following code and INCLUDE it in my main PBP file:

Code:
' ==============================================================================
' Constants
' ==============================================================================
 
                
CONTROL_BYTE con $40    ' write operation to device address $00

' Port Expander Registers
IOCON con $0A
IODIRA CON $00
IODIRB CON $01
GPIOA CON $14
GPIOB con $15


' ==============================================================================
' Pin Definitions
' ==============================================================================

SCLK var PORTC.3
SDI var PORTC.4
SDO var PORTC.5

nCS var PORTA.2
nRST var PORTA.3

REGISTER_BYTE var byte
DATA_BYTE var byte


goto EndOfPortExpander
' ==============================================================================
' Macros
' ==============================================================================

asm
PE_Init_As_Outputs macro                   ; Send appropriate initialisation bytes for Outputs
    L?CALL _PE_INITIALISE_OUTPUTS
    endm
    
PE_Write macro Data, Register   ; Write Data to the Port Expander Register
    MOVLW   Data
    MOVWF   _DATA_BYTE
    MOVLW   Data
    MOVWF   PORTB
    MOVLW   Register
    MOVWF   _REGISTER_BYTE
    L?CALL _SEND_PE_BYTE
    endm
endasm


' ==============================================================================
' Subs
' ==============================================================================

PE_INITIALISE_OUTPUTS:

        nRST = 0 ' reset the port expander
        pause 10
        nRST = 1

        REGISTER_BYTE = IOCON         
        DATA_BYTE = %00100000
        gosub SEND_PE_BYTE       ' setup IOCON for Bank 0 non-sequetial operation
        
        REGISTER_BYTE = IODIRA
        DATA_BYTE = $00
        gosub SEND_PE_BYTE       ' set PORTA as output
        
        REGISTER_BYTE = IODIRB
        DATA_BYTE = $00
        gosub SEND_PE_BYTE       ' set PORTB as output
       

return

SEND_PE_BYTE:
        
        nCS = 0 ' enable PE
        Shiftout SDO, SCLK, 1, [CONTROL_BYTE,REGISTER_BYTE,DATA_BYTE]        
        nCS = 1 '      
        pause 10

return

EndOfPortExpander:
The problem I am having is when invoking the PE_WRITE macro. To check what is being passed to the macro I am writing Data to PORTB. When I invoke the following:

Code:
@   PE_Write 55h, _GPIOA
I get 55h on PORTB - it works correctly. However when I call the following:

Code:
Temp VAR BYTE
Temp = $55
@   PE_Write _Temp, _GPIOA
I get 22h on PORTB. I have tried other numbers for Temp but they all show 22h on PORTB.

I can only think that this is some kind of type mismatch but I don't see how. Any ideas?