// Dateiname: picdem2_lcd.c // Inhalt: Funktionen zur Steuerung des LCD auf PICDEM2 Demoplatine // Prozessor 16F877, Display HD44780U-kompatibel // Verfasst fuer CC5X Compiler, // Autor: G. Juengling, HTL Wien 3 Rennweg, Mai 2006 #ifndef _PICDEM2_LCD #define _PICDEM2_LCD extern void lcd_delay(unsigned long); extern void lcd_init(); extern void lcd_init_pins(); extern void lcd_init_disp(); extern void lcd_cmd(unsigned char ); extern void lcd_cmd4(unsigned char ); extern void lcd_dat(unsigned char ); extern void lcd_zeile(unsigned char zeile); extern void lcd_clear(); extern void lcd_off(); extern void lcd_on (); extern void lcd_xy (unsigned char, unsigned char); unsigned char lcd_cursor; //Hilfsvariable fuer Display-Befehl // Bitfolge 0b00001DCB (on/off Con/Coff Cblock/Cline) bit lcd_RS @ PORTD.4; bit lcd_RW @ PORTD.5; bit lcd_EN @ PORTD.6; // Setzt den Cursor an die Position x,y (Spalte, Zeile) // Zeile 0,1 Spalte 0,15 void lcd_xy(unsigned char x, unsigned char y) { char xytemp = 0b10000000; if (y == 1) { xytemp = xytemp | 0x40; } if ((x <=15) && (x>0)){ xytemp = xytemp + x; } nop(); lcd_cmd4 (xytemp); } void lcd_string(const char *text) { int si=0; while (text[si]!=0) { nop(); lcd_dat(text[si]); si++; } } // Display einschalten void lcd_on() { lcd_cursor |= 0b00001100; lcd_cmd4(lcd_cursor); } // Display ausschalten void lcd_off() { lcd_cursor &= 0b1111011; lcd_cmd4(lcd_cursor); } // Cursor einschalten // Display wird auch eingeschaltet void lcd_cursor_on() { lcd_cursor |= 0b00000110; lcd_cmd4(lcd_cursor); } // Cursor ausschalten // Display ein, schaltet auch Blinken aus void lcd_cursor_off() { lcd_cursor &= 0b11111100; lcd_cmd4(lcd_cursor); } // Cursor blinkt als Block // Display wird eingeschaltet void lcd_cursor_blink() { lcd_cursor |= 0b00000101; lcd_cmd4(lcd_cursor); } // Cursor als Linie // Display wird eingeschaltet void lcd_cursor_line() { lcd_cursor |= 0b00000110; lcd_cursor &= 0b11111110; lcd_cmd4(lcd_cursor); } void lcd_clear() { lcd_cmd4(0b00000001); } // Initialisierung der Pins fuer das LCD // RD0 .. RD3 --------> D4 .. D7 (4 Bit Mode) // RA1, RA2, RA3 ------> E, RW, RS void lcd_init_pins() { TRISD = 0b00000000; } // Initialisierung des LCD im 4 Bit Mode // RA1, RA2, RA3 ------> E, RW, RS void lcd_init_disp() { char temp; lcd_cursor = 0b00001100; //Variable fuer Cursorzustand init. lcd_delay(50); // 30 ms warten lcd_cmd(0b00110000); // 8-Bit-Interface lcd_delay(10); // 5 ms warten lcd_cmd(0b00110000); // 8-Bit-Interface lcd_delay(1); // 1 ms warten lcd_cmd(0b00110000); // 8-Bit-Interface lcd_cmd(0b00100000); // 4-Bit-Interface lcd_cmd4(0b00101000); // 2 Zeilen, 5x8 Matrix lcd_cmd4(0b00001000); // Display aus lcd_cmd4(0b00000001); // Display clear lcd_cmd4(0b00000010); // no shift, cursor rechts lcd_cmd4(0b00001100); // Display ein, ohne Cursor return; } // 4 Bit Steuerzeichen an LCD schicken void lcd_cmd(unsigned char cmd) { lcd_RS = 0; lcd_RW = 0; lcd_EN = 1; cmd = swap(cmd); cmd &= 0x0F; PORTD |= cmd; lcd_delay(1); lcd_EN = 0; return; } // 8 Bit Steuerzeichen im 4-Bit Mode an LCD schicken // Schickt 2 x 4 Bit void lcd_cmd4(unsigned char cmd8) { lcd_cmd (cmd8); // zuerst hoeherwertige 4 Bit lcd_delay(2); lcd_cmd (swap(cmd8)); // dann niederwertige 4 Bit lcd_delay(2); return; } // 4 Bit Daten an LCD schreiben void lcd_datnibble(unsigned char daten) { char ret; lcd_RS = 1; lcd_RW = 0; lcd_EN = 1; daten = swap(daten); daten &= 0x0F; PORTD |= daten; nop(); lcd_EN = 0; lcd_delay(1); return; } // 8 Bit Daten im 4-Bit Mode an LCD schicken // Schickt 2 x 4 Bit void lcd_dat(unsigned char daten8) { lcd_datnibble (daten8); lcd_datnibble (swap(daten8)); return; } // Setzt den Cursor an den Anfang der entspechenden Zeil // Zeile 0 oder Zeile 1 (Zeile 1 = Spalte 40) void lcd_zeile(unsigned char zeile) { char temp = 0b10000000; if (zeile == 1) temp = 0b10000000 | 0x40; nop(); lcd_cmd4 (temp); } // Warte X Millisekunden // Quelle: CC5X Manual void lcd_delay(unsigned long millisec) /* delays a multiple of 1 millisecond at 4 MHz */ { unsigned char i; do { i=255; do { i--; } while (i>0); } while (-- millisec > 0); return; } #endif