17 Temmuz 2018 Salı

STM32 VL Discovery ile ARM Programlama - 16x2 LCD Kullanımı



Merhaba arkadaşlar,
Bu yazımda sizlerle STM32VLDISCOVERY kartını kullanarak LCD sürme kodlarını paylaşacağım. Kodları gitHub'dan buldum bir kaç küçük düzeltme yaptım ve yapmaya devam da edeceğim, linkini bırakıyorum.

https://github.com/applefreak/STM32-HD44780

Öncelikle şunu belirtmek isterim ki, bu yazıyı okumadan önce PIC,Arduino vs. ile LCD kullandığınızı varsayıyorum. 

Paylaşacağım kodlara göre aşağıdaki bağlantıları yapmanız gerekiyor.

RS -----> Pin C0
EN -----> Pin C1
RW -----> Toprak
D4 -----> Pin C4
D5 -----> Pin C5
D6 -----> Pin C6
D7 -----> Pin C7  

Aşağıda paylaşacağım kodları lcd.c ve lcd.h isimli iki dosya oluşturup içine kaydetmeliyiz. Daha sonra bu dosyaları projemizin bulunduğu klasörün içine atmalıyız.

Kütüphanenin projeye dahil edilmesi ve kullanılması ile ilgili çektiğimi YouTube videom aşağıda,




Kütüphane Kodları ↓↓↓↓↓↓↓↓

lcd.c


//#include "stm32f10x.h"
/*
Ana Kaynak        : https://github.com/applefreak/STM32-HD44780
Guncelleyen   : Bahadir Aydinoglu
Güncelleme Tarihi : 17.07.18
*/
#include "lcd.h"

#define LCD_Port GPIOC
#define RS GPIO_Pin_0
#define EN GPIO_Pin_1
#define D4 GPIO_Pin_4
#define D5 GPIO_Pin_5
#define D6 GPIO_Pin_6
#define D7 GPIO_Pin_7

void strobeEN(void);
void upNib(uint8_t c);
void downNib(uint8_t c);
void Delay(uint32_t nCount);

void lcd_init(void) {
 GPIO_InitTypeDef GPIO_InitStructure;
 //Init GPIOs
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 GPIO_InitStructure.GPIO_Pin   = EN | RS | D4 | D5 | D6 | D7; 
 GPIO_ResetBits(LCD_Port, EN | RS | D4 | D5 | D6 | D7);
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(LCD_Port, &GPIO_InitStructure);
 
 GPIO_ResetBits(LCD_Port, EN | RS | D4 | D5 | D6 | D7);
 Delay(0xffff);
 sendCMD(0x02);
 Delay(0x3FFFC);  //wait 20ms
 sendCMD(0x28);  //LCD configs
 sendCMD(0x06);
 sendCMD(0x01);
 sendCMD(0x0E);
 sendCMD(0x0C);
 Delay(0xffff);
}

void strobeEN(void) {
 Delay(6000);
 GPIO_SetBits(LCD_Port, EN);
 Delay(6000);
 GPIO_ResetBits(LCD_Port, EN);
}

void upNib(uint8_t c) {
 if(c & 0x80)
  GPIO_SetBits(LCD_Port, D7);
 else
  GPIO_ResetBits(LCD_Port, D7);
 if(c & 0x40)
  GPIO_SetBits(LCD_Port, D6);
 else
  GPIO_ResetBits(LCD_Port, D6);
 if(c & 0x20)
  GPIO_SetBits(LCD_Port, D5);
 else
  GPIO_ResetBits(LCD_Port, D5);
 if(c & 0x10)
  GPIO_SetBits(LCD_Port, D4);
 else
  GPIO_ResetBits(LCD_Port, D4);
}

void downNib(uint8_t c) {
 if(c & 0x8)
  GPIO_SetBits(LCD_Port, D7);
 else
  GPIO_ResetBits(LCD_Port, D7);
 if(c & 0x4)
  GPIO_SetBits(LCD_Port, D6);
 else
  GPIO_ResetBits(LCD_Port, D6);
 if(c & 0x2)
  GPIO_SetBits(LCD_Port, D5);
 else
  GPIO_ResetBits(LCD_Port, D5);
 if(c & 0x1)
  GPIO_SetBits(LCD_Port, D4);
 else
  GPIO_ResetBits(LCD_Port, D4);
}

void sendCMD(uint8_t c) {
 GPIO_ResetBits(LCD_Port, RS);
 upNib(c);
 strobeEN();
 downNib(c);
 strobeEN();
}

void lcd_putc(char c) {
 if(((c>=0x20)&&(c<=0x7F)) || ((c>=0xA0)&&(c<=0xFF))) 
  { //check if 'c' is within display boundry
  GPIO_SetBits(LCD_Port, RS);
  upNib(c);
  strobeEN();
  downNib(c);
  strobeEN();
  GPIO_ResetBits(LCD_Port, RS);
 }
}

void lcd_print(char *s) {
 uint8_t i=0;
 
 while(s[i] != '\0') {
  lcd_putc(s[i]);
  i++;
 }
}

void lcd_clear(void) {
 sendCMD(0x01);
}

void lcd_line1(void) {
 sendCMD(0x80);
}

void lcd_line2(void) {
 sendCMD(0xC0);
}

/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name  : Delay
* Description    : Inserts a delay time.
* Input          : nCount: specifies the delay time length.
* Output         : None
* Return         : None
* Note      : ffff=5mS
*******************************************************************************/
void Delay(uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}



lcd.h


#include "stm32f10x.h"
void lcd_init(void);
void sendCMD(uint8_t c);
void lcd_putc(char c);
void lcd_print(char *s);
void lcd_clear(void);
void lcd_line1(void);
void lcd_line2(void);
void Delay(uint32_t nCount);



Kullanım Örneği;


#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "stdio.h"

char yazi[16]=" ";
uint32_t sayi=1;
int main() 
{ 
 lcd_init();
 delay_init();
 lcd_clear(); 
 while(1)
 {
  lcd_clear();
  lcd_line1();
  lcd_print("SAYI:");
  lcd_line2();  
  sprintf(yazi,"%u",sayi);
  lcd_print(yazi);
  delay_ms(1000);
  sayi++;  
 } 
}

1 yorum:

  1. Anlıyamadığım bir çok şeyi anladım çok iyi hazırlanmış bir uygulama ilk frsatta deniyeceğim .teşekkürler

    YanıtlaSil