Stm32f4 discovery 2x16 lcd (paralel karakter) yardım

Başlatan Kaanx, 27 Şubat 2013, 02:36:50

Kaanx

Selam aleykum.msp430 ile yaptıgım 4 bit paralel karakter gönderme kodunu stm32f4 içinde yapmaya calıstım fakat basarılı olamadım kodlar asagıda
paralel_lcd.h
/*
 * paralel_lcd.h
 *
 *  Created on: Feb 27, 2013
 *      Author: Kaan
 */

#ifndef PARALEL_LCD_H_
#define PARALEL_LCD_H_

#define delay_us(x)     __delay_cycles(x)
#define delay_ms(x)     __delay_cycles((x * 1000L))

#define LCD_DATA        GPIOD->ODR // port cıkıs
#define LCD_CONTROL     GPIOB->ODR  // rs ve enable kontrol b portundan yapılıcak
#define EN_ACKAPA()     LCD_EN(1),LCD_EN(0)

#define LCD_RS(x)       ( (x) ? (LCD_CONTROL |= 0X00000100) : (LCD_CONTROL &= ~0X00000100) )
#define LCD_EN(x)       ( (x) ? (LCD_CONTROL |= 0X00000400) : (LCD_CONTROL &= ~0X00000400) )

void lcd_komut(unsigned char); // LCD ye komut göndermeye yarar
void lcd_temizle(void);        // LCD ekranı temizler
void lcd_puts(const char*);    // LCD ye string ifade yazar
void lcd_goto(char,char);      // LCD de satır ve stün olarak istenilen yere gider
void lcd_init(void);           // LCD başlangıç ayarları yapılır
void lcd_putch(char);          // LCD ye tek karakter yazmak için kullanılır.
#endif /* PARALEL_LCD_H_ */


paralel_lcd.c
/*
 * paralel_lcd.c
 *
 *  Created on: Feb 27, 2013
 *      Author: Kaan
 */
#include "stm32f4xx.h"
#include "paralel_lcd.h"

void lcd_putch(char c)
{
  LCD_RS(1);

  delay_us(200);

  LCD_DATA =  (c & 0xF0);
  EN_ACKAPA();
  LCD_DATA = ((c & 0x0F)<<4);
  EN_ACKAPA();
}
void lcd_komut(unsigned char c)
{
  LCD_RS(0);

  delay_us(200);

  LCD_DATA =  (c & 0xF0);
  EN_ACKAPA();
  LCD_DATA = ((c & 0x0F)<<4);
  EN_ACKAPA();
}
void lcd_temizle(void)
{
  lcd_komut(0x01);
  delay_ms(2);
}

void lcd_puts(const char* s)
{
  while(*s)
    lcd_putch(*s++);
}

void lcd_goto(char x, char y)
{
  if(x==1)
    lcd_komut(0x80+((y-1)%16));
  else
    lcd_komut(0xC0+((y-1)%16));
}
void lcd_init()
{RCC->AHB1ENR  |= 0x0000001F;           // GPIO A,B,C,D.E clock'u aktif edelim


  GPIOD->MODER = 0x00000055;     //  0..4 arasıda çıkış
  GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.


  GPIOB->OSPEEDR= 0xFFFFFFFF;	  //  GPIOB 100mhz cıkıs
  GPIOB->OSPEEDR= 0xFFFFFFFF;      // GPIOD 100 MHZ CIKIS

  GPIOD->ODR= 0x00000000;		  //	 Temizlik

  LCD_RS(0);
  LCD_EN(0);

  lcd_komut(0x28);  // 4 Bit , Çift Satır LCD
  lcd_komut(0x0C);  // İmleç Gizleniyor
  lcd_komut(0x06);  // Sağa doğru yazma aktif
  lcd_komut(0x80);  // LCD Birinci Satır Konumunda
  lcd_komut(0x28);  // 4 Bit , Çift Satır LCD
  lcd_temizle();    // Ekran Temizleniyor
}


main.c (atollicte yazdıgım ıcın system ınıt dosyalarını system_stm32f4xx.c de tanımlıyorum o yuzden burada // olarak iptal EDİYRUM)
#include "stm32f4xx.h"
#include "paralel_lcd.h"

void SystemInit()
  {
     unsigned int i;

       for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma  rutini
      RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
      RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
      while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
      RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
      RCC->CR |= 0x01000000;            // PLL calismaya baslasin
      while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
      FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim
      RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
      while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle

      RCC->AHB1ENR  |= 0x0000001F;           // GPIO A,B,C,D.E clock'u aktif edelim
  	RCC->APB1ENR  |= 0x00000002;           // Timer3 CLK'u aktif edelim (84 Mhz)
      RCC->APB2ENR  |= 0x00000101; 			 //Timer1 CLK etkin (168MHz)

      GPIOD->MODER   = 0x55000055;         // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR = 0xFFFFFFFF;         // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

  	//GPIOE->MODER   = 0x86668000;         // E7,8,10,12,15 AF, 9,11,13 çıkış
  	//GPIOE->OSPEEDR = 0xFFFFFFFF;          // E portu hızı 100 MHz
  	//GPIOE->AFR[1]  = 0x00010101;		  // E8,10,12 AF1 seçildi

      GPIOB->MODER   = 0x00000500;		  //4 ve 5 cıkıs 
      GPIOB->OSPEEDR = 0xFFFFFFFF;		 // C portu   en yüksek hızda
  }

int main()
{
	lcd_init();
	lcd_temizle();
	while(1)
	{
		lcd_goto(1,1);

		lcd_puts("kaan");
	}
}


yardımlarınız için şimdiden tesekkurler iyi çalısmalar.

Kaanx

Arkadaşlar konuyu hallettim cok sukur isteyen bloguma girip bakabilir ama bu kod neden calısmadı hala merak edıyorum ve yorumlarınızı beklıyorum.

http://kaankandemir.wordpress.com/