Home Genel Elektronik STM32 LCD Display Kullanımı

STM32 LCD Display Kullanımı

by onurnp

Nedir Bu Stm32 Lcd Kullanımı

Konudan da anlaşılacağı gibi, bugün 16×2 Lcd panelimizi STM32 ile kullanacağız .

Temel olarak STM32 LCD‘nin kendisi arasındaki paralel bağlantısını kullanacağız. Burada 2 tür bağlantı mevcuttur 4 veri girişi (LCD 4 bit MODU) veya 8 veri girişinin tümünü (8 bit MODE) kullanılarak lcd bağlantısı gerçekleştirbiliriz. 

Biz bu derste, LCD’yi mikrodenetleyicimize bağlamak için 4 bit MOD’u kullanacağız. E elektronikte unutmamanız gereken en kilit nokta ne kadar az bağlantı o kadar sağlıklı bir sistemdir.

Stm32 LCD Bağlantı Şekli

lcd bağlantısı
lcd bağlantısı

Yukarıdaki resimde görebileceğiniz gibi, LCD ‘nin (DB4-DB7) pinini Stm32’nin (PA4-PA7) pinlerine bağlayacağız.

RS , PA1’e bağlı
RW PA2’ye bağlı
EN , PA3’e bağlı

CubeMx Ayarlarımız

Burada 2 şey yapmamız gerekiyor. İlk önce kullanmak istediğimiz tüm pinleri çıkış yani Output olarak belirledik. 

CubeMX Ayar Ekranı
lcd cubemx

Timer Ayarlama

Stm32 de çok fazla delay kullanmadan mikrosaniye cinsinden gecikme yaratmak için Timer ayarlamamız gerekir. Bunun içinde hemen Tim1 timer ayarlarına girelim.

Timer ayarlarını aşağıdaki görsel de ki gibi gibi yaptığınızda doğru ayarlara ulaşacaksınız ancak ben size neden böyle değerler girdik bu değerlere nasıl ulaştık onu resimlerin hemen altında anlatacağım…

Timer gecikme ayarı
Timer gecikme ayarı

Timer Formülü

Şimdi arkadaşlar biz burada lcd’ye vereceğimiz komutlarda bazı gecikmeler yaratacağız. Mikrosaniye cinsinden değerlerde ayarlamak bizim için daha esnek bir yol sunacağı için şimdi size mikrosaniye cinsinden pulse nasıl alınır onu anlatacağım.

Benim kullandığım stm32f103c8t6 serisi mikrodenetleyici 72 mhz yani saniyede 72 milyon adet pulse üretiyor bizim buda 1/72mhz olarak hesapladığımızda 13 nano saniyelere denk gelen bir pulse demektir.

Bu nedenle malum hızımızı bölmemiz gerekiyor..

Prescaler : Bölen kat sayıdır. İşlemci frekansını belirlediğiniz değerde doğrudan böler.

Auto Reload Register : Bu konu ise şu şekilde açıklanabilir Timerlar aşağı yada yukarı doğru belirlenen miktarda sayarlar bu sayma limit dolduğunda pulse yaratarak başa döner. Yani sayma döngüsü genişliğini buradan belirleriz.

!

Timer Formülü

İstenen Timer Frekans = Sistem saat hızı/(Prescaler*Periot)

Şimdi CubeMX kurulumu tamamlandı, kullanacağımız fonksiyonlara bir göz atalım.

Kodlamaya başlayalım

Her şeyden önce, stm32 LCD kullanımı için kullanacağımız Pinleri ve Bağlantı Noktalarını tanımlamamız gerekli çünkü kullanacağımız libte bunlar belirlenmiş şimdi birde libi modifiye etmekle uğraşmamak için libteki isimleri kullanacağız. 

Kullanacağımız libleri en aşağıya ekledim.

Atamaları Yapalım

