Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Picproje Kütüphane (Library) => Konuyu başlatan: ayhan_eee - 19 Ekim 2014, 01:19:13

Başlık: STM32 - 2x16 LCD Kullanımı
Gönderen: ayhan_eee - 19 Ekim 2014, 01:19:13
Merhaba Arkadaşlar,
Daha önceden yazdığım bu kodu sizinle palaşayım. Belki işine yaran olur.

Verdiğim lcd.c ve lcd.h kodlarını projenizde ygun yere ekleyin. Daha sonra kullanacağınız yerde lcd.h dosyasını çağırın.

lcd.c :


/******************************************************************
*Dosya :lcd.c
*Yazar :Ayhan KORKMAZ - AyhanKorkmaz.Net
*İletişim          :info@ayhankorkmaz.net
*Versiyon :V1.0
*******************************************************************/

#include <stm32f10x.h>
#include "lcd.h"
unsigned char sayac,s,adres=64;

/*****************************************************************************
Kullanim  : Eklemek istediğiniz özel karakterleri ekleyebiliriniz
            Bunun için LCD karakter oluşturma programlarını kulanabilirsiniz
******************************************************************************/
unsigned char karakter_[8][8]=
{
  /* TR Karakterler */
{ 0,14,16,16,17,14, 4, 0},//ç
{ 0, 0,12, 4, 4, 4,14, 0},//I
{10, 0,14,17,17,17,14, 0},//ö
{ 0,15,16,14, 1,30, 4, 0},//$
{10, 0,17,17,17,17,14, 0},//ü
/* özel isaretler */
{2, 6,14,30,14, 6,  2, 0},//<
{ 0, 4, 4, 4, 4, 4, 4, 0},//|
{ 0, 16, 8, 4, 2, 1, 0,0} //\//
};
/********************************************************
Fonksiyon : delay
Amac   : Gecikme Fonksiyonudur.
Kullanim  : delay(0x0000FFFF);
*********************************************************/
void delay(unsigned long delay)
{
while(delay--);
}
/********************************************************
Fonksiyon : lcd_komut
Amac   : LCD Çalışması için gerekli komutları verir
Kullanim  : lcd_komut(temizle);
*********************************************************/
void lcd_komut(char komut)
{
GPIOC->BRR =  0x00000001; //RS=0
GPIOC->ODR |= 0x00000002; //E=1
GPIOC->ODR |= (komut & 0x000000F0);         //Yüksek değerlikli 4 bit gönderiliyor
lcd_gecikme();
GPIOC->BRR = 0x00000002; //E=0
GPIOC->BRR = 0x000000F0; //gönderilen yüksek değerlikli 4 bit porttan temizleniyor.

lcd_gecikme();
GPIOC->ODR |= 0x00000002; //E=1
GPIOC->ODR |= ((komut & 0x0000000F)<<4); //İlk 4 bit lcd ye gönderiliyor.
lcd_gecikme();
GPIOC->BRR = 0x00000002; //E=0
GPIOC->BRR = 0x000000FF; //Gönderilen düşük değerlikli 4 bit porttan temizleniyor.
}
/********************************************************
Fonksiyon : lcd_karakter_yaz
Amac   : LCD Ekrana bir karakter basar
Kullanim  : lcd_karakter_yaz('A');
*********************************************************/
void lcd_karakter_yaz(char veri)
{
switch (veri) {
case 'Ç' : veri=0x00; break;
case 'İ' : veri=0x01; break;
case 'Ö' : veri=0x02; break;
case 'Ş' : veri=0x03; break;
case 'Ü' : veri=0x04; break;

case 'ç' : veri=0x00; break;
case 'ı' : veri=0x01; break;
case 'ö' : veri=0x02; break;
case 'ş' : veri=0x03; break;
case 'ü' : veri=0x04; break;

default : break;
}
 
GPIOC->ODR |= 0x00000001; //RS=1
GPIOC->ODR |= 0x00000002; //E=1
GPIOC->ODR |= (veri & 0x000000F0);         //verinin yüksek değerlikli 4 biti gönderiliyor.
lcd_gecikme();
GPIOC->BRR = 0x00000002; //E=0
GPIOC->BRR = 0x000000F0; //Gönderilen 4 bit porttan temizleniyor.

lcd_gecikme();
GPIOC->ODR |= 0x00000002; //E=1
GPIOC->ODR |= ((veri & 0x0000000F)<<4); //İlk 4 bit gönderiliyor.
lcd_gecikme();
GPIOC->BRR = 0x00000002; //E=0;
GPIOC->BRR = 0x000000FF; //Gönderilen ilk 4bit porttan temizleniyor.
        lcd_gecikme();
}
/********************************************************
Fonksiyon : lcd_yazi_yaz
Amac   : LCD Ekrana yazi yazar
Kullanim  : lcd_yazi_yaz("AyhanKorkmaz.Net");
*********************************************************/
void lcd_yazi_yaz(char *veri)
{

while(*veri)
{
lcd_gecikme();
lcd_karakter_yaz(*veri++);

}
          delay(0x0000FFFF);
}
/**************************************************************
Fonksiyon : lcd_git_xy
Amac   : LCD ekranın hangi bölmesine yazılacağını ayarlarız
Kullanim  : lcd_git_xy(2,1); 2. satır 1. Sütun
***************************************************************/
void lcd_git_xy(unsigned char satir,unsigned char sutun)
{
if(satir==1)
{
lcd_komut(0x00000080 + (sutun-1)); //1.satır 1.sütun için cgram adresi 0x80 dir
}
else if(satir==2)
{
lcd_komut(0x000000C0 +(sutun-1)); //2.satır 1.sütun için chram adresi 0x80+0x40=0xC0 dır
}
}
/********************************************************
Fonksiyon : lcd_hazirla
Amac   : LCD Çalışması için gerekli ilk ayarlar
Kullanim  : lcd_hazirla();
*********************************************************/
void lcd_hazirla(void)
{       
 
        delay(0x0000FFFF);
        delay(0x0000FFFF);
        GPIO_InitTypeDef GPIO_InitStructure;     
        delay(0x0000FFFF);

        RCC_DeInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
lcd_komut(zorunlu);
          delay(0x0000FFFF);
lcd_komut(ikisatir4bit5x8);
          delay(0x0000FFFF);
lcd_komut(imlecsagakay);
          delay(0x0000FFFF);
lcd_komut(dayansonig);
          delay(0x0000FFFF);
lcd_komut(dayansonyok);
          delay(0x0000FFFF);
lcd_komut(temizle);
          delay(0x0000FFFF);
lcd_gecikme();
       
lcd_temizle();

        for(sayac=0;sayac<=7;sayac++){  // Türkçe karakterler tanitiliyor
lcd_komut(adres);
for(s=0;s<=7;s++){
lcd_karakter_yaz(karakter_[sayac][s]);
}  
adres=adres+8;
}
        lcd_temizle();
         delay(0x0000FFFF);
         
}
/********************************************************
Fonksiyon : lcd_temizle
Amac   : LCD ekran tamamen silinir
Kullanim  : lcd_temizle();
*********************************************************/
void lcd_temizle(void)
{
lcd_komut(temizle);
lcd_gecikme();
}
/********************************************************
Fonksiyon : lcd_gecikme
Amac   : LCD Çalışması için gerekli gecikmedir
Kullanim  : lcd_gecikme();
*********************************************************/
void lcd_gecikme(void)
{
unsigned long delay=0x00000872;
while(delay--);
}



