/******************************************************************************* * Programa teste_led.c - testa LEDs da placa Saber LPT * Desenvolvido por Márcio José Soares * * Acende LEDs na seqüência vai-e-vem ******************************************************************************** * Compilador: Dev C++ 4.9.9.0 (http://www.bloodshed.net/download.html) * Sistema operacional: WinXP Professional SP2 * PC: Athlon XP 2000+ * * Utilizar com circuito publicado na revista Saber Eletrônica 395 * http://www.sabereletronica.com.br * * ATENÇÃO: para re-compilação requer INPOUT.DLL * Instalar Lib em \Windows|system e \Windows\system32 * Download e informações sobre instalação em * http://www.logix4u.net/inpout32.htm ******************************************************************************** * Obs: este programa utiliza funções de temporização do tipo * "espera ocupada". Este tipo de temporização é influenciada * diretamente pela velocidade do PC e também dos recursos * que estiverem rodando no mesmo. * * Altere as variáveis indicadas nestas funções para obter a * performance desejada para o programa. ******************************************************************************** * Este código-fonte é parte integrante do artigo Placa Saber LPT * Maiores informações sobre o projeto podem ser obtidas no referido artigo * publicado na Revista Saber Eletrônica ******************************************************************************** * O Copyright deste programa está reservado para Márcio José Soares e seu * conteúdo está protegido pela Lei de Direitos Autorais LEI N° 9.610, * de 19 de Fevereiro de 1998. É estritamente proibida o uso comercial como * também a publicação total ou parcial dos conteúdos aqui apresentados * sem prévia autorização, por escrito, do autor. *******************************************************************************/ /******************************************************************************* * Arquivos de inclusão do módulo *******************************************************************************/ #include #include #include #include /******************************************************************************* Protótipo das funções externas pertencentes a DLL INPOUT.DLL *******************************************************************************/ typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); /******************************************************************************* * Definições do módulo *******************************************************************************/ #define LPT 0x378 //endereço para LPT1. LPT2=0x278 #define LPTS LPT+1 //endereço de status da LPT #define LPTC LPT+2 //endereço de controle da LPT #define ZERO 0x00 /******************************************************************************* * Funções do módulo *******************************************************************************/ /******************************************************************************* * Função tempo - Temporiza através do método "espera ocupada" * Entradas - nenhuma * Saídas - nenhuma ******************************************************************************** * Os valores inseridos nas variáveis i e j permitiram aumentar ou diminuir * a temporização. Trata-se de uma "espera" ocupada e a velocidade do PC * influenciará diretamente no resultado obtido. *******************************************************************************/ void tempo(void){ int i, j; for(i=0;i<=2000;i++) for(j=0;j<=50000;j++); //nao faz nada, apenas perde ciclos (tempo) } /******************************************************************************* * Função sentido_LED - pisca LEDs da esquerda para direita e vice_versa * Entradas - sentido (0 - esquerda p/ direita, 1 - direita p/ esquerda * Saídas - nenhuma *******************************************************************************/ int sentido_LED(unsigned char sentido){ HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; unsigned char saida; //bytes para entrada e saida int entrada, voltar, i, ret; // carrega a DLL hLib = LoadLibrary("inpout32.dll"); if (hLib == NULL) { printf("\nLeitura da DLL falhou!!!\n"); return 0; } //pega o endereço para as funções INP32 e OUTP32 inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); if (inp32 == NULL) { printf("\nGetProcAddress para Inp32 Falhou!!!\n"); return 0; } oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (oup32 == NULL) { printf("\nGetProcAddress para Oup32 Falhou!!!\n"); return 0; } if (sentido){ saida=1; voltar=1; while(voltar==1){ entrada = (inp32)(LPTS); //colhe entrada if (entrada==111){ //chave S1 pressionada ret=0; voltar=0; (oup32)(LPT,0x00); //limpa porta } else if (saida==128) //chegou ao fim da contagem voltar=0; else{ (oup32)(LPT,saida); //insere valor na LPT saida=saida<<1; //gira a direita tempo(); //temporiza } } } else{ saida=128; voltar=1; while(voltar==1){ entrada = (inp32)(LPTS); if (entrada==111){ ret=0; voltar=0; (oup32)(LPT,0x00); } else if (saida==1) voltar=0; else{ (oup32)(LPT,saida); //insere valor na LPT saida=saida>>1; tempo(); } } } FreeLibrary(hLib); //desativa dll return ret; //retorna valor } /******************************************************************************* * Função main - principal * Entradas - nenhuma * Saídas - nenhuma *******************************************************************************/ main(void){ int cont; printf("\n******************************************************************"); printf("\n* Programa Teste_LED.EXE - testa os LEDs da Placa Saber LPT *"); printf("\n* Desenvolvido por Marcio Jose Soares - Revista Saber Eletronica *"); printf("\n******************************************************************"); printf("\n* Necessario fazer ligacoes na placa conforme artigo *"); printf("\n******************************************************************"); printf("\n* LEDs piscam sequencialmente - efeito vai e vem *"); printf("\n* Pressione S1, na placa, para parar a execucao do programa *"); printf("\n******************************************************************"); cont=1; while(cont){ cont=sentido_LED(1); cont=sentido_LED(0); } exit(0); }