Sistem Programlama 10. Hafta Doküman 1

Dörtlü Seven Segment

Dörtlü 7-segmentte sayı yazmayı sağlayan program. (Timer kullanmadan)
#include <stdint.h>
#include <stdbool.h>

#include "inc/tm4c123gh6pm.h"
// stellaris icin: #include "inc/lm4f120h5qr.h"

void init_port_B() {
    volatile unsigned long delay;
    SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOB;
    delay = SYSCTL_RCGC2_R;
    GPIO_PORTB_DIR_R |= 0xFF;
    GPIO_PORTB_AFSEL_R &= ~0xFF;
    GPIO_PORTB_DEN_R |= 0xFF;

}

void init_port_E() {
    volatile unsigned long delay;
    SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOE;
    delay = SYSCTL_RCGC2_R;
    GPIO_PORTE_DIR_R |= 0x0f;
    GPIO_PORTE_AFSEL_R &= ~0x0f;
    GPIO_PORTE_DEN_R |= 0x0f;
}

// 0'dan 9'a kadar olan sayilarin seven segment kodlari
// bit sirasi: g f e d c b a
uint8_t kodlar[10] = {
    0b0111111,
    0b0000110,
    0b1011011,
    0b1001111,
    0b1100110,
    0b1101101,
    0b1111101,
    0b0000111,
    0b1111111,
    0b1101111
};



int main() {
    volatile unsigned long delay;

    init_port_B();
    init_port_E();

    int sayi = 1234;

    const int BEKLEME_LIMIT = 10000;

    while (1) {
        int birler = sayi % 10;
        GPIO_PORTE_DATA_R |= 0b1111; // hepsini kapat
        GPIO_PORTB_DATA_R = kodlar[birler];
        GPIO_PORTE_DATA_R &= ~0b0001; // birler basamagini aktiflestir
        for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++)
            /* bekle */;

        int onlar = (sayi / 10) % 10;
        GPIO_PORTE_DATA_R |= 0b1111; // hepsini kapat
        GPIO_PORTB_DATA_R = kodlar[onlar];
        GPIO_PORTE_DATA_R &= ~0b0010; // onlar basamagini aktiflestir
        for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++)
            /* bekle */;

        int yuzler = (sayi / 100) % 10;
        GPIO_PORTE_DATA_R |= 0b1111; // hepsini kapat
        GPIO_PORTB_DATA_R = kodlar[yuzler];
        GPIO_PORTE_DATA_R &= ~0b0100; // yuzler basamagini aktiflestir
        for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++)
            /* bekle */;

        int binler = (sayi / 1000) % 10;
        GPIO_PORTE_DATA_R |= 0b1111; // hepsini kapat
        GPIO_PORTB_DATA_R = kodlar[binler];
        GPIO_PORTE_DATA_R &= ~0b1000; // binler basamagini aktiflestir

        for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++)
            /* bekle */;
    }
}