Moderadores: andre_luis, 51, guest2003, Renie
PORTC=cen>>1; //bit6...1
RA2=cen;//bit0
while(true)
{
digital=1228; //digital=read_adc();
inte=(unsigned long int)50*digital/1023; //Fica 60
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
}
//Com display de catodo comum
#include <PIC16F676_Voltimetro_7Segmentos_02.h>
// 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;
int const esp=100;
////////// Apresentar digito das dezenas
void dezenas()
{
output_high(pin_a1);
delay_ms(1);
switch(dez)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101111;
}
break;
}
delay_ms(esp);
output_low(pin_a1);
output_low(pin_a5);
delay_ms(1);
}
////////// Apresentar digito das unidades
void unidades()
{
output_high(pin_a2);
delay_ms(1);
switch(uni)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101111;
}
break;
}
delay_ms(esp);
output_low(pin_a2);
output_low(pin_a5); //Pino do segmento "g"
delay_ms(1);
}
////////// Apresentar digito das decimas
void decimas()
{
output_high(pin_a4);
delay_ms(1);
switch(dec)
{
case 0:
{
portc = 0b111111;
}
break;
case 1:
{
portc = 0b000110;
}
break;
case 2:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b011011;
}
break;
case 3:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b001111;
}
break;
case 4:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b100110;
}
break;
case 5:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101101;
}
break;
case 6:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111101;
}
break;
case 7:
{
portc = 0b000111;
}
break;
case 8:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b111111;
}
break;
case 9:
{
output_high(pin_a5);
delay_ms(1);
portc = 0b101111;
}
break;
}
delay_ms(esp);
output_low(pin_a4); //Pino de ativacao das decimas
output_low(pin_a5); //Pino do segmento "g"
delay_ms(1);
}
////////// PROGRAMA PRINCIPAL
void main()
{
unsigned long int digital, inte; // unsigned long int para ADC maior 10 bits
float tensao;
dez=0; //Dezenas
uni=0; //Unidades
dec=0; //decimas
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=1118;
inte=(unsigned long int)50*digital/1023;
dec=inte%10; //divide por 10 e atribui o resto para a variável.
inte=inte/10; //inte =
uni=inte%10; //uni =
dez=inte/10; //dez =
decimas(); //Escreve o digito das decimas
unidades(); //Escreve o digito das unidades
dezenas(); //Escreve o digito das dezenas
}
}
/////////// FIM DO PROGRAMA
decimas(); //Escreve o digito das decimas
unidades(); //Escreve o digito das unidades
if ( dez == 0 ) { /* NAO ESCREVE NADA - DEIXA EM BRANCO */ } else dezenas(); //Escreve o digito das dezenas
valecovo escreveu:O problema não é escrever o zero. O problema é não escrever onde deveria e escrever dois dígitos ao mesmo tempo.
////////// Apresentar digito das dezenas
void dezenas()
{
output_low(pin_a1);
...
output_high(pin_a1);
}
////////// Apresentar digito das unidades
void unidades()
{
output_low(pin_a2);
...
output_high(pin_a2);
}
////////// Apresentar digito das decimas
void decimas()
{
output_low(pin_a4);
...
output_high(pin_a4); //Pino de ativacao das decimas
}
/* Programa para uControlador PIC16F676 voltimetro */
/* 25/02/2014 - V00.001A */
#include <pic.h>
#define tm1h 0xf6 //int timer1 200Hz @ 4MHz
#define tm1l 0x3c
//configuração = proteção do código & 4Mhz & ...
__CONFIG(CP_OFF & MCLRE_OFF & FOSC_INTRCIO & PWRTE_ON & WDTE_OFF & BOREN_ON);
__EEPROM_DATA('V','o','l','t',' ','Z','e',' ');
__EEPROM_DATA('V','0','0','.','0','0','1','A');
//***************************************************************
unsigned char dig[3],k,i,tmp;
//***************************************************************
void delay(unsigned char dl) //dl*2,5ms
{
tmp=dl;
while(tmp);
}
/**************************************************************************/
unsigned int adc_read(void)
{
ADCON0 = (3 << 2) | 0x83; // enable ADC, fosc/32
while(GO_nDONE)
continue; // wait for conversion complete
return ADRESH*256 + ADRESL;
}
unsigned char const tabela[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
};
//************************************************************
static void interrupt
timer1_int(void)
{
TMR1IF=0; //zera flag timer1
TMR1H=tm1h; //restaura 200Hz interrupt
TMR1L=tm1l;
tmp--;
PORTA = 0b11111111; //apaga display
PORTC=tabela[dig[i]];
RA5=tabela[dig[i]]>>6; //bit6
PORTA& = ~k;
i++; //na próxima vez, próximo valor indexado e
k<<=1; //próximo dígito
if (i>2) {i=0; k=1;} //redefinição de variáveis
}
//***************************************************************
/* coloca o valor nos displays */
//***************************************************************
void dsp7(unsigned int dado)
{
dig[0]=dado/100;
dig[1]=(dado/10)%10;
dig[2]=dado%10;
}
//**********************************************************************
//***************INICIO DO PROGRAMA PRINCIPAL***********
//**********************************************************************
void main(void)
{
unsigned int a=000;
TRISC=0b000000; //segmentos
TRISA=0b00010000; //RA4=enrada analógica
//WPUA= 0b111111; //pullup em tudo
ANSEL=0b00001000; //AN3=entrada de voltagem
CMCON=0xff; //entradas do comparador = digital
ADFM=1; //p/ 10 bits deslocados p/ direita
VCFG=0; //Ref.= VDD
ADCON1=0b00010000; //ad=fosc/8
TMR1H=tm1h; // int. 200Hz
TMR1L=tm1l; // "
TMR1IF=0; //zera flag timer1
TMR1IE=1; //hab. int. timer1
PEIE=1;
T1CON=0b00010101; // prescaler /2 fosc/4 timer1 on
GIE=1; //hab int.
//while(a<11) {dsp7(a);a++;delay(30);} //teste
//while(a<101) {dsp7(a);a+=10;delay(30);} //teste
//while(a<1001) {dsp7(a);a+=100;delay(30);} //teste
//-------------loop------------------------
for (;;)
{
a=adc_read();
dsp7(a);
delay(50);
}
//------------------------------------------
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante