From: batt Date: Mon, 1 Oct 2007 10:46:09 +0000 (+0000) Subject: Add light LCD position computation. X-Git-Tag: 1.0.0~424 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=398cd448c1dec51b2206e8485c9ed3a575949cb1;p=bertos.git Add light LCD position computation. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@817 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/drv/lcd_hd44.c b/drv/lcd_hd44.c index 0bd7b344..01bd423d 100755 --- a/drv/lcd_hd44.c +++ b/drv/lcd_hd44.c @@ -14,6 +14,9 @@ /*#* *#* $Log$ + *#* Revision 1.4 2007/10/01 10:46:09 batt + *#* Add light LCD position computation. + *#* *#* Revision 1.3 2006/09/20 19:55:01 marco *#* Added CONFIG_LCD_4BIT. *#* @@ -44,9 +47,19 @@ #include #include +#if defined(LCD_READ_H) && defined(LCD_READ_L) && defined(LCD_WRITE_H) && defined(LCD_WRITE_L) + #define CONFIG_LCD_4BIT 1 +#elif defined(LCD_READ) && defined(LCD_WRITE) + #define CONFIG_LCD_4BIT 0 +#else + #error Incomplete or missing LCD_READ/LCD_WRITE macros +#endif + /** Flag di stato del display */ #define LCDF_BUSY BV(7) +#if CONFIG_LCD_ADDRESS_FAST == 1 +#define lcd_address(x) lcd_address[x] /** * Addresses of LCD display character positions, expanded * for faster access (DB7 = 1). @@ -94,6 +107,26 @@ static const uint8_t lcd_address[] = }; STATIC_ASSERT(countof(lcd_address) == LCD_ROWS * LCD_COLS); +#else /* CONFIG_LCD_ADDRESS_FAST == 0 */ + +static uint8_t col_address[] = +{ + 0x80, + 0xC0, +#if LCD_ROWS > 2 + 0x94, + 0xD4 +#endif +}; + +/** + * Addresses of LCD display character positions, calculated runtime to save RAM + */ +static uint8_t lcd_address(uint8_t addr) +{ + return col_address[addr / LCD_COLS] + addr % LCD_COLS; +} +#endif /* CONFIG_LCD_ADDRESS_FAST */ /** * Current display position. We remember this to optimize @@ -280,7 +313,7 @@ void lcd_moveTo(uint8_t addr) if (addr != lcd_current_addr) { lcd_waitBusy(); - lcd_regWrite(lcd_address[addr]); + lcd_regWrite(lcd_address(addr)); lcd_current_addr = addr; } } @@ -306,7 +339,7 @@ void lcd_setReg(uint8_t val) void lcd_putc(uint8_t addr, uint8_t c) { if (addr != lcd_current_addr) - lcd_setReg(lcd_address[addr]); + lcd_setReg(lcd_address(addr)); lcd_waitBusy(); lcd_dataWrite(c); @@ -318,7 +351,7 @@ void lcd_putc(uint8_t addr, uint8_t c) /* If we are at the end of a row put the cursor at the beginning of the next */ if (!(lcd_current_addr % LCD_COLS)) - lcd_setReg(lcd_address[lcd_current_addr]); + lcd_setReg(lcd_address(lcd_current_addr)); } @@ -343,7 +376,7 @@ void lcd_remapChar(const char *glyph, char code) } /* Move back to original address */ - lcd_setReg(lcd_address[lcd_current_addr]); + lcd_setReg(lcd_address(lcd_current_addr)); }