Moderadores: andre_luis, 51, guest2003, Renie
#define un s[0] //pra facilitar entendimento
#define dez s[1]
#define cen s[2]
#define mil s[3]
#define dmil s[4]
unsigned char s[5]; //global
void decompor(unsigned int dado) //talvez word dê certo. nunca precisei
{
unsigned char i=0;
un=dez=cen=mil=dmil=0;
while(dado)
{
s[i]=dado%10;
dado/=10;
i++;
}
}
unsigned short conta, D1, D2, D3, D4; //Variáveis de controle e de armazenamento
unsigned int ad,adc; //Variáveis de armazenamento da conversão AD
/*Matriz de 10 posições contendo o valor a ser enviado para a porta D a fim de
mostrar o dígito referente nos displays */
int digito[10] =
{0b00111111, //Dígito 0
0b00000110, //Dígito 1
0b01011011, //Dígito 2
0b01001111, //Dígito 3
0b01100110, //Dígito 4
0b01101101, //Dígito 5
0b01111101, //Dígito 6
0b00000111, //Dígito 7
0b01111111, //Dígito 8
0b01101111 //Dígito 9
};
void interrupt()
{
conta++; //Incrementa variável v
if (conta > 4) conta = 1; //Se variável v for maior que 4, então atribui o valor 1 a ela
switch (conta) {
case 1: PORTD = D1; //Coloca na PORTD o valor referente ao dígito 1
PORTA = 0x00; //Aciona o primeiro display e desliga os demais
PORTE = 0X01;
break;
case 2: PORTD = D2; //Coloca na PORTD o valor referente ao dígito 2
PORTE = 0x02; //Aciona o segundo display e desliga os demais
break;
case 3: PORTD = D3; //Coloca na PORTD o valor referente ao dígito 3
PORTE = 0x04; //Aciona o terceiro display e desliga os demais
break;
case 4: PORTD = D4; //Coloca na PORTD o valor referente ao dígito 4
PORTE = 0X00;
PORTA = 0x20; //Aciona o quarto display e desliga os demais
break;
}
TMR0L = 100; // Atribui o valor 100 ao TMRO
INTCON.TMR0IF = 0;
}
void main()
{
conta = 0; //Zera a variável v
ADCON1 = 0X0E; //Habilita somente o canal analógico 0
PORTA = 0x00; //Limpa a porta A
TRISA = 0x01; //Aciona a porta A como saída
PORTD = 0x00; //Limpa a porta D (todos os LEDS apagados)
TRISD = 0x00; //Aciona a porta D como saída
TRISE = 0x00;
T0CON = 0b11000100; /*Configura o Registrador T0CON
TMR0ON = 1 -> Habilita o TIMER 0
T08BIT = 1 -> TIMER 0 no modo 8 bits
T0CS = 0 -> Incremento pelo ciclo de máquina
...0,5us para o cristal de 8MHz.
T0SE = 0 -> Incremento na orda de subida.
PSA = 0 -> Prescale aplicado ao Timer 0
PS2 = 1, PS1 = 0 e PS0 = 0 -> Prescale = 1:32*/
INTCON = 0b10100000; /*Configura o registrador INTCON
GIE = 1 (bit7) -> Habilita a interrupção global
TMR0IE = 1 (bit 5)-> Habilita a interrupção do Timer 0
TMR0IF = 0 (bit 2)-> Flag de interrupção do Timer 0 desligado */
TMR0L = 100; //Valor Inicial para o timer 0
while(1)
{
ad = adc_read(0); //Faz a leitura do canal analógico e armazena em ad
adc = ad/1000; //divide o valor em ad por 1000
D1 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável por1*/
adc = (ad/100) % 10; /*divide o valor em ad por 100 e o resultado é
...dividido por 10 e somente utilizado o resto da
...última divisão.*/
D2 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável por2*/
adc = (ad/10) % 10; /*divide o valor em ad por 10 e o resultado é
...dividido por 10 e somente utilizado o resto da
...última divisão.*/
D3 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável por3*/
adc = ad % 10; /*divide o valor em ad por 10 e somente utilizado
...o resto da última divisão.*/
D4 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável por4*/
delay_ms(1000); //Atraso de 1000ms ou 1 segundo
}
}
unsigned char const digito[10] =
{0b00111111, //Dígito 0
0b00000110, //Dígito 1
0b01011011, //Dígito 2
0b01001111, //Dígito 3
0b01100110, //Dígito 4
0b01101101, //Dígito 5
0b01111101, //Dígito 6
0b00000111, //Dígito 7
0b01111111, //Dígito 8
0b01101111 //Dígito 9
};
unsigned char conta, k=1;
void interrupt()
{
PORTE=0;//melhor apagar os displays antes. evita "fantasmas"
PORTD=digito[s[conta]];//Coloca na PORTD o valor referente ao dígito da função do outro post
PORTE=k; //Aciona o k display e desliga os demais
k<<=1; //próximô
conta++; //Incrementa variável
if (conta > 3) {conta = 0;k=1;} //Se variável for maior que 3, então atribui o valor 0 a ela e reaponta pro display 0
...
...
}
main()
{
unsigned int a;
...
...
for(;;){
a=adcread(0)/30; //p.ex.
decompor(a);
}
//Com display de anodo comum
#include <16F676.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Oscilador interno
#FUSES PUT //Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#include <PIC16F676_Voltimetro_7Segmentos_03.h>
// DEFINIÇÃO E INICIALIZAÇÃO DOS PORTS
#use fast_io(a)
#use fast_io(c)
#byte porta = 0x05
#byte portc = 0x07
unsigned int cem, dez, uni;
int num;
////////// DISPLAY DAS CENTENAS
display_centena()
{
switch(uni)
{
case 0:
{
porta = 0b00000001;
portc = 0b00111111;
}
break;
case 1:
{
porta = 0b00000001;
portc = 0b00000110;
}
break;
case 2:
{
porta = 0b00001001;
portc = 0b00011011;
}
break;
case 3:
{
porta = 0b00001001;
portc = 0b01001111;
}
break;
case 4:
{
porta = 0b00001001;
portc = 0b00100110;
}
break;
case 5:
{
porta = 0b00001001;
portc = 0b00101101;
}
break;
case 6:
{
porta = 0b00001001;
portc = 0b00111101;
}
break;
case 7:
{
porta = 0b00000001;
portc = 0b00000111;
}
break;
case 8:
{
porta = 0b00001001;
portc = 0b00111111;
}
break;
case 9:
{
porta = 0b00001001;
portc = 0b00101111;
}
break;
}
delay_ms(500);
}
////////// DISPLAY DAS DEZENAS
display_dezena()
{
// dez = (num%100);
// dez = (dez/10) - ((dez%10)/10);
switch(dez)
{
case 0:
{
porta = 0b00000010;
portc = 0b00111111;
}
break;
case 1:
{
porta = 0b00000010;
portc = 0b00000110;
}
break;
case 2:
{
porta = 0b00001010;
portc = 0b00011011;
}
break;
case 3:
{
porta = 0b00001010;
portc = 0b01001111;
}
break;
case 4:
{
porta = 0b00001010;
portc = 0b00100110;
}
break;
case 5:
{
porta = 0b00001010;
portc = 0b00101101;
}
break;
case 6:
{
porta = 0b00001010;
portc = 0b00111101;
}
break;
case 7:
{
porta = 0b00000010;
portc = 0b00000111;
}
break;
case 8:
{
porta = 0b00001010;
portc = 0b00111111;
}
break;
case 9:
{
porta = 0b00001010;
portc = 0b00101111;
}
break;
}
delay_ms(500);
}
////////// DISPLAY DAS UNIDADES
display_unidade()
{
//uni = num%10;
switch(uni)
{
case 0:
{
porta = 0b00000100;
portc = 0b00111111;
}
break;
case 1:
{
porta = 0b00000100;
portc = 0b00000110;
}
break;
case 2:
{
porta = 0b00001100;
portc = 0b00011011;
}
break;
case 3:
{
porta = 0b00001100;
portc = 0b01001111;
}
break;
case 4:
{
porta = 0b00001100;
portc = 0b00100110;
}
break;
case 5:
{
porta = 0b00001100;
portc = 0b00101101;
}
break;
case 6:
{
porta = 0b00001100;
portc = 0b00111101;
}
break;
case 7:
{
porta = 0b00000100;
portc = 0b00000111;
}
break;
case 8:
{
porta = 0b00001100;
portc = 0b00111111;
}
break;
case 9:
{
porta = 0b00001100;
portc = 0b00101111;
}
break;
}
delay_ms(500);
}
////////// PROGRAMA PRINCIPAL
void main()
{
set_tris_a(0b11111000);
set_tris_c(0b11111111);
porta = 0; // Reseta portas
portc = 0;
setup_adc_ports(NO_ANALOGS);
uni = 0;
dez=0;
cem=0;
while(1)
{
for(num=0;num<99;num++)
{
uni++;
if(uni>9)
{
uni=0;
dez++;
if(dez>9)
{
dez=0;
cem++;
if(cem>9)
{
cem=0;
}
}
}
delay_ms(1);
display_centena();
display_dezena();
display_unidade();
}
}
}
/////////// FIM DO PROGRAMA
adc=adcread(0)/3; //resultado máximo seria pouco maior que 300. e como vais medir até 30V apenas, vamos aproximar (depois tu ajustas) por hora não te preocupes com virgula
adc = ad/100 /*divide o valor em ad por 100 //....(//----> ou seja vai de 0 a 3)
D1 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável D1/
adc = (ad/10) % 10; /*divide o valor em ad por 10 e o resultado é ....(//----> ou seja vai de 0 a 9)
...dividido por 10 e somente utilizado o resto da
...última divisão.*/
D2 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável D2*
adc = ad % 10; /*divide o valor em ad por 10 e somente utilizado ....(//----> ou seja vai de 0 a 9)
...o resto da última divisão.*/
D3 = digito[adc]; /*busca na matriz o dígito que será o resultado da
...divisão acima e o coloca na variável D3*/
void main()
{
unsigned long int digital; // unsigned long int para ADC maior 10 bits
float tensao;
set_tris_a(0b11111111);
set_tris_c(0b00000000);
porta = 0; // Reseta portas
portc = 0;
inicializa_lcd(); // Inicializa o LCD
setup_adc(ADC_CLOCK_INTERNAL); //enables the a/d module and sets the clock to internal adc clock
setup_adc_ports(sAN1); //sets all the adc pins to analog
setup_adc(adc_clock_div_2);
set_adc_channel(1); //the next read_adc call will read channel
delay_ms(1); //a small delay is required after setting the channel
while(true)
{
digital=read_adc();
delay_ms(1);
tensao=5*(float)digital/1023;
caracter_inicio(1,1);
printf(escreve_lcd,"Tensao: %2.2f",tensao);
// caracter_inicio(2,1);
// printf(escreve_lcd,"ADC: %4Lu",digital); //%4Lu para unsigned long int
delay_ms(1);
}
}
#include <16F676.h>
#device ADC=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO // osc interno
#FUSES PUT //Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#use delay(clock=1000000)
//Com display de catodo comum
// DEFINIÇÃO E INICIALIZAÇÃO DOS PORTS
#use fast_io(a)
#use fast_io(c)
#byte porta = 0x05
#byte portc = 0x07
unsigned int dez, uni, dec;
////////// Apresentar digito das dezenas
void dezenas()
{
output_high(pin_a1);
switch(dez)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
portc = 0b101111;
}
break;
}
delay_ms(1);
output_low(pin_a1);
output_low(pin_a5);
}
////////// Apresentar digito
void unidades()
{
output_high(pin_a2);
switch(uni)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
portc = 0b101111;
}
break;
}
delay_ms(1);
output_low(pin_a2);
output_low(pin_a5); //Pino do segmento "g"
}
////////// Apresentar digito
void decimas()
{
output_high(pin_a4);
switch(dec)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
portc = 0b101111;
}
break;
}
delay_ms(1);
output_low(pin_a4); //Pino de ativacao das decimas
output_low(pin_a5); //Pino do segmento "g"
}
////////// PROGRAMA PRINCIPAL
void main()
{
unsigned long int digital, inte; // unsigned long int para ADC maior 10 bits
float tensão;
dez=0; //Dezenas
uni=0; //Unidades
dec=0; //Parte decimal
set_tris_a(0b001001);
set_tris_c(0b000000);
porta = 0; // Reseta portas
portc = 0;
DISABLE_INTERRUPTS(GLOBAL);
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_adc(ADC_CLOCK_INTERNAL); //enables the a/d module and sets the clock to internal adc clock
setup_adc_ports(sAN0); //sets all the adc pins to analog
setup_adc(adc_clock_div_2);
set_adc_channel(0); //the next read_adc call will read channel
delay_ms(1); //a small delay is required after setting the channel
while(true)
{
//digital=read_adc();
digital=1228;
delay_ms(1);
tensão=5*(float)digital/1023;
tensão=tensao*10; //Se tensão=23.657, fica 236.57
inte=(long int)tensão*1; //Fica 236
dec=inte%10; //divide por 10 e atribui o resto para a variável (6).
inte=inte/10; //inte = 23
uni=inte%10; //uni = 3
dez=inte/10; //dez = 2
dezenas(); //Escreve o digito das dezenas
unidades(); //Escreve o digito das unidades
decimas(); //Escreve o digito das decimas
}
}
/////////// FIM DO PROGRAMA
cen=inte/100;
dez=(inte-cen*100)/10;
uni=inte-cen*100-dez*10;
PORTC=cen>>1; //bit6...1
RA2=cen;//bit0
//digital=read_adc();
digital=1228;
delay_ms(1);
tensão=5*(float)digital/1023;
tensão=tensao*10; //Se tensão=6.002, fica 60.02
inte=(long int)tensão*1; //Fica 60
digital=1228; //digital=read_adc();
delay_ms(1);
inte=(unsigned long int)50*digital/1023; //Fica 60
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante