STM32 - 2x16 LCD Kullanımı

Başlatan ayhan_eee, 19 Ekim 2014, 01:19:13

ayhan_eee

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




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

STM32 2x16 LCD


Recep METE

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.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

ayhan_eee

Teşekkürler yorum için. Yeni projeler de eklemeye devam edicem.

sinus

merhaba.

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