STM32F4_D.. ile 2x16 LCD sürme

Başlatan Larkin, 26 Ocak 2012, 22:53:56

Larkin

merhaba. aşağıdaki kodlarla PCM1602B'i LCD yi çalıştıramıyorum

main dosyası

#include "stm32f4xx.h"
#include "hd44780.h"

void SystemInit(void)
{
unsigned int i;

    for (i=0;i<0x00100000;i++);
    RCC->CFGR |= 0x00009400;
    RCC->CR |= 0x00010000;
    while (!(RCC->CR & 0x00020000));
    RCC->PLLCFGR = 0x07405408;
    RCC->CR |= 0x01000000;
    while(!(RCC->CR & 0x02000000));
    FLASH->ACR = 0x00000605;
    RCC->CFGR |= 0x00000002;
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A);
    RCC->AHB1ENR |= 0x0000001F;


	GPIOE->MODER = 0x00000555;
    GPIOE->OSPEEDR = 0x00000000;
}

int main(void)
{
	void SystemInit();
    int a = 0;
    
	while(a<100)
    {
    	delay(32000);
        a++;
    }

    InitializeLcm();
    delay(32000);
    ClearLcmScreen();
    delay(32000);
    Cursor(1,1);
    PrintStr("  STM32F407VGT  ");
    Cursor(2,1);
    delay(32000);
    PrintStr("Hello  World  !!");
	GPIOE->ODR=0xFFFFFFFF;

    while(1);
}

//hd44780.h

#include "stm32f4xx.h"

#define GPIO_E(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOE->ODR) << 5) + ((b) << 2)))

#define     LCM_OUT               GPIOE->ODR

#define     LCM_PIN_RS            GPIO_E(5)          // PE.5
#define     LCM_PIN_EN            GPIO_E(4)          // PE.4
#define     LCM_PIN_D7            GPIO_E(0)          // PE.0
#define     LCM_PIN_D6            GPIO_E(1)          // PE.1
#define     LCM_PIN_D5            GPIO_E(2)          // PE.2
#define     LCM_PIN_D4            GPIO_E(3)          // PE.3

#define     LCM_PIN_MASK  ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4))

#define     FALSE                 0
#define     TRUE                  1

void delay(int a)
{
    int i = 0;
    int f = 0;
    while(f<a)
    {
            while(i<60)
                {i++;}
        f++;
    }
}

void PulseLcm()
{
    LCM_OUT &= ~LCM_PIN_EN;
    delay(220);
    LCM_OUT |= LCM_PIN_EN;
    delay(220);
    LCM_OUT &= (~LCM_PIN_EN);
    delay(220);
}

void SendByte(char ByteToSend, int IsData)
{
    LCM_OUT &= (~LCM_PIN_MASK);
    LCM_OUT |= (ByteToSend & 0xF0);

    if (IsData == TRUE)
    {
        LCM_OUT |= LCM_PIN_RS;
    }
    else
    {
        LCM_OUT &= ~LCM_PIN_RS;
    }
    PulseLcm();
    LCM_OUT &= (~LCM_PIN_MASK);
    LCM_OUT |= ((ByteToSend & 0x0F) << 4);

    if (IsData == TRUE)
    {
        LCM_OUT |= LCM_PIN_RS;
    }
    else
    {
        LCM_OUT &= ~LCM_PIN_RS;
    }

    PulseLcm();
}

void Cursor(char Row, char Col)
{
    char address;
    if (Row == 0)
    {
        address = 0;
    }
    else
    {
        address = 0x40;
    }

    address |= Col;
    SendByte(0x80 | address, FALSE);
}


void ClearLcmScreen()
{
    SendByte(0x01, FALSE);
    SendByte(0x02, FALSE);
}

void InitializeLcm(void)
{
    LCM_OUT &= ~(LCM_PIN_MASK);

    delay(32000);
    delay(32000);
    delay(32000);

    LCM_OUT &= ~LCM_PIN_RS;
    LCM_OUT &= ~LCM_PIN_EN;
    LCM_OUT = 0x20;
    PulseLcm();
    SendByte(0x28, FALSE);
    SendByte(0x0E, FALSE);
    SendByte(0x06, FALSE);
}


void PrintStr(char *Text)
{
    char *c;

    c = Text;

    while ((c != 0) && (*c != 0))
    {
        SendByte(*c, TRUE);
        c++;
    }
}


sorun nerde bilen varmı. ekranda sadece 1. satır aktif ve hiçbir karakter yazmıyor. ayrıca daha önce pic ile aynı lcd yi hd44780.h dosyası sürebiliyordum

Larkin

Arkadaşlar sanırım bu kod biraz fazla karışık o yuzden kimse ilgilenmemiş...elinizde çalışan 2x16 için kod varsa çok makbule geçer kaç gündür cebelleşiyorum bununla ama sonuç yok. EMG81 avatarlı arkadaşın aşağıdaki linkte örnek bir LCD kodu var fakat o da problemli sadece ekrana ?_oO gibi karakterleri basıyor. kendisi kodları nasıl çalıştırdı da ekrana metin yazdırdı analayamadım...

https://www.picproje.org/index.php/topic,35794.msg264285.html#msg264285

Lütfen elinizde çalışan bir kod varsa  :( :( :(

gilamada

https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32F4DISCOVERY/DispForm.aspx?ID=62

senin program bu linktekinin aynısı galiba.
linkteki programı derledim bende de çalışmadı sonra baktım aşağıda not var

if code is not working, use more delay :)  demiş -- geçikme sürelerini artırdım çalıştı.