Toyoshi Yoshimoto / I2CLCD
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers I2CLCD.cpp Source File

I2CLCD.cpp

00001 #include "I2CLCD.h"
00002 /*
00003 I2C低電圧キャラクタ液晶モジュール
00004 */
00005 
00006 I2CLCD::I2CLCD():I2C(p9,p10)
00007 {
00008   MaxChNum = 32;
00009   init();
00010 }
00011 
00012 I2CLCD::I2CLCD(int n):I2C(p9,p10)
00013 {
00014   MaxChNum = n;
00015   init();
00016 }
00017 
00018 I2CLCD::I2CLCD(PinName sda, PinName scl):I2C(sda,scl)
00019 {
00020   MaxChNum = 32;
00021   init();
00022 }
00023 
00024 I2CLCD::I2CLCD(PinName sda, PinName scl, int n):I2C(sda,scl)
00025 {
00026   MaxChNum = n;
00027   init();
00028 }
00029 
00030 void I2CLCD::init()
00031 {
00032   int Wait = 30;
00033   chCount = 0;
00034   wait_ms(40);
00035   LCD_WRITE= 0x7c;
00036   write(0x0, 0x38);   //data8bit, numberOfLine=2
00037   wait_us(Wait);
00038   write(0x0, 0x39);   //data8bit, numberOfLine=2
00039   wait_us(Wait);
00040   write(0x0, 0x14);   //internal OSC frequency
00041   wait_us(Wait);
00042   if(MaxChNum==32) write(0x0, 0x7f);   // contrast 下4bit
00043   else write(0x0, 0x78);   // contrast mini
00044   wait_us(Wait);
00045   write(0x0, 0x5F);   // power/icon/contrast control
00046   wait_us(Wait);
00047   write(0x0, 0x6a);   // follower control
00048   wait_ms(200);          // 200ms
00049   write(0x0, 0x0c);   // Display ON
00050   wait_us(Wait);
00051   write(0x0, 0x01);   // clear disply
00052   wait_us(2000);         // 2ms
00053   write(0x00, 0x06);   // entry mode set
00054   wait_us(Wait);
00055 }
00056 void I2CLCD::home()
00057 {
00058     write(0x00,0x02); // return to home
00059     chCount=0;
00060     wait_ms(2);
00061 }
00062 
00063 void I2CLCD::clear()
00064 {
00065     write(0x00,0x01); // clear display
00066     chCount=0;
00067     wait_ms(2);
00068 }
00069 void I2CLCD::write(unsigned char  ch)
00070 {
00071   int x;
00072   int n = MaxChNum/2;
00073   if(ch==0x0a){
00074     x= chCount %MaxChNum;
00075     if(x<n) {
00076       write(0x00,0xc0);
00077       chCount=n;
00078     }
00079     else {
00080       write(0x00,0x01); // clear display
00081       chCount=0;
00082       wait_ms(2);
00083     }
00084   }
00085   else
00086   {
00087     write(0x40,ch);
00088     x= ++chCount % MaxChNum;
00089     if( x ==n) write(0x00,0xc0);
00090   }
00091 }
00092 
00093 void I2CLCD::write(char*  ch)
00094 {
00095   while(*ch){
00096     write(*ch++);
00097   }
00098 }
00099 
00100 void I2CLCD::write(unsigned char control, unsigned char  dt)
00101 {
00102   start();
00103   ((I2C*)this)->write(LCD_WRITE);
00104   ((I2C*)this)->write(control);
00105   ((I2C*)this)->write(dt);
00106   stop();
00107 }
00108 void I2CLCD::write(int x, int column, char zeroPad)
00109 {
00110   char Buffer[10];
00111   char num[5];
00112   int i,j, n=0, signFlag=0;
00113   if(x<0) {     // マイナスの値の場合
00114     signFlag=1;
00115     x *= -1;
00116   }
00117   do {
00118     num[n++] = x%10;
00119     x /= 10;
00120   } while(x != 0);
00121   i = column-n;
00122   if(i>0) {
00123     for(i=0; i<10; i++) Buffer[i]=' ';
00124     if(zeroPad) for(i=0; i<column-n; i++) Buffer[i]='0';
00125     Buffer[9]=0;
00126     for(i=column-n, j=n-1; i<column; i++, j--) Buffer[i]=num[j]|'0';
00127     Buffer[i]=0;
00128     if(signFlag) Buffer[column-n-1]='-';
00129   }
00130   else {
00131     j=0;
00132     if(signFlag) Buffer[j++]='-';
00133     for(i=--n; i>=0; i--) Buffer[j++]=num[i]|'0';
00134     Buffer[j]=0;
00135   }
00136   write(Buffer);
00137 }
00138 
00139 void I2CLCD::writeInt(int x)
00140 {
00141   char num[5];
00142   int n=0;
00143   if(x<0) {     // マイナスの値の場合
00144     write('-');
00145     x *= -1;
00146   }
00147   do {
00148     num[n++] = x%10 +'0';
00149     x /= 10;
00150   } while(x != 0);
00151   while(--n >=0) write(num[n]);
00152 }
00153 
00154 void I2CLCD::setIcon(int x)
00155 {
00156   write(0x00, 0x39);    // Function set
00157   write(0x00, 0x40 | 0x0f);   // flower icon
00158   if(x & 1) write(0x40, 0x10);
00159   else  write(0x40, 0x00);
00160 
00161   write(0x00, 0x40 | 0x0d);   // Battery icon
00162   write(0x40, 0);
00163   if(x & 0x0e) {
00164     write(0x00, 0x40 | 0x0d);   // Battery icon
00165     write(0x40, ((x & 0x0e)<<1) | 2);
00166   }
00167 
00168   write(0x00, 0x40 | 0x0b);   // no sound icon
00169   if(x & 0x10) write(0x40, 0x10);
00170   else write(0x40, 0);
00171 
00172   write(0x00, 0x40 | 0x09);   // Key icon
00173   if(x & 0x20) write(0x40, 0x10);
00174   else write(0x40, 0);
00175 
00176   write(0x00, 0x40 | 0x07);   // 矢印 icon
00177   write(0x40, 0);
00178   if(x & 0xC0) {
00179     write(0x00, 0x40 | 0x07);   // 矢印 icon
00180     write(0x40, (x & 0xC0)>>3);
00181   }
00182 
00183   write(0x00, 0x40 | 0x06);   // enter icon
00184   if(x & 0x100) write(0x40, 0x10);
00185   else write(0x40, 0);
00186   write(0x00, 0x40 | 0x04);   // ring icon
00187   if(x & 0x200) write(0x40, 0x10);
00188   else write(0x40, 0);
00189   write(0x00, 0x40 | 0x02);   // 電話 icon
00190   if(x & 0x400) write(0x40, 0x10);
00191   else write(0x40, 0);
00192   write(0x00, 0x40);    // antena icon
00193   if(x & 0x800) write(0x40, 0x10);
00194   else write(0x40, 0);
00195   write(0x00, 0x38);    // Function set
00196 }
00197 
00198 void I2CLCD::setCG(char mode, char* cgData)
00199 {
00200   unsigned char i, j;
00201   write(0x00,0x38);     // Function set IS= 0
00202   write(0x00,0x40);     // CGRAM set address= 0
00203   if(mode == 0) {    // StringModeで呼ばれた時はデフォールトにセット
00204     for(i=0; i<8; i++) {
00205       for(j=0; j<8; j++) {
00206         if(j < (7-i))   write(0x40,0x00);
00207         else write(0x40,0x1f);     // 横棒をセット
00208       }
00209     }
00210   }
00211   else {
00212     for(i=0; i<64; i++ ) write(0x40, cgData[i]);
00213   }
00214 }