#define RS_PORT GPIOA
#define RS_PIN GPIO_PIN_1
#define RW_PORT GPIOA
#define RW_PIN GPIO_PIN_2
#define EN_PORT GPIOA
#define EN_PIN GPIO_PIN_3
#define D4_PORT GPIOA
#define D4_PIN GPIO_PIN_4
#define D5_PORT GPIOA
#define D5_PIN GPIO_PIN_5
#define D6_PORT GPIOA
#define D6_PIN GPIO_PIN_6
#define D7_PORT GPIOA
#define D7_PIN GPIO_PIN_7

Sırada mikrosaniye cinsinden gecikmeyi elde etmek için daha önce CubeMX ile kurduğumuz Timer keildeki ayarlarını yapmaya..

Timer Fonksiyonlarını atayalım

#define timer htim1
extern TIM_HandleTypeDef timer;
void delay (uint16_t us)
{
  __HAL_TIM_SET_COUNTER(&timer, 0);
  while (__HAL_TIM_GET_COUNTER(&timer) < us);
}

Verileri / komutu stm32 ile LCD ‘nin ilgili pinlerine yazmak için bir fonksiyon oluşturduk. Bu işlev de 2 durum vardır , birincisi yazma modu yani rw , ikincisi okuma modu yani rs Durum 0 ise rs Durum 1 ise rw olur bunu unutmayalım ve kodlamaya devam edelim.

Veri Kodlarımız

void send_to_lcd (char data, int rs) {     
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, rs);    
HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, ((data>>3)&0x01));     HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, ((data>>2)&0x01));     HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, ((data>>1)&0x01));     HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, ((data>>0)&0x01));     
/* Eğer karakterler hatalı çıkarsa delay değerini artırın*/
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, 1); //  delay (20);     HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, 0); //  delay (20); } 

Fonksiyonlarımız da tamamdır. artık tek yapmamız gereken 4 bit uzunluğunda karakterler belirleyip lcd ‘ye yazdırmak.

/* Eğer karakterler hatalı çıkarsa delay değerini artırın*/

stm32 Lcd Komut Gönderme Fonksiyonu Tanımlama

 void lcd_send_cmd (char cmd) {     
char datatosend;      
datatosend = ((cmd>>4)&0x0f);     
send_to_lcd(datatosend,0);   
datatosend = ((cmd)&0x0f);     
send_to_lcd(datatosend, 0); } 

LCD ‘ye veri gönderme Fonksiyonu Tanımlama

void lcd_send_data (char data) {     
char datatosend;          
datatosend = ((data>>4)&0x0f);     
send_to_lcd(datatosend, 1);    
datatosend = ((data)&0x0f);     
send_to_lcd(datatosend, 1); } 

Sütun Seçme Fonksiyonu

void lcd_put_cur(int row, int col) {     
switch (row)     {         
case 0:             col |= 0x80;             
           break;         
case 1:             col |= 0xC0;             
           break;     
}     
lcd_send_cmd (col); 
} 
 

Yukarıdaki fonksiyon imleci istenen satıra ve sütuna koyar. Satır 0 veya 1 olabilir ve sütun 0 ila 15 arasında değişebilir.

Lcd_init Fonksiyonu

void lcd_init (void) 
{ 
     // 4 bit başlatma 
     HAL_Delay (50); // 
     40ms'den fazla bekleyin lcd_send_cmd (0x30); 
     HAL_Delay (5); // 4.1ms'den fazla bekleyin 
     lcd_send_cmd (0x30); 
     HAL_Delay (1); // 100us'dan fazla bekleyin 
     lcd_send_cmd (0x30); 
     HAL_Delay (10); 
     lcd_send_cmd (0x20); // 4 
     bit modu HAL_Delay (10); 
// 
     dislay başlatması lcd_send_cmd (0x28); // Fonksiyon seti -> DL = 0 (4 bit modu), N = 1 (2 satır ekran) F = 0 (5x8 karakter) 
     HAL_Delay (1); 
     lcd_send_cmd (0x08); // Ekran açma / kapama kontrolü -> D = 0, C = 0, B = 0 ---> ekran kapalı 
     HAL_Delay (1); 
     lcd_send_cmd (0x01); // net ekran
     HAL_Delay (1); 
     HAL_Delay (1); 
     lcd_send_cmd (0x06); // Giriş modu ayarlandı -> I / D = 1 (artış imleci) & S = 0 (kaydırma yok) 
     HAL_Delay (1); 
     lcd_send_cmd (0x0C); // Ekran açma / kapama kontrolü -> D = 1, C ve B = 0. (İmleç ve yanıp sönme, son iki bit) 
}

