STM32 C++ LCD Örneği

Başlatan Elektroemre, 23 Aralık 2013, 12:07:53

Elektroemre

Merhaba arkadaşlar,


Düzgün yazılmış bir lcd driverı değildir.
Maksat C++ ile Keil'de bir proje derlemiş olmak.
"C++ ile yazdım abi çok havalı oldu"  :)

Derlemeye hazır keil projemiz;
http://www.4shared.com/rar/8J4O2-qU/LCD.html


Main.cpp kısaca;
BasicLCD Lcd(GPIOB,11,   // LCD EN
             GPIOB,10,   // LCD RS
             GPIOB,12,13,14,15); // LCD DATA


int main(void)
{
	GPIO_Configuration();
	
	Lcd.Init();
	Lcd.Write(" STM32 ile C++  ");
	Lcd.Write(2,2,"Havamiz olsun!  ");
	
	for(;;);

}


Basic Lcd Class'ımız;
class BasicLCD
{

	GPIO_TypeDef* EnPort;
	uint16_t EnPin;

	GPIO_TypeDef* RsPort;
	uint16_t RsPin;
	
	GPIO_TypeDef* DtPort;
	uint16_t DtPins[4];
	
	
	
public:	
	BasicLCD(GPIO_TypeDef* enPort,uint16_t enPin,
					 GPIO_TypeDef* rsPort,uint16_t rsPin,
					 GPIO_TypeDef* dtPort,uint16_t dtPin0,uint16_t dtPin1,uint16_t dtPin2,uint16_t dtPin3);
  void Init(void);
  void Write(const char * s);
  void Write(uint8_t x, uint8_t y,const char * s);
  void Clear(void);
  void GotoXY(uint8_t x, uint8_t y);
	 
private:
  void WrData(uint8_t c);
  void WrCmd(uint8_t c);
  void WrByte(uint8_t c);
  void DelayMs(uint16_t dly);
  void Busy(void);
	
	
};





M_B

@Elektroemre hocam;
konuyu yeniden hortlatmış oldum.
hocam kodlar elinizde duruyor mu ?  incelemek istiyorumda.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Emre_Tuncay_

Daha önceden basit bir LCD uygulaması yazmıştım.Kullanmak üzere genel bir fonksiyon yazmaya çalışmıştım ama birden fazla fonksiyon olacak şekilde oldu.
////////////////////////////////////////////////////
/////////////////EMRE TUNÇAY////////////////////////
////////////////LCD UYGULAMASI//////////////////////
////////////////////////////////////////////////////
#include "stm32f10x.h" 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define sagakaydir 0x06
#define AYAR1 60
#define AYAR2 14
#define AYAR3 1
#define AYAR4 6
int i=0,j=0;
int delay(uint32_t time)
{
	while(time)
	time--;
}
int GPIO_AYAR()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | 
	                                GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | 
	                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
}
int lcd_komut_yukle(uint8_t komut)
{
	GPIOA->ODR = komut;
	GPIO_ResetBits(GPIOA , GPIO_Pin_10 | GPIO_Pin_9);
	GPIO_SetBits(GPIOA , GPIO_Pin_8);
	delay(1000000);
	GPIO_ResetBits(GPIOA , GPIO_Pin_8);
}
int lcd_clear(void)
{
	lcd_komut_yukle(1);
}
void lcd_yaz(char veri)
{
	GPIOA->ODR = veri;
	GPIO_SetBits(GPIOA , GPIO_Pin_10);
	delay(1000);
	GPIO_ResetBits(GPIOA , GPIO_Pin_9);
	delay(1000);
	GPIO_SetBits(GPIOA , GPIO_Pin_8);
	delay(1000);
	GPIO_ResetBits(GPIOA , GPIO_Pin_8);
}
void lcd_kelime_yazdir(char  kelime[])
{	
	for (j = strlen(kelime); j>0; j--)
	{
		lcd_yaz(kelime[strlen(kelime)-j]);
		lcd_komut_yukle(sagakaydir);
	}
}
void lcd_degisken_yazdir(int deger)
{
	char str[100];
	sprintf(str, "%d", deger);
	lcd_kelime_yazdir(str);
}
int main(void)
{
 int i=0;
 GPIO_AYAR();
 lcd_komut_yukle(AYAR1);
 delay(1000);
 lcd_komut_yukle(AYAR2);
 delay(1000);
 lcd_komut_yukle(AYAR3);
 delay(1000);
 lcd_komut_yukle(AYAR4);
 delay(1000);
 //lcd_kelime_yazdir("*EMRE TUNCAY*");
 //sprintf(str, "%d", i);
 //lcd_kelime_yazdir(str);
 lcd_degisken_yazdir(i);
 lcd_degisken_yazdir(521);
 
}


Kodlara Yüklediğim ayarlar var yanlarına açıklama yazmamışım.https://www.sparkfun.com/datasheets/LCD/ADM1602K-NSW-FBS-3.3v.pdf
Bu linken yüklenmesi gereken ayarlara bakarsın.Anlamadığın yer olursa açıklamaya çalışırım.

Emre_Tuncay_

Bu arada A portunun 0 dan 7 ye kadar olan çıkışları LCD'nin D0 dan D7 ye kadar olan girişlerine sırasıyla bağlanacak.LCD nin RS,RW,E bacakları  ise şu şekilde.
RS=GPIOA_10
RW=GPIOA_9
Enable=GPIOA_8

Elektroemre

Alıntı yapılan: M_B - 12 Temmuz 2017, 00:17:03
@Elektroemre hocam;
konuyu yeniden hortlatmış oldum.
hocam kodlar elinizde duruyor mu ?  incelemek istiyorumda.

Hocam senin için kritik olan C++ örneği olmasımı? LCD driver olmasımı?

M_B

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

OptimusPrime

@M_B

neden c++ istiyorsun. maksat ogrenmek mi yoksa baska bir dusuncenmi var?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

M_B

Alıntı yapılan: OptimusPrime - 14 Temmuz 2017, 21:31:53
@M_B

neden c++ istiyorsun. maksat ogrenmek mi yoksa baska bir dusuncenmi var?
Öğrenmek için.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yamak

Hocam mümkünse herkes büyük projelerde c++ kullansın. Rahatlığını göreceksiniz.