-unsigned char acm1602_getchar(unsigned char addr)
-{
- unsigned char b, d;
-#ifdef _LCD_IF_4BIT
- unsigned char h, l;
-
- lcd_waitbusy(addr, 0);
- d = _LCDPORT_TRIS_CONT;
- d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
- _LCDPORT_TRIS_CONT = d;
-
- // Recv high nibble
- b = _LCDPORT_CONT_LATCH;
- b &= ~(0xf0 | _LCDPORT_CONT_EN); // DATA=blank
- b |= (_LCDPORT_CONT_RS | _LCDPORT_CONT_RW); // RS='1", RW='1'
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- b |= _LCDPORT_CONT_EN;
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- h = _LCDPORT_DATA & 0xf0;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- b &= ~_LCDPORT_CONT_EN; // Disable EN
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT();
-
- lcd_waitbusy(addr, 0);
- // Recv Low nibble.
- d = _LCDPORT_TRIS_CONT;
- d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
- _LCDPORT_TRIS_CONT = d;
-
- b = _LCDPORT_CONT_LATCH;
- b &= ~(0xf0 | _LCDPORT_CONT_EN); // DATA=blank
- b |= (_LCDPORT_CONT_RS | _LCDPORT_CONT_RW); // RS='1", RW='1'
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- b |= _LCDPORT_CONT_EN;
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- l = _LCDPORT_DATA & 0xf0;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- b &= ~_LCDPORT_CONT_EN; // Disable EN
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- d = _LCDPORT_TRIS_CONT;
- d &= ~_LCDPORT_READMASK; // Set mask for Tristate, direction = write.
- _LCDPORT_TRIS_CONT = d;
-
- _ACM1602_SHORT_WAIT();
-
- d = h | (l >> 4);
- return d;
-#else
- unsigned char e;
- lcd_waitbusy(addr, 0);
- d = _LCDPORT_TRIS_DATA;
- d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
- _LCDPORT_TRIS_DATA = d;
-
- b = _LCDPORT_CONT_LATCH;
- b |= (_LCDPORT_CONT_RS | _LCDPORT_CONT_RW); // RW=1, RS=1
- b &= ~_LCDPORT_CONT_EN; // Clear Enable
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT();
-
- b |= _LCDPORT_CONT_EN; // Send character
- _LCDPORT_CONT_LATCH = b;
- _ACM1602_TC_WAIT(); // Wait 2.5?us
-
- e = _LCDPORT_DATA; // Read BYTE
- _ACM1602_TC_WAIT();
-
- b &= ~_LCDPORT_CONT_EN; // Disable EN
- _LCDPORT_CONT_LATCH = b;
-
- d = _LCDPORT_TRIS_DATA;
- d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = read.
- _LCDPORT_TRIS_DATA = d;
-
- _ACM1602_SHORT_WAIT(); // Wait 0.1ms
- return e;
-#endif
-}
-