7 segment display doğru çalışmıyor

Başlatan Ramazans, 05 Temmuz 2024, 11:36:39

Ramazans

AŞAĞIDA VERMİŞ OLDUĞUM DEVRE VE KODLAR
bu kodlara göre swicli bir proje yapmamız istendi ama swiclerde 121 sayısı doğru çalışırken diğerleri bazen çalışıyor bazen çalışmıyor kafasına göre takılıyor bu yüzden yardım istiyorum.
bazı satırlardan sonra ek bilgiler yazılı ama ben gene anlamadım.

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)


// 7 segment display için segment bağlantıları
#define SEG_A PIN_B1
#define SEG_B PIN_B2
#define SEG_C PIN_B7
#define SEG_D PIN_B6
#define SEG_E PIN_B5
#define SEG_F PIN_B3
#define SEG_G PIN_B4

// Display pozisyonları
#define POS_HUNDREDS PIN_D5
#define POS_TENS     PIN_D6
#define POS_UNITS    PIN_D7

// Fonksiyon prototipleri
void displayDigit(int digit, char position);
void showNumber(int number);

volatile unsigned long timer0_millis = 0;

#INT_TIMER0
void TIMER0_isr(void) {
    ++timer0_millis; // Timer0 kesmesi her 1 ms'de bir çağrılır
    set_timer0(6); // Timer0'ı yeniden yükleyin
}

unsigned long millis() {
    return timer0_millis;
}

void main() {
    // Port konfigürasyonları
    set_tris_b(0x00); // PORTB çıkış olarak ayarlandı
    set_tris_d(0xFF); // PORTD giriş olarak ayarlandı
    set_tris_c(0xFF); // PORTC giriş olarak ayarlandı
    set_tris_a(0x00); // PORTA çıkış olarak ayarlandı

    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0'ı yapılandırın
    set_timer0(6); // Timer0 başlangıç değeri (1 ms için ayarlayın)
    enable_interrupts(INT_TIMER0);
    enable_interrupts(GLOBAL);

    int currentNumber = 0;
    int switchPressed = -1;

    while (true) {
        if (input(PIN_D0)) {
            currentNumber = 0; // 000 olarak yazınca sadece birler basamağı yanıyor
        } else if (input(PIN_D4)) {
            currentNumber = 121;
        } else if (input(PIN_C7)) {
            currentNumber = 242;
        } else if (input(PIN_D2)) {
            currentNumber = 363; // 017 yazarak üç basamağı da gösterecek şekilde düzeltildi
        } else if (input(PIN_D3)) {
            currentNumber = 484;
        } else if (input(PIN_C4)) {
            currentNumber = 176;
        } else if (input(PIN_C5)) {
            currentNumber = 347;
        } else if (input(PIN_C6)) {
            currentNumber = 518;
        } else if (input(PIN_D1)) {
            currentNumber = 689;
        } else {
            currentNumber = 0; // Varsayılan durumda 000 olarak ayarlandı
        }

        showNumber(currentNumber);

        delay_ms(5); // Kısa bir bekleme süresi ekliyoruz
    }
}

void displayDigit(int digit, char position) {
    unsigned char segments[] = {
        0b00111111, // 0
        0b00000110, // 1
        0b01011011, // 2
        0b01001111, // 3
        0b01100110, // 4
        0b01101101, // 5
        0b01111101, // 6
        0b00000111, // 7
        0b01111111, // 8
        0b01101111  // 9
    };

    unsigned char mask = segments[digit];
    // Segmentleri PORTB'ye ata
    output_bit(SEG_A, (mask >> 0) & 1);
    output_bit(SEG_B, (mask >> 1) & 1);
    output_bit(SEG_C, (mask >> 2) & 1);
    output_bit(SEG_D, (mask >> 3) & 1);
    output_bit(SEG_E, (mask >> 4) & 1);
    output_bit(SEG_F, (mask >> 5) & 1);
    output_bit(SEG_G, (mask >> 6) & 1);

    // Display seçim pinlerini aktif et
    output_bit(POS_HUNDREDS, position == POS_HUNDREDS);
    output_bit(POS_TENS, position == POS_TENS);
    output_bit(POS_UNITS, position == POS_UNITS);

    delay_us(100); // LED yanma süresi olarak 100us ekledik

    // Displayleri kapat
    output_low(POS_HUNDREDS);
    output_low(POS_TENS);
    output_low(POS_UNITS);
}

void showNumber(int number) {
    int hundreds = number / 100;
    int tens = (number / 10) % 10;
    int units = number % 10;

    for (int i = 0; i < 50; i++) { // Döngü sayısını artırarak her basamağı daha uzun süre gösteriyoruz
        displayDigit(hundreds, POS_HUNDREDS);
        displayDigit(tens, POS_TENS);
        displayDigit(units, POS_UNITS);
    }
}

mehmet

#1
showNumber(int number) fonksiyonuna her girdiğinizde bir haneyi gösterin. "switch", "case" ve "static" bu konuda size yardımcı olacaktır.
Ayrıca timer kesmesini boşuna yapmışsınız. Madem kesmeyi yaptınız, display gösterme kısmını timer kesmesi ile yapınız.

Ek:
İşinize yarar umarım: https://www.mehmetbilgi.net.tr/genel-amacli-voltmetre/
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Ramazans


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal