Muitas vezes necessitamos utilizar mais pinos de E/S do que a quantidade disponível num determinado microcontrolador. A opção de utilizar um modelo com mais pinos pode não ser viável, especialmente quando já se utiliza um modelo menor em larga escala. Seja qual for a razão, uma das possibilidades de expansão das portas de E/S é a utilização de um chip conversor serial/paralelo como o 4094. Este chip recebe serialmente 8 bits de dados através de duas linhas (clock e dados) e disponibiliza o dado através de 8 pinos de saída.
A comunicação do PIC com o 4094 pode ser feita inteiramente por software ou utilizando o módulo MSSP. A utilização do módulo MSSP, caso o mesmo esteja disponível, facilita enormemente a tarefa, pois permite que toda a operação de comunicação (deslocamento serial dos dados) seja feita pelo hardware, liberando a aplicação para outras tarefas.
Além disso, a comunicação utilizando o módulo MSSP é muito simples: uma vez configurado o módulo, tudo o que é necessário fazer é ativar a linha de seleção do 4094, escrever o dado no registrador SSPBUF e, após a transmissão, desativar a linha de seleção do 4094. Também é possível utilizar a interrupção de fim de transmissão e inserir na ISR o código para desativar a linha de seleção do 4094.
O exemplo a seguir demonstra a utilização do módulo MSSP do PIC18F4520 para comunicação com o registrador de deslocamento 4094. Este exemplo foi retirado do livro Microcontrolador PIC18 Detalhado.
#include <p18f4520.h> #include "pic_simb.h" #pragma config OSC = XT, WDT = OFF, MCLRE = ON #pragma config DEBUG = ON, LVP = OFF, PWRT = ON, BOREN = OFF #define _4094_ENABLE PORTCbits.RC0 void MCU_init(void) { TRISC = 0; // todos os pinos da porta C como saídas SSPSTAT = 0; SSPCON1 = bSSPEN | bSPI_MST_4; // SPI modo mestre, clock = FOSC/4 = 1MHz } void main(void) { unsigned char contador, temp; MCU_init(); contador = 0; _4094_ENABLE = 1; while(1) { SSPBUF = contador++; for (temp=200; temp; temp--); } }