www.pudn.com > CAN_Ex1.rar > LCD_4bit.c
/******************************************************************************/ /* LCD.c: Functions for 2 line 16 character Text LCD, with 4-bit interface */ /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2006 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/ #include/* LPC23xx definitions */ /*********************** Hardware specific configuration **********************/ /*------------------------- Speed dependant settings -------------------------*/ /* If processor works on high frequency delay has to be increased, it can be increased by factor 2^N by this constant */ #define DELAY_2N 0 /*------------------------- Text LCD size definitions ------------------------*/ #define LineLen 16 /* Width (in characters) */ #define NumLines 2 /* Hight (in lines) */ /*-------------------- LCD interface hardware definitions --------------------*/ /* PINS: - DB4 = P1.24 - DB5 = P1.25 - DB6 = P1.26 - DB7 = P1.27 - E = P1.31 (for V1 P1.30) - RW = P1.29 - RS = P1.28 */ #define MCB2300_V1 /* First version of MCB2300 */ #define PIN_E 0x80000000 #define PIN_RW 0x20000000 #define PIN_RS 0x10000000 #define PINS_CTRL 0xB0000000 #define PINS_DATA 0x0F000000 #ifdef MCB2300_V1 #undef PIN_E #define PIN_E 0xC0000000 #undef PINS_CTRL #define PINS_CTRL 0xF0000000 #endif /* pin E setting to 0 or 1 */ #define LCD_E(x) ((x) ? (IOSET1 = PIN_E) : (IOCLR1 = PIN_E) ); /* pin RW setting to 0 or 1 */ #define LCD_RW(x) ((x) ? (IOSET1 = PIN_RW) : (IOCLR1 = PIN_RW)); /* pin RS setting to 0 or 1 */ #define LCD_RS(x) ((x) ? (IOSET1 = PIN_RS) : (IOCLR1 = PIN_RS)); /* Reading DATA pins */ #define LCD_DATA_IN ((IOPIN1 >> 24) & 0xF) /* Writing value to DATA pins */ #define LCD_DATA_OUT(x) IOCLR1 = PINS_DATA; IOSET1 = (x & 0xF) << 24; /* Setting all pins to output mode */ #define LCD_ALL_DIR_OUT IODIR1 |= PINS_CTRL | PINS_DATA; /* Setting DATA pins to input mode */ #define LCD_DATA_DIR_IN IODIR1 &= ~PINS_DATA; /* Setting DATA pins to output mode */ #define LCD_DATA_DIR_OUT IODIR1 |= PINS_DATA; /******************************************************************************/ /* 8 user defined characters to be loaded into CGRAM (used for bargraph) */ const unsigned char UserFont[8][8] = { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 }, { 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 }, { 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C }, { 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E }, { 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }; /************************ Global function definitions *************************/ /******************************************************************************* * Delay in while loop cycles * * Parameter: cnt: number of while cycles to delay * * Return: * *******************************************************************************/ static void delay (int cnt) { cnt <<= DELAY_2N; while (cnt--); } /******************************************************************************* * Read status of LCD controller * * Parameter: none * * Return: Status byte contains busy flag and address pointer * *******************************************************************************/ static unsigned char lcd_read_status (void) { unsigned char status; LCD_DATA_DIR_IN LCD_RS(0) LCD_RW(1) delay(10); LCD_E(1) delay(10); status = LCD_DATA_IN << 4; LCD_E(0) delay(10); LCD_E(1) delay(10); status |= LCD_DATA_IN; LCD_E(0) LCD_DATA_DIR_OUT return (status); } /******************************************************************************* * Wait until LCD controller busy flag is 0 * * Parameter: * * Return: Status byte of LCD controller (busy + address) * *******************************************************************************/ static unsigned char wait_while_busy (void) { unsigned char status; do { status = lcd_read_status(); } while (status & 0x80); /* Wait for busy flag */ return (status); } /******************************************************************************* * Write 4-bits to LCD controller * * Parameter: c: command to be written * * Return: * *******************************************************************************/ void lcd_write_4bit (unsigned char c) { LCD_RW(0) LCD_E(1) LCD_DATA_OUT(c&0x0F) delay(10); LCD_E(0) delay(10); } /******************************************************************************* * Write command to LCD controller * * Parameter: c: command to be written * * Return: * *******************************************************************************/ void lcd_write_cmd (unsigned char c) { wait_while_busy(); LCD_RS(0) lcd_write_4bit (c>>4); lcd_write_4bit (c); } /******************************************************************************* * Write data to LCD controller * * Parameter: c: data to be written * * Return: * *******************************************************************************/ static void lcd_write_data (unsigned char c) { wait_while_busy(); LCD_RS(1) lcd_write_4bit (c>>4); lcd_write_4bit (c); } /******************************************************************************* * Print Character to current cursor position * * Parameter: c: character to be printed * * Return: * *******************************************************************************/ void lcd_putchar (char c) { lcd_write_data (c); } /******************************************************************************* * Initialize the LCD controller * * Parameter: * * Return: * *******************************************************************************/ void lcd_init (void) { int i; unsigned char const *p; /* Set all pins for LCD as outputs */ LCD_ALL_DIR_OUT delay (15000); LCD_RS(0) lcd_write_4bit (0x3); /* Select 4-bit interface */ delay (4100); lcd_write_4bit (0x3); delay (100); lcd_write_4bit (0x3); lcd_write_4bit (0x2); lcd_write_cmd (0x28); /* 2 lines, 5x8 character matrix */ lcd_write_cmd (0x0C); /* Display ctrl:Disp=ON,Curs/Blnk=OFF */ lcd_write_cmd (0x06); /* Entry mode: Move right, no shift */ /* Load user-specific characters into CGRAM */ lcd_write_cmd(0x40); /* Set CGRAM address counter to 0 */ p = &UserFont[0][0]; for (i = 0; i < sizeof(UserFont); i++, p++) lcd_putchar (*p); lcd_write_cmd(0x80); /* Set DDRAM address counter to 0 */ } /******************************************************************************* * Set cursor position on LCD display * * Parameter: column: column position * * line: line position * * Return: * *******************************************************************************/ void set_cursor (unsigned char column, unsigned char line) { unsigned char address; address = (line * 40) + column; address = 0x80 + (address & 0x7F); lcd_write_cmd(address); /* Set DDRAM address counter to 0 */ } /******************************************************************************* * Clear the LCD display * * Parameter: * * Return: * *******************************************************************************/ void lcd_clear (void) { lcd_write_cmd(0x01); /* Display clear */ set_cursor (0, 0); } /******************************************************************************* * Print sting to LCD display * * Parameter: string: pointer to output string * * Return: * *******************************************************************************/ void lcd_print (char *string) { while (*string) { lcd_putchar (*string++); } } /******************************************************************************/