terça-feira, 30 de janeiro de 2007

Circuito simples na porta paralela.


(Montado em um protoboard ;P usando 7 leds)

------------------------------------------------------------------------------------

#include <stdio.h>
#include <windows.h> //Necessário para: LoadLibrary(), GetProcAddress() e
HINSTANCE.
#define LPT1 0x378

//Declaração dos ponteiros para função.

typedef short _stdcall (*PtrInput)(short EndPorta);
typedef void _stdcall (*PtrOutput)(short EndPorta, short valor);

int main(void)
{
HINSTANCE hLib; //Instância para a DLL inpout32.dll.
PtrInput inportB; //Instância para a função Imp32().
PtrOutput outportB; //Instância para a função Out32().

//Carrega a DLL na memória.
hLib = LoadLibrary("inpout32.dll");
if(hLib == NULL) //Verifica se houve erro.
{
printf("Erro. O arquivo inpout32.dll
não foi encontrado.\n");
getch();
return -1;
}
//Obtém o endereço da função Inp32 contida na DLL.
inportB = (PtrInput) GetProcAddress(hLib, "Inp32");
if(inportB == NULL) //Verifica se houve erro.
{
printf("Erro. A função Inp32 não foi
encontrada.\n");
getch();
return -1;
}


//Obtém o endereço da função Out32 contida na DLL.
outportB = (PtrOutput) GetProcAddress(hLib, "Out32");
if(outportB == NULL) //Verifica se houve erro.
{
printf("Erro. A função Out32 não foi
encontrada.\n");
getch();
return -1;
}

//---------------------------------------------------------------------------

//Uso das funções outportB() e inportB():

int i, k;
unsigned char Valor=255; //Em binário: 11111111
while( Valor > 0 )
{
for(i=0;i<100;i++) { printf("sleep
;P\n"); }

outportB(LPT1, Valor); // Envia para
a Porta LPT1

Valor = Valor >> 1; //A cada
passagem, o bit 1 é movido para a direita

if (Valor == 0) { Valor = 255; }
}

}


---------------------------------------------------------------------------------
Fonte: rogercom. adaptação: david

requisitos: 8 leds, 8R de 470 ohms, um cabo de impressora.

Muito interessante. Para q funcione eh importante resaltar q precisa ter a dll input32 pq são usadas 2 funções(inp32, out32) para ter acesso a lpt, já no caso do linux não precisa, pode usar função ioperm .

IOPERM

int ioperm(unsigned long from, unsigned long num, int turn_on)

obs: precisa de privilegios de root.



D0 -----led----resistor----- (grd)
D1 -----led----resistor----- (grd)
D2 -----led----resistor----- (grd)
D3 -----led----resistor----- (grd)
D4 -----led----resistor----- (grd)
D5 -----led----resistor----- (grd)
D6 -----led----resistor----- (grd)
D7 -----led----resistor----- (grd)

D0 .. D7 pinos 2 a 9 respectivamente.

Endereço para enviar byte para lpt:
Registro de Dados
lpt1: 378h
lpt2: 278h


,.,,
display de 7 segmentos, next step! ;P

domingo, 21 de janeiro de 2007

Trabalhando com strings.

/* 05º) Fazer um programa para receber uma string do usuário (máx. 50
caracteres) e fazer uma estatística dos caracteres digitados.
Por exemplo, para a string "O EXERCICIO E FACIL"
A estatística mostrada será '

O' = 2, ' '=3, 'E' = 3,'X' = 1, 'R' = 1, 'C' = 3, 'I' = 3, 'F' = 1, 'A' = 1, 'L' = 1

-------------------------------------------------------------------------------------
Escrito por: Lagartosdr
*/


#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
int posicao, k=0, e=0, i=0,l=0,deb=0,m=0,arv=0;
char str1[50], arm[1000]=""; //Zera arm para garatir q non ocorreram erros nas contagens.
puts("String:");
gets(str1);
while(str1[l] != '\0'){
e = 0;
for(k=0;k<=strlen(str1);k++){
if(str1[l] == str1[k]){ e++; }
if(k == strlen(str1)) { //Verifica se k jah é do tamanho da string
for(deb=0;deb<=strlen(str1);deb++){ //verifica se a str[l] jah foi armazenada em arm.
if(str1[l] == arm[deb]){ m=0; break; } //m=0, não imprime, m !=0, imprime.
else { m++; }
}
if(m!= 0){ //verifica o valor de m para q possa imprimir ou não a string.
printf(" %c = %d \n", str1[l], e);
arm[arv++] = str1[l]; //armazena no buff pra garantir q essa string non seja impressa novamente.
}
}
}
l++;
i++;
}

system("PAUSE");
return 0;
}

sábado, 20 de janeiro de 2007

Anexando string 1 em string 2 apartir da posição X.

04º) Escrever uma função que:

- receba dois strings como parâmetro, bem como um valor inteiro representando uma posição.

- insira o segundo string no primeiro, na posição indicada pelo valor.

Fazer um programa que receba dois strings do usuário , o valor da posição, chame a função anteriormente implementada e exiba o resultado ao usuário.


#include <stdio.h>
#include <stdlib.h>

int comchance(char x[20], char w[20], int a);
int comchance(char x[20], char w[20], int a){
int i, t=0;


for(i=a;i<=a+strlen(w);i++) {
x[i] = w[t]; t++;
if(t == strlen(w)) { break; }
}
i=0;
while(x[i] != '\0') {
putchar(x[i]); i++; }
}

int main(int argc, char *argv[]){
char x[20], w[20];
int a;
puts("Digite a primeira string:");
gets(x);
puts("Digite a segunda string:");
gets(w);
puts("Digite o inteiro:");
scanf("%d", &a);
comchance(x, w, a);
system("PAUSE");
return 0;
}

sexta-feira, 19 de janeiro de 2007

Verificando se string1 esta contida em string2.

#include <stdio.h>
#include <stdlib.h>


void sair();
void sair() {
printf("\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB
ERRO:\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\n");
printf("String 1 deve maior que a string 2.\n");
printf("\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB
\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB\xDB
\xDB\xDB\xDB\xDB\xDB\n\n\n\n");
main();
}
int main(int argc, char *argv[])
{
char v1[20], v2[20];
int i=0, w=0, vr=0, vr2=0, x;
printf("String1:"); gets(v1);
printf("String2:"); gets(v2);
if(strlen(v2)>strlen(v1)) {
sair();
}
for(i=0;i<=strlen(v1)+1;i++){
if(v1[i] == v2[w]) { w++; vr++; }
else { vr = 0; w=0;}
if(vr == strlen(v2)) { vr++; vr2=(i-(strlen(v2)-1)); x=1; break; }
}
if (x != 0) { printf("String2 estah contida em String1, começando na posicao: %d
de string1 e terminando na posição %d.\n", vr2, vr2+strlen(v2)-1); }
else { printf("String2 nao estah contida em String1\n"); }
system("PAUSE");
return 0;
}

Verifica se duas string são iguais,

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]){
char v1[30], v2[30];
int i=0, vr=0;
gets(v1); gets(v2);
if(strlen(v1) != strlen(v2)) { printf("Diferentes\n"); }
else {
for(i=0;i<strlen(v1);i++){
if(v1[i] == v2[i]) { vr++; }
}
printf("vr(%d) e strlen(v2)(%d)", vr, strlen(v2));
if(vr == strlen(v1)){ printf("Iguais\n"); } else { printf("Diferentes\n"); }
}
system("PAUSE");
return 0;
}

Concatenando duas strings.

#include <stdio.h>
#include <stdlib.h>



int main(int argc, char *argv[])
{
char v1[30],v2[30],v3[60];
int i =0, w=0;
gets(v1); gets(v2);
for(i=0;i<strlen(v1);i++){
v3[i] = v1[i];
}
for(i=strlen(v1);i<=strlen(v2)+strlen(v1); i++){
v3[i] = v2[w];
w++;
}
i=0;
while(v3[i] != '\0'){ putchar(v3[i]); i++; }
system("PAUSE");
return 0;
}

Transformando um Binário em Decimal

#include <stdio.h>
#include <stdlib.h>


int multi(int j)
{
int i = j, d, r=1;
for(d=0;d<i;d++){
r = r * 2;
}
return r;
}
int main(int argc, char *argv[])
{
char bin[8];
int i, j, n = 0;
scanf("%s", &bin);
j = (strlen(bin) - 1);
for(i=0;i<=strlen(bin)-1;i++){
if(bin[i] == '1'){
n = (n + multi(j));
}
j--;
}
printf("\n%d\n", n);
system("PAUSE");
return 0;
}