/////////////////////////////////////////////////////////////////////////// //// LCD.C //// //// Drajver za lcd modula //// //// //// //// lcd_init() Mora se pozvati pre koriscenja lcd - a //// //// //// //// lcd_putc(c) Ispisuje karakter c na sledece slobodno mesto //// //// Specijalni znaci: //// //// \f Obrisi displej //// //// \n Predji u drugu liniju //// //// \b Vrati se nazad za jedno mesto //// //// //// //// lcd_gotoxy(x,y) Postavi se na karakter sa kordinatama x i y //// //// (gore levo je 1,1) //// //// //// /////////////////////////////////////////////////////////////////////////// // Povezivanje na mikrokontroler: // D0 D4 // D1 D5 // D2 D6 // D3 D7 // D4 RS // D5 E // D6 NC // D7 NC // // Ukoliko je LCD povezan na port D mikrokontrolera maskirati narednu linuju koda // u suprotnoom ce LCD biti drajvovan sa porta B #define use_portb_lcd TRUE struct lcd_pin_map { int data : 4; // B0-B3 LCD.DATA BOOLEAN rs; // B4 - RS BOOLEAN enable; // B5 - EN. BOOLEAN unused; // B6 unused BOOLEAN unused1; // B7 unused } lcd; #if defined use_portb_lcd //#locate lcd = getenv("sfr:PORTB") #ifdef __pch__ #locate lcd = 0xf81 #else #locate lcd = 6 #endif #define set_tris_lcd(x) set_tris_b(x) #else //#locate lcd = getenv("sfr:PORTD") #ifdef __pch__ #locate lcd = 0xf83 #else #locate lcd = 8 #endif #define set_tris_lcd(x) set_tris_d(x) #endif #ifndef lcd_type #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #endif #define lcd_line_two 0x40 // LCD RAM address for the second line BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; void lcd_send_nibble( BYTE n ) { lcd.data = n; delay_cycles(1); lcd.enable = 1; delay_us(2); lcd.enable = 0; } void lcd_send_byte( BYTE address, BYTE n ) { set_tris_lcd(0); lcd.rs = address; delay_cycles(1); lcd.enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); set_tris_lcd(0xf); } void lcd_init() { BYTE i; set_tris_lcd(0); lcd.rs = 0; lcd.enable = 0; delay_ms(15); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(5); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } void lcd_gotoxy( BYTE x, BYTE y) { BYTE address; if(y!=1) address=lcd_line_two; else address=0; address+=x-1; lcd_send_byte(0,0x80|address); } void lcd_putc( char c) { switch (c) { case '\f' : lcd_send_byte(0,1); delay_ms(2); break; case '\n' : lcd_gotoxy(1,2); break; case '\b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } }