quarta-feira, 8 de setembro de 2010

Display 7 segmentos

// ****************************************************************************************************************************************************
// lcd de 7 segmento
// saida de pwm pino17 rc2
// Data: 03-08-2009
// Autores: Aguivone
// Descrição: frequencimetro que mede de 20Hz a 10 kHZ é a faixa para um cristal de 4 Mhz
// ****************************************************************************************************************************************************
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#bit P1 = 0x06.7
#bit P2 = 0x06.3
#bit P3 = 0x08.7
#bit P4 = 0x05.1

#bit UM = 0x09.2

#bit led = 0x07.1

#bit A1 = 0x05.3
#bit B1 = 0x05.2
#bit C1 = 0x06.4
#bit D1 = 0x06.5
#bit E1 = 0x06.6
#bit F1 = 0x09.0
#bit G1 = 0x09.1
#bit A2 = 0x08.0
#bit B2 = 0x08.1
#bit C2 = 0x06.0
#bit D2 = 0x06.1
#bit E2 = 0x06.2
#bit F2 = 0x07.3
#bit G2 = 0x07.0
#bit A3 = 0x07.4
#bit B3 = 0x07.5
#bit C3 = 0x08.4
#bit D3 = 0x08.5
#bit E3 = 0x08.6
#bit F3 = 0x08.3
#bit G3 = 0x08.2
int aux;
long sobe,sobe2;
long periodo,frequencia;//era float


void mostrar(boolean dig,int dig1,int dig2,int dig3,int ponto)
{
if(dig==0)
{
UM=1;
}
else
{
UM=0;
}
switch(ponto)
{
case 0:
{
P1=1;
P2=1;
P3=1;
P4=1;
}break;
case 1:
{
P1=0;
P2=1;
P3=1;
P4=1;
}break;
case 2:
{
P1=1;
P2=0;
P3=1;
P4=1;
}break;
case 3:
{
P1=1;
P2=1;
P3=0;
P4=1;
}break;
case 4:
{
P1=1;
P2=1;
P3=1;
P4=0;
}break;
}
switch(dig1)
{
case 0:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=0;
F1=0;
G1=1;
}break;
case 1:
{
A1=1;
B1=0;
C1=0;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
case 2:
{
A1=0;
B1=0;
C1=1;
D1=0;
E1=0;
F1=1;
G1=0;
}break;
case 3:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=1;
F1=1;
G1=0;
}break;
case 4:
{
A1=1;
B1=0;
C1=0;
D1=1;
E1=1;
F1=0;
G1=0;
}break;
case 5:
{
A1=0;
B1=1;
C1=0;
D1=0;
E1=1;
F1=0;
G1=0;
}break;
case 6:
{
A1=0;
B1=1;
C1=0;
D1=0;
E1=0;
F1=0;
G1=0;
}break;
case 7:
{
A1=0;
B1=0;
C1=0;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
case 8:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=0;
F1=0;
G1=0;
}break;
case 9:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=1;
F1=0;
G1=0;
}break;
case 10://desliga o numero
{
A1=1;
B1=1;
C1=1;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
}
switch(dig2)
{
case 0:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=0;
F2=0;
G2=1;
}break;
case 1:
{
A2=1;
B2=0;
C2=0;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
case 2:
{
A2=0;
B2=0;
C2=1;
D2=0;
E2=0;
F2=1;
G2=0;
}break;
case 3:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=1;
F2=1;
G2=0;
}break;
case 4:
{
A2=1;
B2=0;
C2=0;
D2=1;
E2=1;
F2=0;
G2=0;
}break;
case 5:
{
A2=0;
B2=1;
C2=0;
D2=0;
E2=1;
F2=0;
G2=0;
}break;
case 6:
{
A2=0;
B2=1;
C2=0;
D2=0;
E2=0;
F2=0;
G2=0;
}break;
case 7:
{
A2=0;
B2=0;
C2=0;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
case 8:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=0;
F2=0;
G2=0;
}break;
case 9:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=1;
F2=0;
G2=0;
}break;
case 10://desliga o numero
{
A2=1;
B2=1;
C2=1;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
}
switch(dig3)
{
case 0:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=0;
F3=0;
G3=1;
}break;
case 1:
{
A3=1;
B3=0;
C3=0;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
case 2:
{
A3=0;
B3=0;
C3=1;
D3=0;
E3=0;
F3=1;
G3=0;
}break;
case 3:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=1;
F3=1;
G3=0;
}break;
case 4:
{
A3=1;
B3=0;
C3=0;
D3=1;
E3=1;
F3=0;
G3=0;
}break;
case 5:
{
A3=0;
B3=1;
C3=0;
D3=0;
E3=1;
F3=0;
G3=0;
}break;
case 6:
{
A3=0;
B3=1;
C3=0;
D3=0;
E3=0;
F3=0;
G3=0;
}break;
case 7:
{
A3=0;
B3=0;
C3=0;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
case 8:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=0;
F3=0;
G3=0;
}break;
case 9:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=1;
F3=0;
G3=0;
}break;
case 10://desliga o numero
{
A3=1;
B3=1;
C3=1;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
}
}
void converte(long quant)
{
int dg1=0,dg2=0,dg3=0;
if(quant<1000) { while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,1);
}
else
{
if(quant>=10000)
{
quant= quant/100;
while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,3);
}
else
{
quant= quant/10;
while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,2);
}
}
}
#int_ccp1
void isr()
{
aux++;
sobe=CCP_1;
if(aux==1)
{
sobe2=sobe;
}
}


void main()
{
Set_tris_a(0);
Set_tris_b(0);
Set_tris_c(0b01000000);
Set_tris_d(0);
Set_tris_e(0);
output_a (255);
output_b (255);
output_c (255);
output_d (255);
output_e (255);
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
aux=0;
mostrar(0,0,0,0,1);
for(;;)
{
if(aux==2)
{
disable_interrupts(INT_CCP1); // Setup interrupt on falling edge
disable_interrupts(GLOBAL);
//printf(" periodo %f us \n", periodo );//se for de 4Mhz não prescisa de dividir

printf("\r sobe %lu \n", sobe );
printf("\r sobe2 %lu \n", sobe2 );
if(sobe>sobe2)
{
periodo =sobe-sobe2;
}
else
{
periodo=(65536-sobe2)+sobe;
}
printf("\r periodo %lu \n", periodo);
frequencia=1000000/periodo;
frequencia=frequencia;//compensa a divisão
printf("\r frequencia %lu hz \n", frequencia );
converte(frequencia);
delay_ms(100);
aux=0;
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
}
}
}

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!