Yukarıdaki kod, LCD ‘nin Datasheet’indeki başlatma için verilen Diyagramı ile ilgilidir.

Artık Herşey Hazır!!

Artık Yazma işlerimini aşağıdaki Komutlar ile Gerçekleştirebiliriz.

  lcd_init();
  lcd_put_cur(0, 0);
  lcd_send_string("Merhaba");
  lcd_send_string("Elektronik");
  lcd_send_string("Atolyem");
  HAL_Delay(1000);
  lcd_put_cur(1, 0);
  lcd_send_string("Elektronik Atolyem");
  HAL_Delay(2000);
  lcd_clear();

Stm32 LCD Kullanımı için Mutlu SON

Stm32 ile LCD kullanımı

Umarım Stm32 ile lcd kullanımı konusunda yeterince aydınlatabilmişimdir soru ve sorunlarınız için mutlaka bana yazın cevaplarım Sosyal medyadan bizi takip etmeyi unutmayın İyi çalışmalar.


static void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 72-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 0xffff-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
 USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */



}



/**



@brief GPIO Initialization [email protected] [email protected] None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 
                      |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
/*Configure GPIO pins : PA1 PA2 PA3 PA4 
                       PA5 PA6 PA7 */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 
                      |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
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);



}



/* USER CODE BEGIN 4 */



/* USER CODE END 4 */



/**



@brief  This function is executed in case of error [email protected] None

void Error_Handler(void)
{
 USER CODE BEGIN Error_Handler_Debug 
 User can add his own implementation to report the HAL error return state */
/* USER CODE END Error_Handler_Debug */
}



ifdef  USE_FULL_ASSERT



/**



@brief  Reports the name of the source file and the source line numberwhere the assert_param error has [email protected]  file: pointer to the source file [email protected]  line: assert_param error line source [email protected] None
*/
void assert_failed(uint8_t *file, uint32_t line)
{ 
/* USER CODE BEGIN 6 
 User can add his own implementation to report the file name and line number,
 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) 
 USER CODE END 6 */
}



endif /* USE_FULL_ASSERT */



/ (C) COPYRIGHT STMicroelectronics END OF FILE*/

Kodların Tamamı Main.c

/**

  • @brief TIM1 Initialization Function
  • @param None
  • @retval None
    */
    static void MX_TIM1_Init(void)
    { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 / htim1.Instance = TIM1; htim1.Init.Prescaler = 72-1; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 0xffff-1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN TIM1_Init 2 */ /* USER CODE END TIM1_Init 2 */

}

/**

  • @brief GPIO Initialization Function
  • @param None
  • @retval None
    */
    static void MX_GPIO_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
    |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pins : PA1 PA2 PA3 PA4
    PA5 PA6 PA7 */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
    |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    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);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

  • @brief This function is executed in case of error occurrence.
  • @retval None
    / void Error_Handler(void) { / USER CODE BEGIN Error_Handler_Debug / / User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */
    }

ifdef USE_FULL_ASSERT

/**

  • @brief Reports the name of the source file and the source line number
  • where the assert_param error has occurred.
  • @param file: pointer to the source file name
  • @param line: assert_param error line source number
  • @retval None
    */
    void assert_failed(uint8_t *file, uint32_t line)
    {
    /* USER CODE BEGIN 6 / / User can add his own implementation to report the file name and line number,
    tex: printf(“Wrong parameters value: file %s on line %d\r\n”, file, line) / / USER CODE END 6 */
    }

endif /* USE_FULL_ASSERT */

/ (C) COPYRIGHT STMicroelectronics END OF FILE*/

You may also like

Leave a Comment