Toyoshi Yoshimoto / I2CLCD
Revision:
0:4bb93e550e8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/I2CLCD.cpp	Mon Oct 12 10:39:30 2020 +0000
@@ -0,0 +1,214 @@
+#include "I2CLCD.h"
+/*
+I2C低電圧キャラクタ液晶モジュール
+*/
+
+I2CLCD::I2CLCD():I2C(p9,p10)
+{
+  MaxChNum = 32;
+  init();
+}
+
+I2CLCD::I2CLCD(int n):I2C(p9,p10)
+{
+  MaxChNum = n;
+  init();
+}
+
+I2CLCD::I2CLCD(PinName sda, PinName scl):I2C(sda,scl)
+{
+  MaxChNum = 32;
+  init();
+}
+
+I2CLCD::I2CLCD(PinName sda, PinName scl, int n):I2C(sda,scl)
+{
+  MaxChNum = n;
+  init();
+}
+
+void I2CLCD::init()
+{
+  int Wait = 30;
+  chCount = 0;
+  wait_ms(40);
+  LCD_WRITE= 0x7c;
+  write(0x0, 0x38);   //data8bit, numberOfLine=2
+  wait_us(Wait);
+  write(0x0, 0x39);   //data8bit, numberOfLine=2
+  wait_us(Wait);
+  write(0x0, 0x14);   //internal OSC frequency
+  wait_us(Wait);
+  if(MaxChNum==32) write(0x0, 0x7f);   // contrast 下4bit
+  else write(0x0, 0x78);   // contrast mini
+  wait_us(Wait);
+  write(0x0, 0x5F);   // power/icon/contrast control
+  wait_us(Wait);
+  write(0x0, 0x6a);   // follower control
+  wait_ms(200);          // 200ms
+  write(0x0, 0x0c);   // Display ON
+  wait_us(Wait);
+  write(0x0, 0x01);   // clear disply
+  wait_us(2000);         // 2ms
+  write(0x00, 0x06);   // entry mode set
+  wait_us(Wait);
+}
+void I2CLCD::home()
+{
+    write(0x00,0x02); // return to home
+    chCount=0;
+    wait_ms(2);
+}
+
+void I2CLCD::clear()
+{
+    write(0x00,0x01); // clear display
+    chCount=0;
+    wait_ms(2);
+}
+void I2CLCD::write(unsigned char  ch)
+{
+  int x;
+  int n = MaxChNum/2;
+  if(ch==0x0a){
+    x= chCount %MaxChNum;
+    if(x<n) {
+      write(0x00,0xc0);
+      chCount=n;
+    }
+    else {
+      write(0x00,0x01); // clear display
+      chCount=0;
+      wait_ms(2);
+    }
+  }
+  else
+  {
+    write(0x40,ch);
+    x= ++chCount % MaxChNum;
+    if( x ==n) write(0x00,0xc0);
+  }
+}
+
+void I2CLCD::write(char*  ch)
+{
+  while(*ch){
+    write(*ch++);
+  }
+}
+
+void I2CLCD::write(unsigned char control, unsigned char  dt)
+{
+  start();
+  ((I2C*)this)->write(LCD_WRITE);
+  ((I2C*)this)->write(control);
+  ((I2C*)this)->write(dt);
+  stop();
+}
+void I2CLCD::write(int x, int column, char zeroPad)
+{
+  char Buffer[10];
+  char num[5];
+  int i,j, n=0, signFlag=0;
+  if(x<0) {     // マイナスの値の場合
+    signFlag=1;
+    x *= -1;
+  }
+  do {
+    num[n++] = x%10;
+    x /= 10;
+  } while(x != 0);
+  i = column-n;
+  if(i>0) {
+    for(i=0; i<10; i++) Buffer[i]=' ';
+    if(zeroPad) for(i=0; i<column-n; i++) Buffer[i]='0';
+    Buffer[9]=0;
+    for(i=column-n, j=n-1; i<column; i++, j--) Buffer[i]=num[j]|'0';
+    Buffer[i]=0;
+    if(signFlag) Buffer[column-n-1]='-';
+  }
+  else {
+    j=0;
+    if(signFlag) Buffer[j++]='-';
+    for(i=--n; i>=0; i--) Buffer[j++]=num[i]|'0';
+    Buffer[j]=0;
+  }
+  write(Buffer);
+}
+
+void I2CLCD::writeInt(int x)
+{
+  char num[5];
+  int n=0;
+  if(x<0) {     // マイナスの値の場合
+    write('-');
+    x *= -1;
+  }
+  do {
+    num[n++] = x%10 +'0';
+    x /= 10;
+  } while(x != 0);
+  while(--n >=0) write(num[n]);
+}
+
+void I2CLCD::setIcon(int x)
+{
+  write(0x00, 0x39);    // Function set
+  write(0x00, 0x40 | 0x0f);   // flower icon
+  if(x & 1) write(0x40, 0x10);
+  else  write(0x40, 0x00);
+
+  write(0x00, 0x40 | 0x0d);   // Battery icon
+  write(0x40, 0);
+  if(x & 0x0e) {
+    write(0x00, 0x40 | 0x0d);   // Battery icon
+    write(0x40, ((x & 0x0e)<<1) | 2);
+  }
+
+  write(0x00, 0x40 | 0x0b);   // no sound icon
+  if(x & 0x10) write(0x40, 0x10);
+  else write(0x40, 0);
+
+  write(0x00, 0x40 | 0x09);   // Key icon
+  if(x & 0x20) write(0x40, 0x10);
+  else write(0x40, 0);
+
+  write(0x00, 0x40 | 0x07);   // 矢印 icon
+  write(0x40, 0);
+  if(x & 0xC0) {
+    write(0x00, 0x40 | 0x07);   // 矢印 icon
+    write(0x40, (x & 0xC0)>>3);
+  }
+
+  write(0x00, 0x40 | 0x06);   // enter icon
+  if(x & 0x100) write(0x40, 0x10);
+  else write(0x40, 0);
+  write(0x00, 0x40 | 0x04);   // ring icon
+  if(x & 0x200) write(0x40, 0x10);
+  else write(0x40, 0);
+  write(0x00, 0x40 | 0x02);   // 電話 icon
+  if(x & 0x400) write(0x40, 0x10);
+  else write(0x40, 0);
+  write(0x00, 0x40);    // antena icon
+  if(x & 0x800) write(0x40, 0x10);
+  else write(0x40, 0);
+  write(0x00, 0x38);    // Function set
+}
+
+void I2CLCD::setCG(char mode, char* cgData)
+{
+  unsigned char i, j;
+  write(0x00,0x38);     // Function set IS= 0
+  write(0x00,0x40);     // CGRAM set address= 0
+  if(mode == 0) {    // StringModeで呼ばれた時はデフォールトにセット
+    for(i=0; i<8; i++) {
+      for(j=0; j<8; j++) {
+        if(j < (7-i))   write(0x40,0x00);
+        else write(0x40,0x1f);     // 横棒をセット
+      }
+    }
+  }
+  else {
+    for(i=0; i<64; i++ ) write(0x40, cgData[i]);
+  }
+}