//LCD 2x16 Driver func #include "stm32f3_discovery.h" #include "lcd2x16.h" //moja func za brzu inicijalizaciju pina void GPIO_Init_Mode(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef mode) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = mode; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOx, &GPIO_InitStructure); } void LCD_delay_1us (void) { volatile uint32_t x = LCD_DELAY_BASE; while (x--) {} } void LCD_delay_4us (void) { if (LCD_USES_BUSY_FLAG) { LCD_wait_busy_flag(); } else { volatile uint32_t x = LCD_DELAY_BASE * 4; while (x--) {} } } void LCD_delay_200us (void) { volatile uint32_t x = LCD_DELAY_BASE * 200; while (x--) {} } void LCD_delay_5ms (void) { if (LCD_USES_BUSY_FLAG) { LCD_wait_busy_flag(); } else { volatile uint32_t x = LCD_DELAY_BASE * 5000; while (x--) {} } } void LCD_delay_40ms (void) { volatile uint32_t x = LCD_DELAY_BASE * 40000; while (x--) {} } void LCD_wait_busy_flag (void) { //postavi R/W na 1 GPIO_SetBits(LCD_RW); //postavi da D7 bude ulaz GPIO_Init_Mode(LCD_D7, GPIO_Mode_IN); //cekaj dok linija D7 ne bude 0 while (GPIO_ReadInputDataBit(LCD_D7) == 0) {} //vrati da D7 bude izlaz GPIO_Init_Mode(LCD_D7, GPIO_Mode_OUT); //postavi R/W na 0 GPIO_ResetBits(LCD_RW); } //inicijalizuj pinove za LCD kao izlazi svi void LCD_Init_pins (void) { /* GPIOD Periph clock enable */ if (LCD_PORT_USE_A)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); if (LCD_PORT_USE_B)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); if (LCD_PORT_USE_C)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); if (LCD_PORT_USE_D)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE); if (LCD_PORT_USE_E)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE); if (LCD_PORT_USE_F)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE); /* postavi kao izlaze */ GPIO_Init_Mode(LCD_D4, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_D5, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_D6, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_D7, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_E, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_RW, GPIO_Mode_OUT); GPIO_Init_Mode(LCD_RS, GPIO_Mode_OUT); //upisi sve nule GPIO_ResetBits(LCD_D7); GPIO_ResetBits(LCD_D6); GPIO_ResetBits(LCD_D5); GPIO_ResetBits(LCD_D4); GPIO_ResetBits(LCD_RW); GPIO_ResetBits(LCD_E); GPIO_ResetBits(LCD_RS); } //posalji pola bajta tj 4 bita void LCD_send_nibble( unsigned char n ) { (n & 1) ? GPIO_SetBits(LCD_D4) : GPIO_ResetBits(LCD_D4); (n & 2) ? GPIO_SetBits(LCD_D5) : GPIO_ResetBits(LCD_D5); (n & 4) ? GPIO_SetBits(LCD_D6) : GPIO_ResetBits(LCD_D6); (n & 8) ? GPIO_SetBits(LCD_D7) : GPIO_ResetBits(LCD_D7); //make strobe GPIO_SetBits(LCD_E); LCD_delay_1us(); // 1us GPIO_ResetBits(LCD_E); } //posalji string (niz karaktera) void LCD_send_string (volatile char *s) { while(*s){ LCD_send_byte (1, *s); *s++; } } //posalji jedan bajt, adr=0=cmd, adr=1=data void LCD_send_byte( unsigned char address, unsigned char n ) { GPIO_ResetBits(LCD_RS); //0 LCD_delay_4us(); address ? GPIO_SetBits(LCD_RS) : GPIO_ResetBits(LCD_RS); GPIO_ResetBits(LCD_E); //0 LCD_send_nibble(n >> 4); LCD_send_nibble(n & 0xf); LCD_delay_200us(); } //postavi kurzor na poziciju void LCD_goto_xy () { } //postavi kurzor na pocetnu nultu poziciju void LCD_goto_home (void) { LCD_send_byte(0, 3); LCD_delay_5ms(); } //postavi kurzor na pocetnu nultu poziciju, alijas funkcija void LCD_goto_home_line1 (void) { LCD_goto_home(); } //postavi kurzor na pocetak druge linije void LCD_goto_home_line2 (void) { LCD_goto_home_line1(); LCD_cursor_right(LCD_DRAM_WIDTH); } //ocisti kompletan LCD buffer i postavi cursor na home void LCD_clear_all (void) { LCD_send_byte(0, 1); LCD_delay_5ms(); } //kontrola prikazivanja kurzora i bliking void LCD_cursor_control (int cursor_on_off, int blinking_on_off) { if (cursor_on_off && blinking_on_off) {LCD_send_byte(0, 15);} if (!cursor_on_off && blinking_on_off) {LCD_send_byte(0, 13);} if (cursor_on_off && !blinking_on_off) {LCD_send_byte(0, 14);} if (!cursor_on_off && !blinking_on_off) {LCD_send_byte(0, 12);} LCD_delay_200us(); } //pomeri kurzor levo X pozicija void LCD_cursor_left(int no) { while (no--) { LCD_send_byte(0, 16); } } //pomeri kurzor desno X pozicija void LCD_cursor_right(int no) { while (no--) { LCD_send_byte(0, 20); } } //inicijalizuj display za 4bitnu komunikaciju void LCD_Display_init () { //ovo je veliki delay zbog power on LCD_delay_40ms(); LCD_send_nibble(3); LCD_delay_40ms(); LCD_send_nibble(3); LCD_delay_200us(); LCD_send_nibble(3); LCD_delay_200us(); LCD_send_nibble(2); LCD_delay_5ms(); LCD_send_nibble(2); LCD_send_nibble(8); //4bits 2lines LCD_delay_5ms(); LCD_send_nibble(0); LCD_send_nibble(8); //no shift, hide cursor LCD_delay_5ms(); LCD_send_nibble(0); LCD_send_nibble(1); //clear LCD_delay_5ms(); LCD_send_nibble(0); LCD_send_nibble(6); //left to right LCD_delay_5ms(); LCD_send_nibble(0); LCD_send_nibble(0xC); //turn on LCD_delay_5ms(); LCD_delay_40ms(); }