problemas com 89S52 e display de 7 seguimentos

eu criei este seguinte circuito:
montei uma placa com 8 displays de 7 seguimentos, e usei um decodificador 74LS138 pra selecionar eles... sendo que eu quero ligar 6 deles para fazer um relógio digital(ou um contador de 8 algarismos) eu até obtive sucesso adaptando um programa q consegui com meu kit original 8051, mas este só veio com 4 displays... criando algo parecido com um cronometro o programa original ligava e desligava diretamente as portas P2.0 a P2.3, para multiplexar os displays e como queria econimizar pinos e incrementar um pouco o hardware, eu usei o 74LS138...
de fato, só bastou eu adaptar o programa fonte pra q ele fizesse a contagem binária usando estes mesmos 4 pinos sendo 3 pra fazer a contagem e 1 pra habilitar ou desabilitar o multiplexador
o codigo original é esse:
#include<at89x52.h>
char milhar=0;
char centena=0;
char dezena=0;
char unidade=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}
//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){
if (milhar==0) P0=63;
if (milhar==1) P0=6;
if (milhar==2) P0=91;
if (milhar==3) P0=79;
if (milhar==4) P0=102;
if (milhar==5) P0=109;
if (milhar==6) P0=125;
if (milhar==7) P0=7;
if (milhar==8 ) P0=127;
if (milhar==9) P0=111;
P2=11;
delay();
P2=0;
if (centena==0) P0=63;
if (centena==1) P0=6;
if (centena==2) P0=91;
if (centena==3) P0=79;
if (centena==4) P0=102;
if (centena==5) P0=109;
if (centena==6) P0=125;
if (centena==7) P0=7;
if (centena==8 ) P0=127;
if (centena==9) P0=111;
P2=10;
delay();
P2=0;
if (dezena==0) P0=63;
if (dezena==1) P0=6;
if (dezena==2) P0=91;
if (dezena==3) P0=79;
if (dezena==4) P0=102;
if (dezena==5) P0=109;
if (dezena==6) P0=125;
if (dezena==7) P0=7;
if (dezena==8 ) P0=127;
if (dezena==9) P0=111;
P2=9;
delay();
P2=0;
if (unidade==0) P0=63;
if (unidade==1) P0=6;
if (unidade==2) P0=91;
if (unidade==3) P0=79;
if (unidade==4) P0=102;
if (unidade==5) P0=109;
if (unidade==6) P0=125;
if (unidade==7) P0=7;
if (unidade==8 ) P0=127;
if (unidade==9) P0=111;
P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(unidade<9) unidade++;
else{
if(dezena<5) dezena++;
else{
if(centena<9) centena++;
else{
centena=0;
milhar++;
}
if((milhar==2) && (centena==4)){
unidade=0;
dezena=0;
centena=0;
milhar=0;
}
dezena=0;
}
unidade=0;
}
cont=0;
}
exibeHora();
}
}
este funcionou, já adaptado pra funcionar usando o decodificador 74LS138
ai eu mudei o código:
#include<at89x52.h>
char hora1=0;
char hora2=0;
char minuto1=0;
char minuto2=0;
char segundo1=0;
char segundo2=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}
//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){
if (hora1==0) P0=63;
if (hora1==1) P0=6;
if (hora1==2) P0=91;
if (hora1==3) P0=79;
if (hora1==4) P0=102;
if (hora1==5) P0=109;
if (hora1==6) P0=125;
if (hora1==7) P0=7;
if (hora1==8 ) P0=127;
if (hora1==9) P0=111;
P2=13;
delay();
P2=0;
if (hora2==0) P0=63;
if (hora2==1) P0=6;
if (hora2==2) P0=91;
if (hora2==3) P0=79;
if (hora2==4) P0=102;
if (hora2==5) P0=109;
if (hora2==6) P0=125;
if (hora2==7) P0=7;
if (hora2==8 ) P0=127;
if (hora2==9) P0=111;
P2=12;
delay();
P2=0;
if (minuto1==0) P0=63;
if (minuto1==1) P0=6;
if (minuto1==2) P0=91;
if (minuto1==3) P0=79;
if (minuto1==4) P0=102;
if (minuto1==5) P0=109;
if (minuto1==6) P0=125;
if (minuto1==7) P0=7;
if (minuto1==8 ) P0=127;
if (minuto1==9) P0=111;
P2=11;
delay();
P2=0;
if (minuto2==0) P0=63;
if (minuto2==1) P0=6;
if (minuto2==2) P0=91;
if (minuto2==3) P0=79;
if (minuto2==4) P0=102;
if (minuto2==5) P0=109;
if (minuto2==6) P0=125;
if (minuto2==7) P0=7;
if (minuto2==8 ) P0=127;
if (minuto2==9) P0=111;
P2=10;
delay();
P2=0;
if (segundo1==0) P0=63;
if (segundo1==1) P0=6;
if (segundo1==2) P0=91;
if (segundo1==3) P0=79;
if (segundo1==4) P0=102;
if (segundo1==5) P0=109;
if (segundo1==6) P0=125;
if (segundo1==7) P0=7;
if (segundo1==8 ) P0=127;
if (segundo1==9) P0=111;
P2=9;
delay();
P2=0;
if (segundo2==0) P0=63;
if (segundo2==1) P0=6;
if (segundo2==2) P0=91;
if (segundo2==3) P0=79;
if (segundo2==4) P0=102;
if (segundo2==5) P0=109;
if (segundo2==6) P0=125;
if (segundo2==7) P0=7;
if (segundo2==8 ) P0=127;
if (segundo2==9) P0=111;
P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(segundo2<9) segundo2++;
else{
if(segundo1<5) segundo1++;
else{
if(minuto2<9) minuto2++;
else{
if(minuto1<5) minuto1++;
else{
if(hora1<9) hora1++;
else{
hora1=0;
hora2++;
}
if((hora1==2) && (hora2==4)){
segundo1=0;
segundo2=0;
minuto1=0;
minuto2=0;
hora1=0;
hora2=0;
}
segundo1=0;
}
segundo2=0;
}
cont=0;
}
exibeHora();
}
}
}
}
ele compila e grava... porém, na hora de roda-lo os displays não acendem, só ficam piscando os 6 primeiros displays alguem poderia me ajudar?
montei uma placa com 8 displays de 7 seguimentos, e usei um decodificador 74LS138 pra selecionar eles... sendo que eu quero ligar 6 deles para fazer um relógio digital(ou um contador de 8 algarismos) eu até obtive sucesso adaptando um programa q consegui com meu kit original 8051, mas este só veio com 4 displays... criando algo parecido com um cronometro o programa original ligava e desligava diretamente as portas P2.0 a P2.3, para multiplexar os displays e como queria econimizar pinos e incrementar um pouco o hardware, eu usei o 74LS138...
de fato, só bastou eu adaptar o programa fonte pra q ele fizesse a contagem binária usando estes mesmos 4 pinos sendo 3 pra fazer a contagem e 1 pra habilitar ou desabilitar o multiplexador
o codigo original é esse:
#include<at89x52.h>
char milhar=0;
char centena=0;
char dezena=0;
char unidade=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}
//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){
if (milhar==0) P0=63;
if (milhar==1) P0=6;
if (milhar==2) P0=91;
if (milhar==3) P0=79;
if (milhar==4) P0=102;
if (milhar==5) P0=109;
if (milhar==6) P0=125;
if (milhar==7) P0=7;
if (milhar==8 ) P0=127;
if (milhar==9) P0=111;
P2=11;
delay();
P2=0;
if (centena==0) P0=63;
if (centena==1) P0=6;
if (centena==2) P0=91;
if (centena==3) P0=79;
if (centena==4) P0=102;
if (centena==5) P0=109;
if (centena==6) P0=125;
if (centena==7) P0=7;
if (centena==8 ) P0=127;
if (centena==9) P0=111;
P2=10;
delay();
P2=0;
if (dezena==0) P0=63;
if (dezena==1) P0=6;
if (dezena==2) P0=91;
if (dezena==3) P0=79;
if (dezena==4) P0=102;
if (dezena==5) P0=109;
if (dezena==6) P0=125;
if (dezena==7) P0=7;
if (dezena==8 ) P0=127;
if (dezena==9) P0=111;
P2=9;
delay();
P2=0;
if (unidade==0) P0=63;
if (unidade==1) P0=6;
if (unidade==2) P0=91;
if (unidade==3) P0=79;
if (unidade==4) P0=102;
if (unidade==5) P0=109;
if (unidade==6) P0=125;
if (unidade==7) P0=7;
if (unidade==8 ) P0=127;
if (unidade==9) P0=111;
P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(unidade<9) unidade++;
else{
if(dezena<5) dezena++;
else{
if(centena<9) centena++;
else{
centena=0;
milhar++;
}
if((milhar==2) && (centena==4)){
unidade=0;
dezena=0;
centena=0;
milhar=0;
}
dezena=0;
}
unidade=0;
}
cont=0;
}
exibeHora();
}
}
este funcionou, já adaptado pra funcionar usando o decodificador 74LS138
ai eu mudei o código:
#include<at89x52.h>
char hora1=0;
char hora2=0;
char minuto1=0;
char minuto2=0;
char segundo1=0;
char segundo2=0;
char cont=0;
//****************************************************
void delay(){
unsigned int tempo=0;
for(tempo=0;tempo<10;tempo++);
}
//****************************************************
void inicializaTimer0(){
TMOD=1; //ativa timer no modo 16 bits
TR0=1; //ativa o timer (play/pause)
EA=1; //ativa o uso da interrupcoes
ET0=1; //ativa interrupcao por timer0
}
//****************************************************
void interrupcaoTimer0() interrupt 1{
TR0=0;
TH0=0x3C; //3C recarrega 50ms
TL0=0x00; //B0
TR0=1;
cont++; //passou +50us
}
//****************************************************
void exibeHora(){
if (hora1==0) P0=63;
if (hora1==1) P0=6;
if (hora1==2) P0=91;
if (hora1==3) P0=79;
if (hora1==4) P0=102;
if (hora1==5) P0=109;
if (hora1==6) P0=125;
if (hora1==7) P0=7;
if (hora1==8 ) P0=127;
if (hora1==9) P0=111;
P2=13;
delay();
P2=0;
if (hora2==0) P0=63;
if (hora2==1) P0=6;
if (hora2==2) P0=91;
if (hora2==3) P0=79;
if (hora2==4) P0=102;
if (hora2==5) P0=109;
if (hora2==6) P0=125;
if (hora2==7) P0=7;
if (hora2==8 ) P0=127;
if (hora2==9) P0=111;
P2=12;
delay();
P2=0;
if (minuto1==0) P0=63;
if (minuto1==1) P0=6;
if (minuto1==2) P0=91;
if (minuto1==3) P0=79;
if (minuto1==4) P0=102;
if (minuto1==5) P0=109;
if (minuto1==6) P0=125;
if (minuto1==7) P0=7;
if (minuto1==8 ) P0=127;
if (minuto1==9) P0=111;
P2=11;
delay();
P2=0;
if (minuto2==0) P0=63;
if (minuto2==1) P0=6;
if (minuto2==2) P0=91;
if (minuto2==3) P0=79;
if (minuto2==4) P0=102;
if (minuto2==5) P0=109;
if (minuto2==6) P0=125;
if (minuto2==7) P0=7;
if (minuto2==8 ) P0=127;
if (minuto2==9) P0=111;
P2=10;
delay();
P2=0;
if (segundo1==0) P0=63;
if (segundo1==1) P0=6;
if (segundo1==2) P0=91;
if (segundo1==3) P0=79;
if (segundo1==4) P0=102;
if (segundo1==5) P0=109;
if (segundo1==6) P0=125;
if (segundo1==7) P0=7;
if (segundo1==8 ) P0=127;
if (segundo1==9) P0=111;
P2=9;
delay();
P2=0;
if (segundo2==0) P0=63;
if (segundo2==1) P0=6;
if (segundo2==2) P0=91;
if (segundo2==3) P0=79;
if (segundo2==4) P0=102;
if (segundo2==5) P0=109;
if (segundo2==6) P0=125;
if (segundo2==7) P0=7;
if (segundo2==8 ) P0=127;
if (segundo2==9) P0=111;
P2=8;
delay();
P2=0;
}
//****************************************************
void main(){
inicializaTimer0();
while(1){
if(cont==20){
if(segundo2<9) segundo2++;
else{
if(segundo1<5) segundo1++;
else{
if(minuto2<9) minuto2++;
else{
if(minuto1<5) minuto1++;
else{
if(hora1<9) hora1++;
else{
hora1=0;
hora2++;
}
if((hora1==2) && (hora2==4)){
segundo1=0;
segundo2=0;
minuto1=0;
minuto2=0;
hora1=0;
hora2=0;
}
segundo1=0;
}
segundo2=0;
}
cont=0;
}
exibeHora();
}
}
}
}
ele compila e grava... porém, na hora de roda-lo os displays não acendem, só ficam piscando os 6 primeiros displays alguem poderia me ajudar?