OSDN Git Service

[LCD] Add support ST7032.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 12 Jun 2013 19:21:57 +0000 (04:21 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 12 Jun 2013 19:21:57 +0000 (04:21 +0900)
[LCD][ACM1602] Change some apis.

lcd_acm1602.c
lcd_acm1602.h
main.c
ui.c
ui.h

index fbf212d..9738fa6 100644 (file)
 #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 {
@@ -43,13 +48,13 @@ static unsigned char lcd_busychk(void)
     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);
 }
@@ -59,11 +64,11 @@ static void sendcmd(unsigned char addr, unsigned char cmd, unsigned char busyfla
 {
     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)
@@ -81,20 +86,28 @@ void acm1602_putchar(unsigned char addr, unsigned char c)
 {
     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;
 
@@ -126,13 +139,13 @@ static unsigned char lcd_busychk(void)
     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);
 }
@@ -146,7 +159,7 @@ static void sendcmd(unsigned char addr, unsigned char cmd,unsigned char busyflag
     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;
@@ -165,7 +178,7 @@ static void sendcmd(unsigned char addr, unsigned char cmd,unsigned char busyflag
     _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;
@@ -187,7 +200,7 @@ static void sendcmd(unsigned char addr, unsigned char cmd,unsigned char busyflag
 #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;
@@ -305,7 +318,7 @@ void acm1602_putchar(unsigned char addr, unsigned char c)
     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;
@@ -326,7 +339,7 @@ void acm1602_putchar(unsigned char addr, unsigned char c)
     _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;
@@ -347,7 +360,7 @@ void acm1602_putchar(unsigned char addr, unsigned char c)
     _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;
@@ -375,7 +388,7 @@ unsigned char acm1602_getchar(unsigned char addr)
 #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;
@@ -398,7 +411,7 @@ unsigned char acm1602_getchar(unsigned char addr)
     _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.
@@ -431,7 +444,7 @@ unsigned char acm1602_getchar(unsigned char addr)
     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;
@@ -469,17 +482,31 @@ void acm1602_cls(unsigned char addr)
     _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)
@@ -516,37 +543,56 @@ void acm1602_cursordir(unsigned char addr, unsigned char right)
     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);
+}
index c1382af..850325e 100644 (file)
@@ -50,21 +50,28 @@ extern "C" {
 #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
 }
diff --git a/main.c b/main.c
index 13a33e5..b514fef 100644 (file)
--- a/main.c
+++ b/main.c
@@ -187,16 +187,16 @@ void update_display(void)
      if(fm != 0){
          int freq_lo = fmfreq % 100;
          int freq_hi = fmfreq / 100;
-         print_numeric(freq_hi);
+         print_numeric(freq_hi, 0xff);
          _PUTCHAR('.');
-         print_numeric(freq_lo);
+         print_numeric(freq_lo, 0xff);
      } else {
-         print_numeric(amfreq);
+         print_numeric(amfreq, 0xff);
      }
      // Signal
      _LOCATE(0, 0);
      printstr("S=");
-     print_numeric(recv_signal);
+     print_numeric(recv_signal, 0xff);
 }
 
 
diff --git a/ui.c b/ui.c
index 766fedc..3e6d695 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -179,9 +179,9 @@ char pop_keyinfifo(void) __critical
     return c;
 }
 
-void print_numeric(int i)
+void print_numeric(int i, unsigned char supressf)
 {
-    if(i == 0){
+    if((i == 0) && (supressf != 0)){
         unsigned char c;
         c = '0';
         _CURSOR_LEFT();
@@ -190,6 +190,7 @@ void print_numeric(int i)
     } else {
         int l;
         unsigned char supress = 0;
+        if(supressf == 0) supress = 1;
          _CURSOR_LEFT();
         if(i < 0){
             _PUTCHAR('-');
@@ -200,6 +201,8 @@ void print_numeric(int i)
         if(l != 0) {
             _PUTCHAR((l & 0x0f)+ '0');
             supress = 1;
+        } else if(supress != 0) {
+            _PUTCHAR('0');
         }
         l = i / 1000;
         i = i % 1000;
diff --git a/ui.h b/ui.h
index 2a389fa..500fdea 100644 (file)
--- a/ui.h
+++ b/ui.h
@@ -45,7 +45,7 @@ extern char keyin_fifo[16];
 extern char keyin_nowp;
 extern char keyin_counter;
 
-#define _LOCATE(x,y) acm1602_locate(0xa0, x, y)
+#define _LOCATE(x,y) acm1602_locate_16x2(0xa0, x, y)
 #define _PUTCHAR(c) acm1602_putchar(0xa0, c)
 #define _CURSOR_LEFT() acm1602_cursordir(0xa0, 0x00)
 #define _CURSOR_RIGHT() acm1602_cursordir(0xa0, 0xff)
@@ -58,7 +58,7 @@ extern void readkey_io(void);
 extern unsigned char readkey_compare(void);
 
 extern void printstr(char *s);
-extern void print_numeric(int i);
+extern void print_numeric(int i, unsigned char supressf);
 extern void setsignal_tune(unsigned char flag);
 extern void set_backlight(unsigned char flag, unsigned int val);