X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Flcd_hd44.c;h=31f2335db71969890aa77e3f013d51ab8840aef3;hb=5f3952176a4e9a00ca8dd5ec4a6b994958f89e0a;hp=de7bdf7af4f0e9910afa81a11d5162c83545cfad;hpb=bcf38f772b397e7a8ba781a69aacb9380e54b32a;p=bertos.git diff --git a/drv/lcd_hd44.c b/drv/lcd_hd44.c old mode 100755 new mode 100644 index de7bdf7a..31f2335d --- a/drv/lcd_hd44.c +++ b/drv/lcd_hd44.c @@ -14,6 +14,15 @@ /*#* *#* $Log$ + *#* Revision 1.5 2007/10/01 18:59:27 batt + *#* Set to const col_address; add static assert check on array dimension. + *#* + *#* 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. + *#* *#* Revision 1.2 2006/07/19 12:56:25 bernie *#* Convert to new Doxygen style. *#* @@ -37,8 +46,8 @@ *#*/ #include "lcd_hd44.h" -#include "lcd_bus_pz.h" -#include +#include "hw_lcd.h" +#include #include #if defined(LCD_READ_H) && defined(LCD_READ_L) && defined(LCD_WRITE_H) && defined(LCD_WRITE_L) @@ -52,6 +61,8 @@ /** 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). @@ -99,6 +110,26 @@ static const uint8_t lcd_address[] = }; STATIC_ASSERT(countof(lcd_address) == LCD_ROWS * LCD_COLS); +#else /* CONFIG_LCD_ADDRESS_FAST == 0 */ + +static const uint8_t col_address[] = +{ + 0x80, + 0xC0, +#if LCD_ROWS > 2 + 0x94, + 0xD4 +#endif +}; +STATIC_ASSERT(countof(col_address) == LCD_ROWS); +/** + * 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 @@ -184,7 +215,7 @@ INLINE uint8_t lcd_dataRead(void) /* Read data */ LCD_SET_E; LCD_DELAY_READ; - data |= LCD_READ; + data = LCD_READ; LCD_CLR_E; LCD_DELAY_READ; @@ -285,7 +316,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; } } @@ -311,7 +342,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); @@ -323,7 +354,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)); } @@ -348,7 +379,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)); } @@ -391,8 +422,9 @@ void lcd_hw_init(void) lcd_regWrite(LCD_CMD_CLEAR); timer_delay(2); - //lcd_regWrite(LCD_CMD_RESET_DDRAM); 4 bit mode doesn't allow char reprogramming - +#if !CONFIG_LCD_4BIT + lcd_regWrite(LCD_CMD_RESET_DDRAM); // 4 bit mode doesn't allow char reprogramming +#endif lcd_regWrite(LCD_CMD_DISPLAYMODE); timer_delay(2); }