Olá pessoal!
Sou novo aqui no Clube do Hardware.
Tenho disponível um kit PEX-30 (diagrama em anexo) que utiliza o microcontrolador PIC16F877A.
Estou tendo problemas para fazer 2 displays funcionarem por meio da multiplexação. Tentei realizar a simulação no PROTEUS (em anexo) e também não funcionou
Não consigo fazer com que o PORTB envie os sinais necessários para fazer o display funcionar. O código de referência está na aula 16 do seguinte curso:
Segue código:
#define MENOS PORTA.F0
#define MAIS PORTA.F1
#define DIGIT1 PORTB.F7
#define DIGIT2 PORTA.F2
#define DIGIT3 PORTA.F3
int CENTENA,DEZENA,UNIDADE,Cnt = 0;
int Display(int no);
void changeCount();
void main()
{
CMCON=0x07;
TRISA=0b00000011; // Configura RA0 e RA1 como entradas
TRISB=0b00000000; // Configura PORTB como saídas
DIGIT2 = 1; // Desabilita Digito2
DIGIT3 = 1; // Desabilita Digito3
while(1)
{
changeCount();
// Digito das CENTENAS
CENTENA = (Cnt/100)-((Cnt%100)/100); // 253 , 253 e 100 = 53, 0,53 ("2")
PORTB = Display(CENTENA); // Envia para PORTB
DIGIT1 = 0; // Liga Display1
delay_ms(5); // Aguarda 5 milisegundos
DIGIT1 = 1; // Desliga Display1
// Digito das DEZENAS
DEZENA = (Cnt%100); //53 , 5,3 , 3 , 0,3
DEZENA = (DEZENA/10)-((DEZENA%10)/10); // "5"
PORTB = Display(DEZENA); // Envia para PORTB
DIGIT2 = 0; // Liga Display2
delay_ms(5); // Aguarda 5 milisegundos
DIGIT2 = 1; // Desliga Display2
// Digito das UNIDADES
UNIDADE=Cnt%10;
PORTB=Display(UNIDADE); //Envia para PORTB
DIGIT3=0; //habilita digito 3(unidade)
delay_ms(5); //aguarda 5 milisegundos
DIGIT3=1; //desabilita digito 3(unidade)
} // Fim do While
} // Fim do Void Main
//esta função acha o bit pattern(matrix de bits) para ser enviado
//para o PORTB e mostrar um número no display de 7 segmentos.O número
//é passado como um argumento para a função.
int Display(int no)
{
int Pattern;
int SEGMENTO[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
Pattern=SEGMENTO[no]; //para retornar o Pattern
return(Pattern);
} //end função
void changeCount()
{
while(MAIS == 1)
{
Cnt = Cnt + 1;
delay_ms(180);
if(Cnt > 999) Cnt = 99;
}
while(MENOS == 1)
{
Cnt = Cnt - 1;
delay_ms(180);
if(Cnt < 1) Cnt = 0;
}
}
Segue diagrama no proteus, diagrama do display, manual da PEX-30 e arquivos do MikroC e Proteus (zipados).
Preciso de uma luz!!!
Abraço!
proteus - contador - pic16f877a.pdf
PEX-30-Diagrama Display.pdf
MANUAL_PEX_30_MAXIM_LAB.pdf
Contador.zip