/* * LCD interface example * Uses routines from delay.c * This code will interface to a standard LCD controller * like the Hitachi HD44780. It uses it in 4 bit mode, with * the hardware connected as follows (the standard 14 pin * LCD connector is used): * * PORTA bits 0-3 are connected to the LCD data bits 4-7 (high nibble) * PORTA bit 6 is connected to the LCD RS input (register select) * PORTA bit 7 is connected to the LCD EN bit (enable) * * To use these routines, set up the port I/O (TRISA, TRISB) then * call lcd_init(), then other routines as required. * */ //modefy list #include #include "lcd.h" #include "delay.h" static bit LCD_RS @ ((unsigned)&PORTA*8+6); // Register select (RA6) static bit LCD_EN @ ((unsigned)&PORTA*8+7); // Enable (RA7) #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { PORTA = (PORTA & 0xF0) | ( (c >>4 ) & 0x0F ) ; //Hi SIDE DATA LCD_STROBE; PORTA = (PORTA & 0xF0) | (c & 0x0F); //low SIDE DATA LCD_STROBE; DelayUs(40); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); DelayMs(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters PORTA = (PORTA & 0xF0) | ( (c >>4 ) & 0x0F ) ; //Hi SIDE DATA LCD_STROBE; PORTA = (PORTA & 0xF0) | (c & 0x0F); //Low SIDE DATA LCD_STROBE; DelayUs(40); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init(void) { LCD_RS = 0; // write control bytes DelayMs(15); // power on delay PORTA = 0x03; // attention! LCD_STROBE; DelayMs(5); LCD_STROBE; DelayUs(100); LCD_STROBE; DelayMs(5); PORTA = 0x02 ; // set 4 bit mode LCD_STROBE; DelayUs(100); //2009/1/12 fix lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font lcd_write(0x08); // display off lcd_write(0x0F); // display on, blink curson on lcd_write(0x06); // entry mode }