Texas Stellaris Launchpad EK-LMF120XL Pantalla de cuatro dígitos con siete segmentos

-1

Estoy trabajando en hacer un contador de 4 dígitos desde 0 a 999. Estoy usando el puerto D para el cual se escribirá el dígito y el puerto B para el cual se mostrará el número de siete segmentos.

Estoy usando una pantalla de ánodo común de 4 dígitos. 330ohm para número de siete segmentos, 10K para transistores y transistores conectados al Puerto D (PD0, PD1, PD2, PD3). Utilicé transistor para decidir qué dígito se va a escribir. Aquí está mi código abajo.

    #include <stdint.h>
#include "inc/lm4f120h5qr.h"

#include "inc/hw_ints.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"

static inline void disable_interrupts() {
    asm("CPSID I");
}

static inline void enable_interrupts() {
    asm("CPSIE I");
}

static inline void wait_for_interrupt() {
    asm("WFI");
}

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_D() {
    volatile unsigned long delay;
    SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOD; // activate port D
    delay = SYSCTL_RCGC2_R;     // allow time for clock to stabilize
    GPIO_PORTD_DIR_R |= 0x0F;   // make PD3-0 out
    GPIO_PORTD_AFSEL_R &= ~0x0F; // regular port function
    GPIO_PORTD_DEN_R |= 0x0F;   // enable digital I/O on PD3-0
}

void init_timer_0(unsigned int period) {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
    TimerLoadSet(TIMER0_BASE, TIMER_A, period);

    IntEnable(INT_TIMER0A);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    TimerEnable(TIMER0_BASE, TIMER_A);
}

volatile int flag_ekran_guncelle = 0;

void timer_0_handler() {
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // clear time interrupt

    flag_ekran_guncelle = 1;
}

void SysTick_Init(unsigned long period) {
    NVIC_ST_CTRL_R = 0;         // disable SysTick during setup
    NVIC_ST_RELOAD_R = period - 1;      // reload value
    NVIC_ST_CURRENT_R = 0;      // any write to current clears it
    NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R & 0x00FFFFFF) | 0x40000000; // priority 2
    NVIC_ST_CTRL_R = 0x07; // enable SysTick with core clock and interrupts
    // enable interrupts after all initialization is finished
}

// 1 saniyedeki systick kesmesi sayisi
#define SYSTICK_HZ 100
// baslangictan itibaren olusan systick kesmesi sayisi
uint32_t systick_count = 0;

volatile int flag_sayi_arttir = 0;

void systick_handler() {
    systick_count++;

    // 0.1 saniyede bir sayiyi arttirma flagini 1 yap
    if ((systick_count % (SYSTICK_HZ / 10)) == 0)
     flag_sayi_arttir = 1;
}

// 0'dan 9'a kadar olan sayilarin seven segment kodlari
// bit sirasi: g f e d c b a
uint8_t kodlar[10] = {

        0xC0,
        0XF9,
        0XA4,
        0XB0,
        0X99,
        0X92,
        0X83,
        0XF8,
        0x80,
        0x98
   /*0b0111111,
    0b0000110,
    0b1011011,
    0b1001111,
    0b1100110,
    0b1101101,
    0b1111101,
    0b0000111,
    0b1111111,
    0b1101111*/

};

int ekran_guncelle_no = 0;
void ekran_guncelle(int sayi) {
    ekran_guncelle_no = (ekran_guncelle_no + 1) % 4; // guncellenen ekranin numarasini bir arttir

    if (ekran_guncelle_no == 0) {
     int birler = sayi % 10;
    GPIO_PORTD_DATA_R |= 0b1111; // hepsini kapat
    GPIO_PORTD_DATA_R &= ~0b0001;
    GPIO_PORTB_DATA_R = kodlar[birler];
    // birler basamagini aktiflestir
    } else if (ekran_guncelle_no == 1) {
     int onlar = (sayi / 10) % 10;
    GPIO_PORTD_DATA_R |= 0b1111; // hepsini kapat
    GPIO_PORTD_DATA_R &= ~0b0010;
    GPIO_PORTB_DATA_R = kodlar[onlar];// onlar basamagini aktiflestir
    }if (ekran_guncelle_no == 2) {
     int yuzler = (sayi / 100) % 10;
    GPIO_PORTD_DATA_R |= 0b1111; // hepsini kapat
    GPIO_PORTD_DATA_R &= ~0b0100;
    GPIO_PORTB_DATA_R = kodlar[yuzler];// yuzler basamagini aktiflestir
    } else if (ekran_guncelle_no == 3) {
     int binler = (sayi / 1000) % 10;
    GPIO_PORTD_DATA_R |= 0b1111; // hepsini kapat
    GPIO_PORTD_DATA_R &= ~0b1000;
    GPIO_PORTB_DATA_R = kodlar[binler];// binler basamagini aktiflestir
    }
}

int main() {

    disable_interrupts();
    init_port_B();
    init_port_D();
    init_timer_0(SysCtlClockGet() / 200);
    SysTick_Init(1600000);

    enable_interrupts();

    int sayi = 1234;

    while (1) {
     if (flag_ekran_guncelle == 1) {
         flag_ekran_guncelle = 0;
         ekran_guncelle(sayi);
     }

     if (flag_sayi_arttir == 1) {
         flag_sayi_arttir = 0;
         sayi++;
     }

     wait_for_interrupt();
    }
}

No sé dónde está mal este código, pero no está funcionando bien. Si crees que el código era correcto, podría ser un problema de conexión electrónica. Entonces, si piensa de esta manera, dígame cómo puedo conectar correctamente el segmento de cuatro dígitos de 4 dígitos a mi launchpad.

    
pregunta Mustafa Alp

1 respuesta

1

Me moví a 2 pines (PD3, PD4) a otro pin (PE1, PE2) y cambié el código de esa manera. Funcionó. No sé por qué, pero por ahora funciona muy bien.

    
respondido por el Mustafa Alp

Lea otras preguntas en las etiquetas