Pic 16F84A ile bir saat yapmak istiyorum.Gösterge olarak 4 digit 7 segment display kullanacağım ama isiste tarama yönteminde sorun çıkıyor sayıların yeri karışıyor ve tarama karışıyor.taramayı tam olarak nasıl yapmayalım?bağlantıyı direk pic ten yapmak istiyorum ara eleman kullanmadan.kodları ekliyorum buraya.önerilerinizi bekliyorum
int counter=0,secnd=0,minute=0,hour=0,first_digit=0,second_digit=0,third_digit=0,forth_digit=0,dispcounter=0;
char digit_map[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void interrupt()
{ if(INTCON.T0IF == 1) //kesme var ise?
{ counter++;
dispcounter++;
if(counter >= 1953) //sayıcı 1953 olduğunda 1 saniye olur
{ secnd++;
counter = 0;
}
}
if(secnd>=59)
{ minute++;
secnd=0;
}
if(minute>=59)
{ hour++;
minute=0;
}
if(hour>=23)
hour=0;
first_digit = minute % 10;
second_digit = minute / 10;
third_digit = hour % 10;
forth_digit = hour / 10;
/* if(dispcounter>=65)
{ PORTB=digit_map[first_digit];
PORTA=0X01;
delay_ms(10);
PORTB=digit_map[second_digit];
PORTA=0X02;
delay_ms(10);
PORTB=digit_map[third_digit];
PORTA=0X04;
delay_ms(10);
PORTB=digit_map[forth_digit];
PORTA=0x08;
delay_ms(10); dispcounter=0;
} */
INTCON.T0IF = 0; // kesme işareti temizlendi
}
void delay()
{ delay_ms(5);
}
void start()
{ PORTA=0X0F; PORTB=0XBF;
delay_ms(1000);
PORTA=0x0F; PORTB=0X80;
delay_ms(100);
}
void display() //gösterge fonksiyonu
{ PORTB=digit_map[first_digit];
PORTA=0X01;
delay ();
PORTB=digit_map[second_digit];
PORTA=0X02;
delay ();
PORTB=digit_map[third_digit];
PORTA=0X04;
delay ();
PORTB=digit_map[forth_digit];
PORTA=0x08;
delay ();
}
/*void clock_setup ()
{ while(secnd<10)
{ if(Button(&P
{ delay_ms(10);
minute++;
}
if(PORTB.F7=0)
{ delay_ms(10);
hour++;
}
}
display();
} */
void key_check()
{ if(Button(&PORTA, 4, 5, 0)) hour++;
if(Button(&PORTB, 7, 5, 0)) minute++;
}
void main()
{
TMR0=0;
INTCON.GIE = 1; //kesmeler açık
INTCON.T0IE = 1; //timer0 kesmesi açık
OPTION_REG = 0x00; //timer0 1:2
INTCON.RBIF = 0; // kesmeleri temizle
TRISA=0X10; //segment seçimi için kullanılacak
TRISB=0X80; //sayıyı göndermek için kullanılacak
PORTA=0;
PORTB=0;
start ();
first_digit = minute % 10;
second_digit = minute / 10;
third_digit = hour % 10;
forth_digit = hour / 10;
// clock_setup ();
while(1)
{
display ();
key_check ();
}
}