5 Mayıs 2014 Pazartesi

Stm32f0 Discovery Board 2x16 LCD driver

Merhaba, ilk yayınımda sizlere CoCoox ide'de STM32F0 Discovery Board için kullanabileceğiniz 2x16 LCD kaynak kodunu paylaşıyorum .Faydalı olması dileğiyle...




Main Dosya İçeriği:


#include "stm32f0xx.h"
#include "hd44780.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"

;

int main(void)
{
lcd_init();
lcd_clear();
lcd_set_xy(3,0);
lcd_out("ELEKTRONIK");
lcd_set_xy(4,1);
lcd_out("KILAVUZU");

    while(1)
    {

    }

}




LCD.H Dosyası içeriği:

#include "stm32f0xx.h"

/////Kulanıcı port tanımları /////
#define LCD_PORT GPIOB
#define LCD_CD GPIO_Pin_7
#define LCD_RW   GPIO_Pin_9
#define LCD_EN   GPIO_Pin_10
#define LCD_DB4   GPIO_Pin_14
#define LCD_DB5   GPIO_Pin_13
#define LCD_DB6   GPIO_Pin_11
#define LCD_DB7   GPIO_Pin_12
#define LCD_PORT_AC RCC_AHBPeriph_GPIOB
///////////////////////////////////

typedef enum {
COMMAND = 0,
DATA = !COMMAND
} dat_or_comm;

typedef enum {
LCD_DISABLE = 0,
LCD_ENABLE = !LCD_DISABLE
} lcd_state;

typedef enum {
CURSOR_DISABLE = 0,
CURSOR_ENABLE = !CURSOR_DISABLE
} cursor_state;

typedef enum {
NO_BLINK = 0,
BLINK = !NO_BLINK
} cursor_mode;




void lcd_init();
void lcd_send(unsigned char byte, dat_or_comm dc);
void lcd_set_state(lcd_state state, cursor_state cur_state, cursor_mode cur_mode);
void lcd_clear(void);
void lcd_out(char * txt);
void lcd_set_xy(uint8_t x, uint8_t y);
void lcd_set_user_char(unsigned char char_num, unsigned char * char_data);
void lcd_delay(void);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

LCD.C Dosya içeriği:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "hd44780.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx.h"

void delay(i)
{

while(i--);
}

void lcd_delay(void) {
volatile uint32_t tmpvar;
for (tmpvar=4000;tmpvar!=0;tmpvar--);
}

void lcd_init() {
RCC_AHBPeriphClockCmd(LCD_PORT_AC, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = LCD_CD | LCD_RW | LCD_EN | LCD_DB6 | LCD_DB7 | LCD_DB5 | LCD_DB4;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &gpio);

delay(500);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_SetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_SetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_SetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_DB7);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_SetBits(LCD_PORT, LCD_DB6);
GPIO_SetBits(LCD_PORT, LCD_DB7);
GPIO_SetBits(LCD_PORT, LCD_DB5);
GPIO_SetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_SetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
GPIO_ResetBits(LCD_PORT, LCD_EN); // E V
GPIO_SetBits(LCD_PORT, LCD_CD);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_ResetBits(LCD_PORT, LCD_DB6);
GPIO_ResetBits(LCD_PORT, LCD_DB7);
GPIO_ResetBits(LCD_PORT, LCD_DB5);
GPIO_ResetBits(LCD_PORT, LCD_DB4);
GPIO_SetBits(LCD_PORT, LCD_EN); // E ^
delay(50000);
lcd_set_state(LCD_ENABLE,CURSOR_DISABLE,NO_BLINK);
lcd_clear();
lcd_send(0x06,COMMAND);
}

void lcd_set_user_char(uint8_t char_num, uint8_t * char_data) {
uint8_t i;
lcd_send(((1<<6) | (char_num * 8) ), COMMAND);
for (i=0;i<=7;i++) {
lcd_send(char_data[i],DATA);
}
lcd_send((1<<7), COMMAND);
}

void lcd_set_xy(uint8_t x, uint8_t y)  {

if (y==0) {
lcd_send( ((1<<7) | (x)),COMMAND);
} else {
lcd_send( ((3<<6) | (x)),COMMAND);
}


}


void lcd_out(char * txt) {
while(*txt) {
lcd_send(*txt,DATA);
txt++;
}
}

void lcd_clear(void) {
lcd_send(0x01,COMMAND);
}

void lcd_set_state(lcd_state state, cursor_state cur_state, cursor_mode cur_mode)  {
if (state==LCD_DISABLE)  {
lcd_send(0x08,COMMAND);
} else {
if (cur_state==CURSOR_DISABLE) {
if (cur_mode==NO_BLINK)  {
lcd_send(0x0C,COMMAND);
} else {
lcd_send(0x0D,COMMAND);
}
} else  {
if (cur_mode==NO_BLINK)  {
lcd_send(0x0E,COMMAND);
} else {
lcd_send(0x0F,COMMAND);
}
}
}
}



void lcd_send(uint8_t byte, dat_or_comm dc)  {

GPIO_ResetBits(LCD_PORT, LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4 | LCD_CD | LCD_EN);

if (dc) {
GPIO_SetBits(LCD_PORT, LCD_CD);
}

if (byte & 0x10) {
GPIO_SetBits(LCD_PORT, LCD_DB4);
}
if (byte & 0x20) {
GPIO_SetBits(LCD_PORT, LCD_DB5);
}
if (byte & 0x40) {
GPIO_SetBits(LCD_PORT, LCD_DB6);
}
if (byte & 0x80) {
GPIO_SetBits(LCD_PORT, LCD_DB7);
}

GPIO_SetBits(LCD_PORT, LCD_EN);
lcd_delay();
GPIO_ResetBits(LCD_PORT, LCD_EN);
lcd_delay();


GPIO_ResetBits(LCD_PORT, LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4);

if (byte & 0x01) {
GPIO_SetBits(LCD_PORT, LCD_DB4);
}
if (byte & 0x02) {
GPIO_SetBits(LCD_PORT, LCD_DB5);
}
if (byte & 0x04) {
GPIO_SetBits(LCD_PORT, LCD_DB6);
}
if (byte & 0x08) {
GPIO_SetBits(LCD_PORT, LCD_DB7);
}

GPIO_SetBits(LCD_PORT, LCD_EN);
lcd_delay();
GPIO_ResetBits(LCD_PORT, LCD_EN);
lcd_delay();


}

Hiç yorum yok:

Yorum Gönder