Entradas y salidas compartidas que hacer?

Que hay de nuevo?
Tengo un problemilla y esque ahora estoy usando un LCD del nokia 3310 q me usa las entradas y salidas digitales 8-11 y 13 y quiero acoplar un lector de tarjetas sd q he montao casero q usa las 10-13, como podría hacer?, el resto las tengo libres pero como ambos usan esas entradas no se.
A ver que os parece

Pues una de dos, o cambias de pines uno u otro, se podría multiplexar y tal, pero sería más sencillo cambiar los pines.

La LCD se tiene que conectar obligatoriamente a esos pines?
Y el lector SD?

Un saludo

Lo he intentado pero si las cambio ya no funciona, por ejemplo con la sd tengo esto en una libreria.

#else  // defined(__AVR_ATmega1280__)
// 168 and 328 Arduinos

// Two Wire (aka I2C) ports
uint8_t const SDA_PIN = 18;
uint8_t const SCL_PIN = 19;

// SPI port
uint8_t const SS_PIN = 10;
uint8_t const MOSI_PIN = 11;
uint8_t const MISO_PIN = 12;
uint8_t const SCK_PIN = 13;

static const pin_map_t digitalPinMap[] = {
  {&DDRD, &PIND, &PORTD, 0},  // D0  0
  {&DDRD, &PIND, &PORTD, 1},  // D1  1
  {&DDRD, &PIND, &PORTD, 2},  // D2  2
  {&DDRD, &PIND, &PORTD, 3},  // D3  3
  {&DDRD, &PIND, &PORTD, 4},  // D4  4
  {&DDRD, &PIND, &PORTD, 5},  // D5  5
  {&DDRD, &PIND, &PORTD, 6},  // D6  6
  {&DDRD, &PIND, &PORTD, 7},  // D7  7
  {&DDRB, &PINB, &PORTB, 0},  // B0  8
  {&DDRB, &PINB, &PORTB, 1},  // B1  9
  {&DDRB, &PINB, &PORTB, 2},  // B2 10
  {&DDRB, &PINB, &PORTB, 3},  // B3 11
  {&DDRB, &PINB, &PORTB, 4},  // B4 12
  {&DDRB, &PINB, &PORTB, 5},  // B5 13
  {&DDRC, &PINC, &PORTC, 0},  // C0 14
  {&DDRC, &PINC, &PORTC, 1},  // C1 15
  {&DDRC, &PINC, &PORTC, 2},  // C2 16
  {&DDRC, &PINC, &PORTC, 3},  // C3 17
  {&DDRC, &PINC, &PORTC, 4},  // C4 18
  {&DDRC, &PINC, &PORTC, 5}   // C5 19
};
#endif  // defined(__AVR_ATmega1280__)

y si cambio cualquiera de los SPI port por otras entradas no me funciona habría q hacer algo mas?? con el LCD me pasa igual.

¿la LCD del nokia 3310 la tienes que conectar por esos pines obligatoriamente?
La SD está claro que si la comunicas por SPI no puedes cambiar los pines de posición.

Un saludo

Vaya rapidez en contestar, jeje, con el LCD supongo q pasara lo mismo porque me pone esto y si las cambio ya no va.

#ifdef PB1
#define LCD_RST PB1
#define SPI_CS  PB2
#define SPI_MOSI PB3
#define SPI_SCK PB5
#define LCD_DC  PB0
#define LCD_BL  PD7
#else 
#define LCD_RST PORTB1
#define SPI_CS  PORTB2
#define SPI_MOSI PORTB3
#define SPI_SCK PORTB5
#define LCD_DC  PORTB0
#define LCD_BL  PORTD7
#endif

Menuda putada supongo.

Si ambos elementos son SPI, pueden (y deben cuando se usa el periférico SPI del micro) compartir los pines MISO, MOSI y SCK, pero no pueden compartir el CS (Chip Select) o SS (Slave Select). El CS de uno irá a un pin del micro y el CS del otro irá a otro pin (o bien ambos a un decoder o a un SIPO) y luego en el programa eliges a quién vas a dirigirte poniendo el pin correspondiente a nivel bajo (nunca los dos a la par; entonces enviarías a los dos a la vez y los dos te responderían simultáneamente).

Si ambos son I2C, tampoco hay problema, porque pueden (y deben, como antes, cuando se usa el periférico I2C del micro) compartir los pines SDA y SCL (se "identifican" por un sistema de direcciones).

En tu caso, la tarjeta es SPI y el LCD, I2C (o, al menos, eso tengo entendido). Sin embargo, el LCD es un tanto peculiar por usar dos señales de control "extra" (tres si contamos el reset, aunque éste debería ir al reset del arduino). Si estás usando los periféricos SPI e I2C integrados del microcontrolador, los únicos pines que pueden "incordiar" son el CS de la tarjeta, el SCE, el D/C y reset del LCD. Si el CS comparte pin con alguno de los otros, cámbialo de sitio y modifica el programa.

Muy buena explicación Perro, el SS comparte el pin 10 con el CS del LCD, el problema es que si cambio cualquiera de los dos por otro en las configuracoines que he puesto ya no funcionan, cuando has dicho lo de poner el pin correspondiente a nivel bajo seria usando un SIPO no?

He conseguido cambiar el puerto 10 de la sd por el 7 poniendo solo esta linea, no se muy bien porque pero funciona, ahora queda fusionar los 2 programas.

pinMode(10,OUTPUT);