Código C++ para comunicação com a porta paralela //-------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------// INICIO - Enviar_LPT(BYTE Valor,BYTE Endereco) //-------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------// Escrever dados no FPGA através porta LPT //-------------------------------------------------------------------------------------------------------// Entrada: Endereco - Endereço 8 bits que identifica o registo de leitura // Valor - Byte a enviar para um registo de escrita //-------------------------------------------------------------------------------------------------------// Saída : do tipo boleano: FALSE - indicação de insucesso // TRUE - indicação de sucesso. //-------------------------------------------------------------------------------------------------------// Funções necessárias: // - void Enviar_Endereco(BYTE Endereco) //-------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------BOOL Enviar_LPT(BYTE Valor,BYTE Endereco) { // Altera a porta LPT para o modo ESCRITA BYTE AUX=INV_C; _outp(CONTROLO, AUX ); // Verificar se já se encontra no modo ESCRITA int cont=0; do{ cont++; AUX=_inp(ESTADO); AUX=AUX >> 3; AUX=AUX & 1; if (cont>1000) { _outp(CONTROLO, ESCREVER^INV_C); AfxMessageBox("A porta paralela não responde!"); return FALSE; } // if ( cont>1000 ) }while(AUX!=0); // do{ // Escreve o valor do endereço (8 bits) no descodificador de endereços Enviar_Endereco(Endereco); // Escreve no BUS I/O (8 bits) da porta LPT _outp(DADOS, Valor ); 1/5 Código C++ para comunicação com a porta paralela // Dá um CLOCK aos registos de escrita AUX=CLK^INV_C; _outp(CONTROLO, AUX ); // Clock=1; AUX=INV_C; _outp(CONTROLO, AUX ); // Clock=0 // Escreve o valor ZERO no descodificador de endereços Enviar_Endereco(0); // Põe todas as linhas de controlo a ZERO AUX=INV_C; _outp(CONTROLO, AUX ); // Escreve no BUS I/O o valor ZERO _outp(DADOS, 0 ); return TRUE; } //-------------------------------------------------------------------------------------------------------// FIM - BOOL Enviar_LPT(BYTE Valor,BYTE CMD) //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------//********************************************************************* //********************************************************************* //********************************************************************* //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------// Ler dados da FPGA através porta LPT //------------------------------------------------------------------------------------------------------// Entrada: Endereco - Endereço 8 bits que identifica o registo de leitura //------------------------------------------------------------------------------------------------------// Saída : Dado de 8 bits lido //-------------------------------------------------------------------------------------------------------// Funções necessárias: // - void Enviar_Endereco(BYTE Endereco) //-------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------BYTE Ler_LPT(BYTE Endereco) { // Altera a porta LPT para o modo ESCRITA BYTE AUX=INV_C; _outp(CONTROLO, AUX ); // Verificar se já se encontra no modo ESCRITA 2/5 Código C++ para comunicação com a porta paralela int cont=0; do{ cont++; AUX=_inp(ESTADO); AUX=AUX >> 3; AUX=AUX & 1; if (cont>1000) { _outp(CONTROLO, ESCREVER^INV_C); AfxMessageBox("A porta paralela não responde!"); return FALSE; } // if ( cont>1000 ) }while(AUX!=0); // do{ // Escreve o valor do endereço (8 bits) no descodificador de endereços Enviar_Endereco(Endereco); // Altera a porta LPT para o modo LEITURA AUX=LER^INV_C; _outp(CONTROLO, AUX ); // Verificar se já se encontra no modo LEITURA cont=0; do{ cont++; AUX=_inp(ESTADO); AUX=AUX >> 3; AUX=AUX & 1; if (cont>1000) { _outp(CONTROLO, INV_C); AfxMessageBox("A porta paralela não responde!"); return FALSE; } // if ( cont>1000 ) }while( AUX!=1 ); // Lê o BUS I/O (8 bits) da porta LPT BYTE Res; Res=_inp(DADOS); // Altera a porta LPT para o modo ESCRITA AUX=INV_C; _outp(CONTROLO, AUX ); 3/5 Código C++ para comunicação com a porta paralela // Verificar se já se encontra no modo ESCRITA cont=0; do{ cont++; AUX=_inp(ESTADO); AUX=AUX >> 3; AUX=AUX & 1; if (cont>1000) { _outp(CONTROLO, ESCREVER^INV_C); AfxMessageBox("A porta paralela não responde!"); return FALSE; } // if ( cont>1000 ) }while(AUX!=0); // do{ // Escreve o valor ZERO no descodificador de endereços Enviar_Endereco(0); // Põe todas as linhas de controlo a ZERO AUX=INV_C; _outp(CONTROLO, AUX ); // Escreve no BUS I/O o valor ZERO _outp(DADOS, 0 ); // Retorna o valor lido return Res; } //------------------------------------------------------------------------------------------------------// FIM - BYTE Ler_LPT(BYTE Endereco) //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------//********************************************************************* //********************************************************************* //********************************************************************* //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------// Escreve o valor do endereço (8 bits) no descodificador de endereços //------------------------------------------------------------------------------------------------------// Entrada: Endereco - Endreço 8 bits que identifica o registo de leitura //------------------------------------------------------------------------------------------------------// Saída : void //------------------------------------------------------------------------------------------------------- 4/5 Código C++ para comunicação com a porta paralela // Funções necessárias: //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------void Enviar_Endereco(BYTE Endereco) { // Escreve no BUS I/O o endereço _outp(DADOS, Endereco ); // Activa o ENABLE do registo de endereços BYTE AUX=ADDR^INV_C; _outp(CONTROLO, AUX ); // Dá um CLOCK ao registo de endereços AUX = Clock | ADDR; // 0000 0110 AUX=AUX^INV_C; _outp(CONTROLO, AUX ); // Clock =1; AUX=ADDR^INV_C; _outp(CONTROLO, AUX ); // Clock=0 // Desactiva o ENABLE do registo de endereços AUX=INV_C; _outp(CONTROLO,AUX ); } //------------------------------------------------------------------------------------------------------// FIM – void Enviar_Endereco(BYTE Endereco) //------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------- Constantes usadas: #define DADOS 0x378 #define CONTROLO DADOS+2 #define ESTADO DADOS+1 #define INV_C 11 #define INV_S 128 #define ESCREVER #define LER #define CLK 2 #define ADDR 4 #define Clock 8 #define END_A #define END_B #define END_C //00001011 //10000000 0x00 //00000000 0x21 //00100001 //00000010 //00000100 //00001000 1 2 3 5/5