COIDE İLE NUCLEO-F401RE PROGRAMLAMA – Karakter LCD Uygulaması

Bu yazımızda STM32 NUCLEO kitimize 2×16 karakter LCD bağlayacağız. Önceki uygulamalarımızda hep kontrolcümüzün dahili donanımlarını ve ST’nin oluşturmuş olduğu standart kütüphaneleri kullanmıştık. Bu uygulamada harici bir donanım bağlayacağımız için bu donanımı kontrol edecek olan kütüphaneyi kendimizin oluşturması gerekmektedir.

İlk olarak LCD ekran ile NUCLEO kiti arasındaki bağlantıları aşağıdaki şemaya uygun olarak yapmamız gerekiyor. Elinizdeki LCD’nin pin dizilimleri farklı olabilir, ürün kataloğundan bakarak doğru bağlantıyı yapmanız gerekmektedir.

coide_LCD_1

LCD ekranlar piyasada çok sık kullanılırlar. Bu nedenle internette farklı kişilerin oluşturup yayınladıkları hazır kütüphaneler bulmak mümkün. Bu uygulamamızda Tilen Majerle’nin oluşturduğu kütüphaneyi kullanacağım. Linkte kütüphanenin kullanımını anlattığı ve indirme linlerinin bulunduğu sayfayı bulabilirsiniz.

http://stm32f4-discovery.com/2014/06/library-16-interfacing-hd44780-lcd-controller-with-stm32f4/

Öncelikle kütüphane dosyalarını indirip proje klasörümüzün içerisine kopyalıyoruz. Daha sonra coide üzerinden projemize bu dosyaları ekliyoruz.

coide_LCD_2

 

Kütüphaneyi kendi donanımımıza uygun olarak düzenlememiz gerekmektedir. Bunun için tm_stm32f4_hd44780.h dosyası içerisindeki pin tanımlamalarını düzenlememiz gerekmekte. Bu uygulamada pin bağlantıları kolay olması sebebiyle arduino konnektöre jumper kablolar ile yapıldı.

coide_LCD_3

 

tm_stm32f4_hd44780.h dosyası içerisindeki pin tanımlamarını aşağıdaki gibi düzenledik, ve kullanmadığımız tm_stm32f4_delay.h ve define.h başlık kütüphanlenerini yorum haline getirdik.


#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
//#include "tm_stm32f4_delay.h"                 // Kullanmıyoruz.
//#include "defines.h"                          // Kullanmıyoruz.

//4 bit mode
//Control pins, can be owerwritten
//RS - Register select pin
#ifndef TM_HD44780_RS_PIN
#define TM_HD44780_RS_RCC RCC_AHB1Periph_GPIOA
#define TM_HD44780_RS_PORT GPIOA
#define TM_HD44780_RS_PIN GPIO_Pin_8
#endif
//E - Enable pin
#ifndef TM_HD44780_E_PIN
#define TM_HD44780_E_RCC RCC_AHB1Periph_GPIOB
#define TM_HD44780_E_PORT GPIOB
#define TM_HD44780_E_PIN GPIO_Pin_10
#endif
//Data pins, can be owerwritten
//D4 - Data 4 pin
#ifndef TM_HD44780_D4_PIN
#define TM_HD44780_D4_RCC RCC_AHB1Periph_GPIOB
#define TM_HD44780_D4_PORT GPIOB
#define TM_HD44780_D4_PIN GPIO_Pin_4
#endif
//D5 - Data 5 pin
#ifndef TM_HD44780_D5_PIN
#define TM_HD44780_D5_RCC RCC_AHB1Periph_GPIOB
#define TM_HD44780_D5_PORT GPIOB
#define TM_HD44780_D5_PIN GPIO_Pin_5
#endif
//D6 - Data 6 pin
#ifndef TM_HD44780_D6_PIN
#define TM_HD44780_D6_RCC RCC_AHB1Periph_GPIOB
#define TM_HD44780_D6_PORT GPIOB
#define TM_HD44780_D6_PIN GPIO_Pin_3
#endif
//D7 - Data 7 pin
#ifndef TM_HD44780_D7_PIN
#define TM_HD44780_D7_RCC RCC_AHB1Periph_GPIOA
#define TM_HD44780_D7_PORT GPIOA
#define TM_HD44780_D7_PIN GPIO_Pin_10
#endif

tm_stm32f4_hd44780.c dosyasında da bazı değişiklikler yapmamız gerekmekte. Öncelikle kullanmadığımız satırları yorum haline getirdik. Kütüphaneyi oluşturan arkadaş farklı bir delay rutini kullandığı için delay fonksiyonuna gönderdiği sayıları küçültmemiz gerekiyor. Ben systick timer örneğimizdeki gecikme rutinini kullanıyorum. TM_HD44780_Init() ve TM_HD44780_Clear() fonksiyonları içerisindeki delay fonksiyonlarını aşağıdaki gibi değiştirdim.


#include "tm_stm32f4_hd44780.h"
//#include "tm_stm32f4_usart.h"                        // Kullanmıyoruz.

TM_HD44780_Options_t TM_HD44780_Opts;

