Toyoshi Yoshimoto / I2CLCD

I2CLCD.cpp

Committer:
jm6wud
Date:
2020-10-12
Revision:
0:4bb93e550e8c

File content as of revision 0:4bb93e550e8c:

#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]);
  }
}