C DE SEGMENT ANLATIMI ANLAMADIM

Başlatan mikro, 21 Mayıs 2012, 21:33:34

mikro

arkadaşlar fxdev arkadaşın kitabından bu bölüme geldim herşey tamam ama kafama takılan 2 şeyi çözemedim  PORTB=segment[i/10]; // i'nin 10'a bölümü gösteriliyor tamamda niye 10 i ona kadarmı sayıyor bölünenden kalan ne 999 sayacı kullansak nasıl olacak  PORTB=segment[i%10]; // i'nin 10'a bölümünden kalanı gösteriliyor nasıl oluyor tam açıklayıcı olmayınca çözmemde zorlaşıyor  bana mantıklı bir anlatma tarzı ile anlatacak olan herkese sonsuz saygılar teşekkürler yardımlarınızı bekliyorum





  ARKADAŞLAR BU KISMI ÇÖZEMEDİM

{
PORTC=0x02; // PORTC'de 2 değeri gönderiliyor
PORTB=segment[i/10]; // i'nin 10'a bölümü gösteriliyor
DelayMs(5); // 5ms bekleniyor
PORTC=0x01; // PORTC'de 1 değeri gönderiliyor
PORTB=segment[i%10]; // i'nin 10'a bölümünden kalanı gösteriliyor
DelayMs(5);




///////////////////////////////////////////////////////////////////////////////////////


#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi
const unsigned char
segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void sayi_goster(char i) // Sayı göstermeye yarayan fonksiyon
{
PORTC=0x02; // PORTC'de 2 değeri gönderiliyor
PORTB=segment[i/10]; // i'nin 10'a bölümü gösteriliyor
DelayMs(5); // 5ms bekleniyor
PORTC=0x01; // PORTC'de 1 değeri gönderiliyor
PORTB=segment[i%10]; // i'nin 10'a bölümünden kalanı gösteriliyor
DelayMs(5); // 5ms bekleniyor
}
void main(void) // Ana fonksiyon alanı
{
int i; // Herhangi bir değisken tanımlanıyor
ADCON1=0x07; // PORTA dijital yapılıyor
TRISA=0x03; // PORTA'nın ilk iki pini giris
TRISB=0x00; // PORTB çıkıs olarak yönlendiriliyor
TRISC=0x00; // PORTC çıkıs yapılıyor
PORTA=0x00; // PORTA'nin tüm çıkısları sıfırlanıyor
PORTB=0x00; // PORTB'nin tüm çıkısları sıfırlanıyor
PORTC=0x00; // PORTC'nin tüm çıkısları sıfırlanıyor
for(;;) // Sonsuz döngüye giriliyor
{
if(RA0==0) // RA0'pini 0 mı?
{
while(!RA0); // Buton bırakıldı mı diye bakılıyor
i++; // Değisken artırılıyor
if(i>99) // Eğer değisken 99'dan büyükse 0 oluyor
i=0;
}
else if(RA1==0) // RA1'pini 0 mı?
{
while(!RA1); // Buton bırakıldı mı diye bakılıyor
i--; // Değisken azaltılıyor
if(i<0) // Eğer değisken 0'dan küçükse 99 oluyor
i=99;
}
sayi_goster(i); // O anki sayı gösteriliyor
}
}


ayhani

#1
Şimdi olay şu. Devreniz 2 butonlu 0-99 sayıcı. Devre 2 dijit displayi tarama mantığı ile sürüyor. Örneğin 43 sayısını 2 dijit displayde gösterelim, önce 3 değerini gönderip 2.displaye(43'ün 3'ünü gösterecek display) enerji veriyor 5msn sonra 4 değerini gönderip 1. dislplayi enerjiliyor. bu işlemi çok hızlı yaptığı için ekranda 43 sayısını görüyorsun. Şimdi gelelim bu iş nasıl yapılıyor.

Displaylerin ortak katot uçları portc'ye abcd veri uçları portb'ye bağlı.

43 sayısını önce 10'a bölüyorsun kalan 3 oluyor , bu 3 değerini portb'ye gönderip aynı anda  portc'ye 2 değeri göndererek 2.displayi aktifleştiriyorsun (2.displayde 3 görüldü). 5 milisaniye sonra 4 rakamını portb'ye gönderip aynı anda portc'ye 1 değeri göndererek 1.displayi enerjiliyorsun(1.displayde 4 rakamını gördün) bu işlem hızlı olduğu için ekranda 43 değerini görürsün.

999 sayıcı olsaydı 3 basammaklı sayısı önce 100'e sonra 10'a bölüp basamakları bulman gerekir.

Aşağıdaki linkte tarama mantığını anlatan bir animasyon var
https://www.picproje.org/index.php?topic=15343.0

En iyi bildiğim şey hiçbir şey bilmediğimdir.

mikro

#2
ayhani arkadaşım öncelikle ilgilenip cevap verdiyin için teşekkürler anlatımın gayet açıklayıcı olmuş birde butono basınca sabit duran segment yanıp sönüyor bu proteus tamı  böyle gösteriyor gerçek donanımda yaparmı yoksa butona her basılınca  segmentin yanıp sönmesi normal bir durummudur yoksa düzeltilme imkanı varmı