void TM_HD44780_Init(uint8_t cols, uint8_t rows) {
//TM_DELAY_Init();                                     // Kullanmıyoruz.

//TM_USART_Init(USART1, TM_USART_PinsPack_1, 9600);    // Kullanmıyoruz.

TM_HD44780_InitPins();

//At least 40ms
TM_HD44780_Delay(45);

TM_HD44780_Opts.Rows = rows;
TM_HD44780_Opts.Cols = cols;

TM_HD44780_Opts.currentX = 0;
TM_HD44780_Opts.currentY = 0;

TM_HD44780_Opts.DisplayFunction = TM_HD44780_4BITMODE | TM_HD44780_5x8DOTS | TM_HD44780_1LINE;
if (rows > 1) {
TM_HD44780_Opts.DisplayFunction |= TM_HD44780_2LINE;
}

//Try to set 4bit mode
TM_HD44780_Cmd4bit(0x03);
TM_HD44780_Delay(4);

//Second try
TM_HD44780_Cmd4bit(0x03);
TM_HD44780_Delay(4);

//Third goo!
TM_HD44780_Cmd4bit(0x03);
TM_HD44780_Delay(4);

//Set 4-bit interface
TM_HD44780_Cmd4bit(0x02);
TM_HD44780_Delay(1);

//set # lines, font size, etc.
TM_HD44780_Cmd(TM_HD44780_FUNCTIONSET | TM_HD44780_Opts.DisplayFunction);

//turn the display on with no cursor or blinking default
TM_HD44780_Opts.DisplayControl = TM_HD44780_DISPLAYON;
TM_HD44780_DisplayOn();

//Clear lcd
TM_HD44780_Clear();

//Default font directions
TM_HD44780_Opts.DisplayMode = TM_HD44780_ENTRYLEFT | TM_HD44780_ENTRYSHIFTDECREMENT;
TM_HD44780_Cmd(TM_HD44780_ENTRYMODESET | TM_HD44780_Opts.DisplayMode);

TM_HD44780_Delay(45);
}

void TM_HD44780_Clear(void) {
 TM_HD44780_Cmd(TM_HD44780_CLEARDISPLAY);
 TM_HD44780_Delay(3);
}

Bunlara ek olarak tm_stm32f4_hd44780.h dosyasındaki aşağıda görülen delay değerlerinide değiştirmek gerekti. Bu değişimi yapmazsanız yazılar ekrana yavaş bir şekilde yazdırılıyor.

#define TM_HD44780_E_BLINK TM_HD44780_E_HIGH; TM_HD44780_Delay(1); TM_HD44780_E_LOW; TM_HD44780_Delay(1)

Bu aşamada kütüphanemizi düzgün bir şekilde ayarladık. Artık ana programımızda LCD ile ilgili uygulamaya geçebiliriz.

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_it.h"
#include "tm_stm32f4_hd44780.h"

static __IO uint32_t TimingDelay;

void SysTick_Handler(void);
void Delay(__IO uint32_t nTime);
void TimingDelay_Decrement(void);

int main(void)
{
 if (SysTick_Config(SystemCoreClock / 1000))
 {
 /* Capture error */
 while (1);
 }

 /* GPIO init */
 // LED PIN AYARI
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // A portunun saat darbesini aktifleştidik.

 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 5 numaralı pin için ayarlıyoruz.
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Pin çıkış tipini ayarladık.
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Pinimizi output olarak ayarladık.
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pull Up direncini pasif yaptık.
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Pinin maksimum çalışma frekansını ayarladık.
 GPIO_Init(GPIOA, &GPIO_InitStructure); // Ayarları uyguluyoruz.

 /* LCD Init */
 TM_HD44780_Init(16,2);

 while(1)
 {

 TM_HD44780_Puts(0,0,"mesut.dargut.com");

 GPIO_ToggleBits(GPIOA, GPIO_Pin_5); // ledi tersliyoruz.
 Delay(1000);
 }
}

/**
 * @brief This function handles SysTick Handler.
 * @param None
 * @retval None
 */
void SysTick_Handler(void)
{
 TimingDelay_Decrement();
}

/**
 * @brief Inserts a delay time.
 * @param nTime: specifies the delay time length, in milliseconds.
 * @retval None
 */
void Delay(__IO uint32_t nTime)
{
 TimingDelay = nTime;

 while(TimingDelay != 0);
}

/**
 * @brief Decrements the TimingDelay variable.
 * @param None
 * @retval None
 */
void TimingDelay_Decrement(void)
{
 if (TimingDelay != 0x00)
 {
 TimingDelay--;
 }
}

Ana programımıza tm_stm32f4_hd44780.h başlık dosyamızı ekledik. Daha önce gördüğümüz systick timer ve led ayarlamalarını yaptık.
TM_HD44780_Init(16,2)  fonksiyonu ile LCD ekranımızın ayarlarını yaptık. Burada ilk değişken sütun sayısını, ikinci değişken satır sayısını belirtmektedir. Aynı kütüphaneyi 4×20 LCD ile de kullanabilirsiniz.

Artık ana döngümüz içerisinde istediğimiz yazıyı ekrana yazdırabiliriz.

TM_HD44780_Puts(0,0,"mesut.dargut.com");

Bu fonksiyonda ilk değişken sütun, ikinci değişken satır sayısını belirtir. Üçüncü değişkende bulunan karakterler bu koordinatlardan başlayarak yazdırılır.

coide_LCD_4

 

Proje dosyasını linkten indirebilirsiniz. –> coide_LCD

Etiket(ler): , , , , , .Yer işareti koy Kalıcı Bağlantı.

COIDE İLE NUCLEO-F401RE PROGRAMLAMA – Karakter LCD Uygulaması için 2 cevap

  1. anonim diyorki:

    Merhaba, çok kısa bir şey danışmak istiyorum, size nasıl ulaşabilirim?

anonim için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir