BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Gömülü Programlama > Led ekran (7 segment)

Led ekran (7 segment)

Bu bölümde, 7 bölmeli LED ekranı elimizdeki F401-RE karta bağlayarak kullanmamızı sağlayan programı Mbed ve STM32CubeIDE yoluyla yazmaya çalışacağız. Bu işlem için, mikrodenetleyici kartı ile LED ekran arasında bağlantı sağlamak için bir adet breadboard, bir adet 1 K direnç ve 8 adet erkek-erkek bağlantı kablosuna ihtiyacımız var.

LED ekran, sayı görüntülemek için kullanılan 8 LED'li bir görüntüleme aygıtıdır. 7 adet hat (çubuk) bölümü ve 1 adet noktadan oluşur. Ondalık sayı sistemi için 0-9 değerlerini, onaltılık sayı sistemi için 0-F değerlerini gösterebilir.

İki tür 7 bölmeli ekran vardır:

  • Ortak anod: Ortak nokta pozitif voltaj kaynağına bağlanır. Bir bölüm pini LED’i yakmak için toprak hattına bağlanır.
  • Ortak katod: Ortak nokta toprağa bağlanır. Bir bölüm pini LED’i yakmak için pozitif voltaj kaynağına bağlanır.

Bu bölümde ortak anot devre özelliğine sahip olan 5611BH 7-Segment LED ekran kullanacağız.

5611BH 7-Segment LED ekranı STM32F401RE mikrodenetleyici karta bağlayarak, 0-9 arasındaki sayıları 2 saniyelik gecikme ile ekranda göstermeye çalışacağız. Ekran üzerinde A'dan G'ye kadar olan segmentleri kart üzerindeki bulunan Arduino konnektörün D2-D8 veri çıkış pinlerine bağlayacağız.

STM32F401RE mikrodenetleyici kart ile 5611BH 7-Segment LED ekran bağlantısı aşağıdaki şemaya uygun olarak yapılacaktır:

LED ekran (Mbed ile)

1. Önce buradaki talimatları uygulayarak, Mbed OS online geliştirme ortamında yeni bir program oluşturalım.

2. main.cpp dosyası içine aşağıdaki kodları yazarak kaydedelim:


#include "mbed.h"

DigitalOut A(D2);
DigitalOut B(D3);
DigitalOut C(D4);
DigitalOut D(D5);
DigitalOut E(D6);
DigitalOut F(D7);
DigitalOut G(D8);

void display_LED(int num)
{
   switch (num) {
      case 0: A=0; B=0; C=0; D=0; E=0; F=0; G=1; break;
      case 1: A=1; B=0; C=0; D=1; E=1; F=1; G=1; break;
      case 2: A=0; B=0; C=1; D=0; E=0; F=1; G=0; break;
      case 3: A=0; B=0; C=0; D=0; E=1; F=1; G=0; break;
      case 4: A=1; B=0; C=0; D=1; E=1; F=0; G=0; break;
      case 5: A=0; B=1; C=0; D=0; E=1; F=0; G=0; break;
      case 6: A=0; B=1; C=0; D=0; E=0; F=0; G=0; break;
      case 7: A=0; B=0; C=0; D=1; E=1; F=1; G=1; break;
      case 8: A=0; B=0; C=0; D=0; E=0; F=0; G=0; break;
      case 9: A=0; B=0; C=0; D=0; E=1; F=0; G=0; break; 
   }
}

int main() {
    while (1) {
       for (int id=0; id<10; id++)  {
            display_LED(id);
            wait(2);
       }
    }
    return 0;
}

Ekranda göstermek istediğimiz rakamın yanması gereken bölümleri için 0 değeri, diğer bölümler için 1 değeri tanımlanır.

3. Programı derleyelim ve elde ettiğimiz .bin uzantılı dosyayı bilgisayarımıza kaydedelim.

4. Bilgisayarımıza kaydettiğimiz .bin uzantılı dosyayı, kart bilgisayara bağlandığında Windows Explorer’da görünen flash bellek içine kopyalayalım.

5. Windows Explorer'da kartı temsil eden sürücüye kopyaladığımız .bin uzantılı dosya kart tarafından otomatik olarak okunarak çalıştırılır. Kart kendini resetler ve .bin uzantılı dosya silinir.

6. Program çalışmaya başladığında, LED ekranı 0-9 arasındaki sayıları 2 saniye ara ile göstermeye başlar.

LED ekran (STM32CubeIDE ile)

1. Önce buradaki talimatları uygulayarak, STM32CubeIDE ortamında yeni bir proje oluşturalım.

2. Projemize verdiğimizin isme sahip .ioc uzantılı dosyaya tıkladığımızda karşımıza gelen pencerede, mikrodenetleyici kart üzerindeki Arduiono konnektörün D2, D3, D4, D5, D6, D7 ve D8 pinlerine sırasıyla karşılık gelen PA10, PB3, PB5, PB4, PB10, PA8 ve PA9 kutularına tıkladığımızda karşımıza gelen seçeneklerden GPIO_Output seçeneğini seçelim:

3. Bu işlemi gerçekleştirdiğimizde, aşağıda gösterilen kodlar projemizin main.c dosyası içindeki MX_GPIO_Init fonksiyon içeriği otomatik olarak aşağıdaki şekilde düzenlenir.


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, LD2_Pin|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : B1_Pin */
  GPIO_InitStruct.Pin = B1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : LD2_Pin PA8 PA9 PA10 */
  GPIO_InitStruct.Pin = LD2_Pin|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB10 PB3 PB4 PB5 */
  GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

4. main.c dosyasının içindeki kodları aşağıdaki şekilde düzenleyerek ve sonuna display_LED() fonksiyonunu ekleyerek kaydedelim:


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
void display_LED(int num);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    for (int id=0; id<10; id++)  {
         display_LED(id);
         HAL_Delay(2000);
	}
    /* USER CODE BEGIN 3 */
  }
}

.
.
.

/* USER CODE BEGIN 4 */
void display_LED(int num)
{
   switch (num) {
      case 0:
    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 1:
     	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_4, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 2:
    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);
    	   break;
      case 3:
    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 4:
    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_4, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 5:
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_10, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 6:
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
           break;
      case 7:
    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_4, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 8:
     	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
      case 9:
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

    	   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
    	   break;
   }
}
/* USER CODE END 4 */

5. Programı derleyelim.

6. Doğrudan Run butonuna basarak veya elde ettiğimiz .bin uzantılı dosyayı, kart bilgisayara bağlandığında Windows Explorer’da görünen flash bellek içine kopyalayalım.

7. Program kart tarafından otomatik olarak okunarak çalıştırılır. Kart kendini resetler.

6. Program çalışmaya başladığında, LED ekranı 0-9 arasındaki sayıları 2 saniye ara ile göstermeye başlar.