lcd.h :


/******************************************************************
*Dosya :lcd.h
*Amaç :2*16 LCD için gerekli tanımlamaları yapar
*Kullanım    :Proje dosyasında ilgili yere eklenir.
*                lcd.c içinden çağırılır
*Yazar :Ayhan KORKMAZ - AyhanKorkmaz.Net
*İletişim      :info@ayhankorkmaz.net
*Versiyon :V1.0
*Pin bağlantısı :
*                  ----------------
*                  ||||||||||||||||
*                               
*PC.0  –> RS
*PC.1  –> E
*PC.4  –> DB4
*PC.5  –> DB5
*PC.6  –> DB6
*PC.7  –> DB7
*RW    ->Toprak
*******************************************************************/

#ifndef __LCD_H
#define __LCD_H

#define temizle 0x01
#define zorunlu 0x02
//------İMLEÇ AYARLARI------//
#define dkyansonyok 0x08    //dk = disp kapalı
#define dkyanson 0x09
#define dkyansonyokig 0x0A //ig = imleç göster
#define dkyansonig 0x0B
#define dayansonyok 0x0C //da = display açık
#define dayanson 0x0D
#define dayansonyokig 0x0E
#define dayansonig 0x0F
#define solakay 0x10 //imleç sola kayar
#define sagakay 0x14 //imleç sağa kayar
#define dispsolakay 0x18 //display sola kayar
#define dispsagakay 0x1C //display sağa kayar

//-------İletişim Ayarları------//

#define birsatir4bit5x8 0x3C //LCD 1 satır,5x8 matris 4bit iletişim
#define birsatir4bit5x10 0x24
#define ikisatir4bit5x8 0x28
#define ikisatir4bit5x10 0x2C
#define birsatir8bit5x8 0x30
#define birsatir8bit5x10 0x34
#define ikisatir8bit5x8 0x38
#define ikisatir8bit5x10 0x20

//-------GİRİŞ AYARLARI--------//

#define imlecsolakay 0x04 //Her yazılan karakterden sonra imleç sola kayar
#define imlecdispsolakay 0x05 //Her yazılan karakterden sonra imleç ve display sola kayar
#define imlecsagakay 0x06 //Her yazılan karakterden sonra imleç saga kayar
#define imlecdispsagakay 0x07 //Her yazılan karakterden sonra imleç ve display sola kayar
extern void delay(unsigned long delay);
extern void lcd_komut(char komut);
extern void lcd_karakter_yaz(char veri);
extern void lcd_yazi_yaz(char *veri);
extern void lcd_git_xy(unsigned char satir,unsigned char sutun);
extern void lcd_hazirla(void);
extern void lcd_temizle(void);
extern void lcd_gecikme(void);
#endif



Çalışmasını da gösteren bir video çektim. En azından kullanmak isteyenler için örnek olur



http://youtu.be/bYycMRQmGKc (http://youtu.be/bYycMRQmGKc)




Proje dosyaların ve örnek proje için:

STM32 2x16 LCD  (http://www.ayhankorkmaz.net/stm32f1xx-ile-2x16-lcd-kutuphanesi-olusturalim/)

Başlık: Ynt: STM32 - 2x16 LCD Kullanımı
Gönderen: Recep METE - 19 Ekim 2014, 09:31:25
Teşekkürler arkadaşım.Çok faydalı bir paylaşım olmuş.Devamını merakla bekliyoruz.STM32 ile bazı basit programlarıda     paylaşırmısınız.Yeni öğrenmeye başlıyorumda.
Başlık: Ynt: STM32 - 2x16 LCD Kullanımı
Gönderen: ayhan_eee - 19 Ekim 2014, 17:15:19
Teşekkürler yorum için. Yeni projeler de eklemeye devam edicem.
Başlık: Ynt: STM32 - 2x16 LCD Kullanımı
Gönderen: sinus - 19 Ekim 2014, 17:47:50
merhaba.

bu kütüphane ile ekrana değişken yazdırabilir miyiz?