microC ile display tarama yöntemi

Başlatan marecrisium, 02 Mart 2011, 05:21:19

marecrisium

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 ();

      
      }
 
 }