/*----------------------------------------------------------------------------- * File: dogm_lcd.c * Author: Dennis Kleine-Beck * 2x16 LCD DOGM * Compiler: ImageCraft ICCAVR 6.28 (or 7.03) * * Resonator frequency = 4 MHz * 04.05.06 : initial creation *---------------------------------------------------------------------------*/ #include "iom16v.h" #define gotoxy(x,y) gotoz((x)|((y)<<6)) #define LCD_E (1 << 5) #define LCD_RS (1 << 4) // RW is tied to GND -> always write #define lcd_set_e() (PORTD |= LCD_E) #define lcd_set_rs() (PORTD |= LCD_RS) #define lcd_clear_e() (PORTD &= ~LCD_E) #define lcd_clear_rs() (PORTD &= ~LCD_RS) // DATA : PORT C, 8 bit, 3,3V No Cursor, RW Pin connected to GND! // multi purpose delay - main loop = 6clocks void delay(int ticks) { while(ticks--); } // -------------- LCD --------------- // lcd strobe void lcd_pulse(void) { lcd_set_e(); delay(2); // approx. 5µs lcd_clear_e(); delay(2); } // medium delay (about 50µs) void lcd_wait(void) { delay(33); // DOG-M LCD needs 26µs (98ticks) except CLEAR (1,1ms) } // send byte to lcd void lcd_send(unsigned char data) { lcd_wait(); PORTC = data; lcd_pulse(); } // clear screen -- needs min. 15ms void clrscr(void) { lcd_clear_rs(); lcd_send(0x01); delay(10000); // wait for display to settle (~ 15ms) } // init display void initgraph(void) { // delay(20000); // µC takes typ. 65ms to startup lcd_clear_rs(); lcd_send(0x39); // 8bits, 2 rows delay(10000); // wait for display to settle (~ 15ms) lcd_send(0x14); // bias set - 2 row lcd delay(10000); // wait for display to settle (~ 15ms) lcd_send(0x55); // booster enable (3,3V), set contrast delay(10000); // wait for display to settle (~ 15ms) lcd_send(0x6D); // set amplification delay(30000); // wait for display to settle (~ 45ms) lcd_send(0x78); // contrast set (C3=1, C2=C1=C0=0) delay(10000); // wait for display to settle (~ 15ms) //lcd_send(0x0F); // display on, cursor blink lcd_send(0x0C); // display on, cursor off delay(10000); // wait for display to settle (~ 15ms) lcd_send(0x01); // clear display, cursor home delay(10000); // wait for display to settle (~ 15ms) lcd_send(0x06); // cursor auto increment delay(10000); // wait for display to settle (~ 15ms) } // goto lcd memory address void gotoz(unsigned char z) { lcd_clear_rs(); lcd_send(z | 0x80); } // output single character in a faster way void putchar(char c) { lcd_set_rs(); delay(33); // ~50µs - DOGM LCD needs 26µs except CLEAR (1,1ms) PORTC = c; lcd_set_e(); delay(2); // approx. 5µs lcd_clear_e(); } /* // output single character - original -> slower void putchar(char c) { lcd_set_rs(); lcd_send(c); } */ /* // output string - works OK, but needs more code void outtext(char* text) { unsigned char i; for(i = 0; text[i] && i < 16; i++) putchar(text[i]); } */ // Beispiel Text void startup_text (void) { unsigned char i; clrscr(); // Clear srcreen (LCD) gotoxy(3,0); // Jump to LCD's 1st row putchar ('H'); // Write chars to LCD putchar ('A'); putchar ('L'); putchar ('L'); putchar ('O'); putchar (' '); putchar ('A'); putchar ('V); putchar ('R'); for (i=0; i<=50; i++) delay(20000); // leaves message on screen for 51*30ms }