#include "lcd_acm1602.h"
#ifdef _USE_I2C_1602
-static unsigned char lcd_busychk(void)
+static unsigned char lcd_busychk(addr)
{
unsigned char b, d;
- // Under development.
- d = 0xff;
+ i2c_idle();
+ OPENASMASTER();
+ i2c_writechar(addr | 0x01); // Read
+ i2c_writechar(0x00);
+ d = i2c_readchar();
+ CLOSEASMASTER();
+ _ACM1602_I2C_WAIT(); // 5.5ms
if((d & _LCDPORT_BUSYMASK) != 0){
d = 0xff; // BUSY
} else {
return d;
}
-static void lcd_waitbusy(unsigned char flag)
+void lcd_waitbusy(unsigned char addr, unsigned char flag)
{
unsigned char f,ff;
ff = flag;
if(ff != 0) ff = 0xff;
do {
- f = lcd_busychk();
+ f = lcd_busychk(addr);
_ACM1602_SHORT_WAIT(); // Wait 0.1ms
} while(f != ff);
}
{
i2c_idle();
OPENASMASTER();
- i2c_writechar(addr);
+ i2c_writechar(addr & 0xfe);
i2c_writechar(0x00);
i2c_writechar(cmd);
CLOSEASMASTER();
- _ACM1602_I2C_WAIT(); // 0.2ms
+ _ACM1602_I2C_WAIT(); // 5.5ms
}
static void sendonce(unsigned char addr, unsigned char cmd)
{
i2c_idle();
OPENASMASTER();
- i2c_writechar(addr);
+ i2c_writechar(addr & 0xfe);
i2c_writechar(0x80); //Data
i2c_writechar(c); // Putchar
CLOSEASMASTER();
- _ACM1602_SHORT_WAIT(); // Wait 50us
+ _ACM1602_I2C_WAIT(); // Wait 50us
}
+
unsigned char acm1602_getchar(unsigned char addr)
{
- // Under development
- return 0x00;
+ unsigned char d;
+ i2c_idle();
+ OPENASMASTER();
+ i2c_writechar(addr | 0x01); // Read
+ i2c_writechar(0x80);
+ d = i2c_readchar();
+ CLOSEASMASTER();
+ _ACM1602_I2C_WAIT(); // 5.5ms
+ return d;
}
#else // Parallel
-static unsigned char lcd_busychk(void)
+static unsigned char lcd_busychk(unsigned char addr)
{
unsigned char b, d;
return d;
}
-static void lcd_waitbusy(unsigned char flag)
+void lcd_waitbusy(unsigned char addr, unsigned char flag)
{
unsigned char f,ff;
ff = flag;
if(ff != 0) ff = 0xff;
do {
- f = lcd_busychk();
+ f = lcd_busychk(addr);
_ACM1602_SHORT_WAIT(); // Wait 0.1ms
} while(f != ff);
}
h = cmd & 0xf0; // Higher bit is used.
l = (cmd & 0x0f) << 4; // Higher bit is used.
// Higher NIBBLE
- if(busyflag != 0) lcd_waitbusy(0);
+ if(busyflag != 0) lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_CONT;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_CONT = d;
_ACM1602_TC_WAIT();
// Lower NIBBLE
- if(busyflag != 0) lcd_waitbusy(0);
+ if(busyflag != 0) lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_CONT;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_CONT = d;
#else
unsigned char b,d;
- if(busyflag != 0) lcd_waitbusy(0);
+ if(busyflag != 0) lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_DATA;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_DATA = d;
h = c & 0xf0;
l = (c & 0x0f)<<4;
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_CONT;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_CONT = d;
_LCDPORT_CONT_LATCH = b;
_ACM1602_TC_WAIT();
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_CONT;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_CONT = d;
_ACM1602_SHORT_WAIT();
#else
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_DATA;
d &= ~_LCDPORT_READMASK; // Clear mask for Tristate, direction = write.
_LCDPORT_TRIS_DATA = d;
#ifdef _LCD_IF_4BIT
unsigned char h, l;
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_CONT;
d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
_LCDPORT_TRIS_CONT = d;
_LCDPORT_CONT_LATCH = b;
_ACM1602_TC_WAIT();
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
// Recv Low nibble.
d = _LCDPORT_TRIS_CONT;
d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
return d;
#else
unsigned char e;
- lcd_waitbusy(0);
+ lcd_waitbusy(addr, 0);
d = _LCDPORT_TRIS_DATA;
d |= _LCDPORT_READMASK; // Set mask for Tristate, direction = read.
_LCDPORT_TRIS_DATA = d;
_ACM1602_LONG_WAIT(); // Wait 5ms
}
-void acm1602_locate(unsigned char addr, char x, char y)
+void acm1602_setdataramaddress(unsigned char addr, unsigned char pos)
+{
+ unsigned char cmd = (pos & 0x7f) | 0x80;
+ sendcmd(addr, cmd, 0xff);
+}
+
+void acm1602_locate_16x2(unsigned char addr, char x, char y)
{
unsigned char ramaddr;
if((x < 0) || (x > 15)) return;
if((y < 0) || (y > 1)) return;
- if(y == 0){
- ramaddr = 0x80 | (x & 0x0f);
- } else {
- ramaddr = 0xc0 | (x & 0x0f);
- }
- sendcmd(addr, ramaddr, 0xff);
+ ramaddr = (y == 0)? x & 0x0f : (x & 0x0f) | 0x40;
+ acm1602_setdataramaddress(addr, ramaddr);
+}
+
+/*
+ * For using
+ */
+void acm1602_locate_8x2(unsigned char addr, char x, char y)
+{
+ unsigned char ramaddr;
+ if((x < 0) || (x > 8)) return;
+ if((y < 0) || (y > 1)) return;
+ ramaddr = (y == 0)? x & 0x0f : (x & 0x0f) | 0x40;
+ acm1602_setdataramaddress(addr, ramaddr);
}
void acm1602_home(unsigned char addr)
sendcmd(addr, cmd, 0xff);
}
+void acm1602_setcgramaddress(unsigned char addr, unsigned char pos)
+{
+ unsigned char cmd = (pos & 0x3f) | 0x40;
+ sendcmd(addr, cmd, 0xff);
+}
+
void acm1602_init(unsigned char addr, unsigned char cls)
{
acm1602_ioinit(addr);
#ifdef _USE_I2C_1602
- sendonce(addr, 0x38, 0x00); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
+ sendcmd(addr,0x01,0x00);
sendcmd(addr, 0x38, 0x00); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
+// sendcmd(addr, 0x38, 0x00); // 2lines, 8x10dot fonts.
#else
#ifndef _LCD_IF_4BIT
sendonce(addr, 0x38); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
sendcmd(addr, 0x38, 0x00); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
- #else
+ #else // 4Bit
sendonce(addr, 0x30); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
// Send twice on 4Bit Mode.
sendcmd(addr, 0x28, 0x00); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
sendcmd(addr, 0x28, 0x00); // 2lines, 8x10dot fonts.
- _ACM1602_SHORT_WAIT();
#endif
#endif
sendcmd(addr, 0x0f, 0xff); // Display ON.
- _ACM1602_SHORT_WAIT();
- if(cls == 0){
+ sendcmd(addr, 0b00000110, 0xff); // Cursor increment,not shift.
+ if(cls == 0){
acm1602_home(addr);
} else {
acm1602_cls(addr);
}
- sendcmd(addr, 0b00000110, 0xff); // Cursor increment,not shift.
- _ACM1602_SHORT_WAIT();
-}
\ No newline at end of file
+}
+/*
+ * st7032 extensions.
+ */
+void st7032_extcmd(unsigned char addr, unsigned char mode,
+ unsigned char cmd, unsigned char busyf)
+{
+ unsigned char m = mode & 0x1c;
+ m = m | 0x21;
+ sendcmd(addr, m, busyf); // Shift to IS1
+ sendcmd(addr, cmd, busyf);
+ m &= 0xfe; // Shift to IS0
+ sendcmd(addr, m, busyf);
+}
+
+void st7032_setcontrast(unsigned char addr, unsigned char value,
+ unsigned char busyf)
+{
+ unsigned char val = value & 0x0f;
+ val |= 0x70;
+ st7032_extcmd(addr, 0x38, val, busyf);
+}
#define _ACM1602_LONG_WAIT() delay1ktcy(40)
// Wait 50ms
#define _ACM1602_LONG_LONG_WAIT() delay10ktcy(40)
-// Wait 0.2ms
-#define _ACM1602_I2C_WAIT() delay100tcy(16)
+// Wait 5.5ms
+#define _ACM1602_I2C_WAIT() delay1ktcy(44)
extern void acm1602_cls(unsigned char addr);
extern void acm1602_putchar(unsigned char addr, unsigned char c);
-extern void acm1602_locate(unsigned char addr, char x, char y);
+extern void acm1602_locate_16x2(unsigned char addr, char x, char y);
+extern void acm1602_locate_8x2(unsigned char addr, char x, char y);
extern void acm1602_home(unsigned char addr);
extern void acm1602_printf(unsigned char addr, const char *fmt, ...);
extern void acm1602_cursordir(unsigned char addr, unsigned char right);
extern void acm1602_init(unsigned char addr, unsigned char cls);
extern unsigned char acm1602_getchar(unsigned char addr);
-
+/*
+ * ST7032 extension functions
+ */
+extern void st7032_extcmd(unsigned char addr, unsigned char mode,
+ unsigned char cmd, unsigned char busyf);
+extern void st7032_setcontrast(unsigned char addr, unsigned char value,
+ unsigned char busyf);
#ifdef __cplusplus
}