X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Flcd_hd44.c;h=1c2e52f7261b2651e8121734fe7cc152fb131fa7;hb=99fafc49f3b2d50abb2d7b8b4cbbd3be8e107bef;hp=ecfea365aa3b6df26bbbffbb28b4dd0df5f961bd;hpb=0c2f7108e2f9b6fa567bc83dda9a313fffceb286;p=bertos.git diff --git a/drv/lcd_hd44.c b/drv/lcd_hd44.c old mode 100755 new mode 100644 index ecfea365..1c2e52f7 --- a/drv/lcd_hd44.c +++ b/drv/lcd_hd44.c @@ -1,8 +1,33 @@ -/*! +/** * \file * * * \brief LM044L type LCD hardware module (impl.) @@ -12,30 +37,9 @@ * \author Stefano Fedrigo */ -/*#* - *#* $Log$ - *#* Revision 1.1 2005/11/04 18:00:42 bernie - *#* Import into DevLib. - *#* - *#* Revision 1.2 2005/06/14 14:43:43 bernie - *#* Add DevLib headers. - *#* - *#* Revision 1.1 2005/05/24 09:17:58 batt - *#* Move drivers to top-level. - *#* - *#* Revision 1.9 2005/05/09 21:58:53 batt - *#* Fix doxygen tags. - *#* - *#* Revision 1.8 2005/05/09 12:52:46 batt - *#* lcd_dataRead(): Avoid bus collision; Add back *UNTESTED* 8bit bus support. - *#* - *#* Revision 1.7 2005/05/09 12:24:13 batt - *#* lcd_putc(): Fix latent bug; lcd_hw_init(): Extend timings. - *#*/ - #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) @@ -46,10 +50,12 @@ #error Incomplete or missing LCD_READ/LCD_WRITE macros #endif -/*! Flag di stato del display */ +/** 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). */ @@ -96,8 +102,28 @@ 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 * LCD output by avoiding to set the address every time. */ @@ -181,7 +207,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; @@ -260,7 +286,7 @@ extern uint8_t Emul_LCDReadData(void); #endif /* ARCH_EMUL */ -/*! +/** * Wait until the LCD busy flag clears. */ void lcd_waitBusy(void) @@ -274,7 +300,7 @@ void lcd_waitBusy(void) } -/*! +/** * Move the cursor to \a addr, only if not already there. */ void lcd_moveTo(uint8_t addr) @@ -282,13 +308,13 @@ 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; } } -/*! +/** * Write a value in LCD data register, waiting for the busy flag. */ void lcd_setReg(uint8_t val) @@ -298,7 +324,7 @@ void lcd_setReg(uint8_t val) } #include -/*! +/** * Write the character \a c on display address \a addr. * * NOTE: argh, the HD44 lcd type is a bad beast: our @@ -308,7 +334,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); @@ -320,11 +346,11 @@ 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)); } -/*! +/** * Remap the glyph of a character. * * glyph - bitmap of 8x8 bits. @@ -345,7 +371,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)); } @@ -388,8 +414,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); }