KS0108 LCD LIB with I2C I/O expander PCF8574 for Databus

Dependencies:   BusEnums

Dependents:   Menu

Revision:
2:6a8fbb08d519
Parent:
1:8bc625378e38
Child:
4:eeaa5069be9c
--- a/KS0108.cpp	Mon Sep 03 09:32:37 2012 +0000
+++ b/KS0108.cpp	Tue Sep 04 14:51:17 2012 +0000
@@ -1,4 +1,4 @@
-#include "KS0108.h"     
+#include "KS0108.h"
 #include "PCF8574_DataBus.h"
 
 /*KS0108::KS0108 (PinName _RST,PinName _DI, PinName _RW, PinName _E, PinName _CS2, PinName _CS1, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7)
@@ -9,331 +9,342 @@
 KS0108::KS0108 (PinName _RST,PinName _DI, PinName _RW, PinName _E, PinName _CS2, PinName _CS1,PCF8574_DataBus &_DB)
     :
     RST(_RST),
-    DI(_DI), 
-    RW(_RW), 
-    E(_E), 
-    CS2(_CS2), 
-    CS1(_CS1), 
+    DI(_DI),
+    RW(_RW),
+    E(_E),
+    CS2(_CS2),
+    CS1(_CS1),
     DB(_DB)
-    {
-    
-
-   RST.mode(OpenDrain);
-   DI.mode(OpenDrain);
-   RW.mode(OpenDrain);
-   E.mode(OpenDrain);
-   CS2.mode(OpenDrain);
-   CS1.mode(OpenDrain);
-   
-   //RST.output();
-   DI.output();
-   RW.output();
-   E.output();
-   CS2.output();
-   CS1.output();
-   DB.output();
+{
 
 
-    
-   
-   
-   
-    
+    RST.mode(OpenDrain);
+    DI.mode(OpenDrain);
+    RW.mode(OpenDrain);
+    E.mode(OpenDrain);
+    CS2.mode(OpenDrain);
+    CS1.mode(OpenDrain);
+
+    //RST.output();
+    DI.output();
+    RW.output();
+    E.output();
+    CS2.output();
     CS1.output();
-    CS2.output();    
+    DB.output();
+
+
+    CS1.output();
+    CS2.output();
     RST.write(0);
-    wait_us(10);  
+    wait_us(10);
     RST.write(1);                         //reset screen
-    E.write(0);                       
+    E.write(0);
     ClearScreen();                      //clear display
-    WriteInstruction(LCD_ON, BOTH);     //turn on lcd  
-    Inverted = 0;     
+    WriteInstruction(LCD_ON, BOTH);     //turn on lcd
+    Inverted = 0;
 }
 
 
 
-void  KS0108::WriteInstruction(unsigned int Command,unsigned int side){
-     E.write(0); 
-     DI.write(0);
-     RW.write(0);
-         
-     SelectSide(side);   //select controller
- 
-     wait(0.0000003);     //wait 300ns
-     E.write(1);
-     DB.output();
-     DB.write(Command);        
-      wait(0.0000001);
-     E.write(0);
- }
+void  KS0108::WriteInstruction(unsigned int Command,unsigned int side)
+{
+    E.write(0);
+    DI.write(0);
+    RW.write(0);
+
+    SelectSide(side);   //select controller
+
+    wait(0.0000003);     //wait 300ns
+    E.write(1);
+    DB.output();
+    DB.write(Command);
+    wait(0.0000001);
+    E.write(0);
+}
 
 
-void  KS0108::WriteData(unsigned int data,unsigned char side){
-    E.write(0); 
+void  KS0108::WriteData(unsigned int data,unsigned char side)
+{
+    E.write(0);
     DI.write(1);
     RW.write(0);
-    
+
     SelectSide(side);
 
     wait(0.0000003); // 300ns
     E.write(1);
     DB.output();
-    DB.write(data);     
+    DB.write(data);
     wait(0.0000001);
     E.write(0);
 }
 
-void KS0108::WriteData(unsigned int data) {
+void KS0108::WriteData(unsigned int data)
+{
     unsigned int displayData, yOffset, chip;
-    
+
     if(Coord.x >= SCREEN_WIDTH)
         return;
-     chip = Coord.x/CHIP_WIDTH; 
-     wait(0.000000450); // 300ns     
+    chip = Coord.x/CHIP_WIDTH;
+    wait(0.000000450); // 300ns
 
-     if(Coord.x % CHIP_WIDTH == 0 && chip > 0){         
-     GotoXY(Coord.x, Coord.y);
-     }
+    if(Coord.x % CHIP_WIDTH == 0 && chip > 0) {
+        GotoXY(Coord.x, Coord.y);
+    }
 
     DI.write(1);                    // D/I = 1
-    RW.write(0);                      // R/W = 0    
+    RW.write(0);                      // R/W = 0
     DB.output();                    // data port is output
-    
+
     yOffset = Coord.y%8;
 
     if(yOffset != 0) {                 // first page
 
-    displayData = ReadData();
+        displayData = ReadData();
 
-    DI.write(1);                            // D/I = 1
-    RW.write(0);                              // R/W = 0    
-    SelectSide(chip);    
-    DB.output();
-                                            // data port is output             
-    displayData |= data << yOffset;
-    if(Inverted)    displayData = ~displayData;
-    DB.write(displayData);                     // write data
-    wait(0.0000003);                         // 300ns
-    E.write(1);
-    wait(0.0000001);
-    E.write(0);
-        
-                                    // second page
-    GotoXY(Coord.x, Coord.y+8);
-        
-    displayData = ReadData();
+        DI.write(1);                            // D/I = 1
+        RW.write(0);                              // R/W = 0
+        SelectSide(chip);
+        DB.output();
+        // data port is output
+        displayData |= data << yOffset;
+        if(Inverted)    displayData = ~displayData;
+        DB.write(displayData);                     // write data
+        wait(0.0000003);                         // 300ns
+        E.write(1);
+        wait(0.0000001);
+        E.write(0);
 
-    DI.write(1);                            // D/I = 1
-    RW.write(0);                              // R/W = 0    
-    SelectSide(chip);
+        // second page
+        GotoXY(Coord.x, Coord.y+8);
+
+        displayData = ReadData();
 
-    DB.output();                // data port is output
-        
-    displayData |= data >> (8-yOffset);
-    
+        DI.write(1);                            // D/I = 1
+        RW.write(0);                              // R/W = 0
+        SelectSide(chip);
+
+        DB.output();                // data port is output
+
+        displayData |= data >> (8-yOffset);
+
         if(Inverted)
             displayData = ~displayData;
-            DB.write(displayData);        // write data
-           
-            wait(0.0000003);             // 300ns
-            E.write(1);
-            wait(0.0000001);
-            E.write(0);
-        
+        DB.write(displayData);        // write data
+
+        wait(0.0000003);             // 300ns
+        E.write(1);
+        wait(0.0000001);
+        E.write(0);
+
         GotoXY(Coord.x+1, Coord.y-8);
-    }else    {
+    } else    {
 
         // just this code gets executed if the write is on a single page
         if(Inverted)
-            data = ~data;      
+            data = ~data;
         wait(0.0000003);                 // 300nsEN_DELAY();
         DB.write(data);                    // write data
         wait(0.0000003);                 // 300ns
-           E = 1;
-           wait(0.0000001);
+        E = 1;
+        wait(0.0000001);
         E = 0;
-        Coord.x++; 
+        Coord.x++;
     }
 }
 
 
-void KS0108::WriteDataColPag(unsigned int page, unsigned int col,  unsigned int data){
-    
-    SelectSide(NONE);  
+void KS0108::WriteDataColPag(unsigned int page, unsigned int col,  unsigned int data)
+{
+
+    SelectSide(NONE);
     col     = col%SCREEN_WIDTH;
     page    = page%8;
 
-    if(col<(SCREEN_WIDTH/2)){
-    SelectSide(LEFT);           
-    WriteInstruction(LCD_SET_PAGE|page,LEFT);     
-    WriteInstruction(LCD_SET_ADD|col,LEFT);          //set page and column position
-    WriteData(data,LEFT);                            //output data to D0-D7
-    }else{
-    
-    SelectSide(RIGHT);
-    col -= (SCREEN_WIDTH/2);     
-    WriteInstruction(LCD_SET_PAGE|page,RIGHT);     
-    WriteInstruction(LCD_SET_ADD|col,RIGHT);        //set page and column position
-    WriteData(data,RIGHT);                          //output data to D0-D7
-    }    
-                           
+    if(col<(SCREEN_WIDTH/2)) {
+        SelectSide(LEFT);
+        WriteInstruction(LCD_SET_PAGE|page,LEFT);
+        WriteInstruction(LCD_SET_ADD|col,LEFT);          //set page and column position
+        WriteData(data,LEFT);                            //output data to D0-D7
+    } else {
+
+        SelectSide(RIGHT);
+        col -= (SCREEN_WIDTH/2);
+        WriteInstruction(LCD_SET_PAGE|page,RIGHT);
+        WriteInstruction(LCD_SET_ADD|col,RIGHT);        //set page and column position
+        WriteData(data,RIGHT);                          //output data to D0-D7
+    }
+
     SelectSide(NONE);
 }
 
 
 
-unsigned int KS0108::ReadData(){
-   unsigned int data;
-   DB.input();
- 
+unsigned int KS0108::ReadData()
+{
+    unsigned int data;
+    DB.input();
 
-   DI.write(1);     
-   RW.write(1);
+
+    DI.write(1);
+    RW.write(1);
 
-   E.write(1);
-   wait(0.00000045);
-      
-   data = DB.read();
-   wait(0.0000001);
-   E.write(0);   
-   DB.output();
-  
-   return data;     
+    E.write(1);
+    wait(0.00000045);
+
+    data = DB.read();
+    wait(0.0000001);
+    E.write(0);
+    DB.output();
+
+    return data;
 }
 
-unsigned int KS0108::ReadStatus(){
-   unsigned int status;
-   DB.input();
- 
-   DI.write(0);
-   
-   RW.write(1);
-   E.write(1);
-   wait(0.00000045);
-      
-   status = DB.read();
-   E.write(0);
-   wait(0.0000001);
-   DB.output();
-   
-   return status;     
-}                    
+unsigned int KS0108::ReadStatus()
+{
+    unsigned int status;
+    DB.input();
+
+    DI.write(0);
+
+    RW.write(1);
+    E.write(1);
+    wait(0.00000045);
+
+    status = DB.read();
+    E.write(0);
+    wait(0.0000001);
+    DB.output();
+
+    return status;
+}
 
 
 
-void KS0108::SelectSide(unsigned char side){
-    if(side==LEFT)
-        {CS1.write(1);CS2.write(0);}
-    else if(side==RIGHT)
-        {CS1.write(0);CS2.write(1);}
-    else if (side==BOTH)
-        {CS1.write(1);CS2.write(1);}
-    else if (side==NONE)
-        {CS1.write(0);CS2.write(0);}
+void KS0108::SelectSide(unsigned char side)
+{
+    if(side==LEFT) {
+        CS1.write(1);
+        CS2.write(0);
+    } else if(side==RIGHT) {
+        CS1.write(0);
+        CS2.write(1);
+    } else if (side==BOTH) {
+        CS1.write(1);
+        CS2.write(1);
+    } else if (side==NONE) {
+        CS1.write(0);
+        CS2.write(0);
+    }
 }
 
 
-void KS0108::ClearScreen(){
-     for (int col=0;col<128;col++) {
-        for (int page=0;page<8;page++)
-        {
+void KS0108::ClearScreen()
+{
+    for (int col=0; col<128; col++) {
+        for (int page=0; page<8; page++) {
             WriteDataColPag(page,col,WHITE);
         }
     }
-}     
+}
 
 
-void KS0108::TurnOn(){
+void KS0108::TurnOn()
+{
     WriteInstruction(LCD_ON,BOTH);
 }
 
 
-void KS0108::TurnOff(){
+void KS0108::TurnOff()
+{
     WriteInstruction(LCD_OFF,BOTH);
 }
 
 
-/*******************************************************************************************/      
+/*******************************************************************************************/
+
+
+void KS0108::SetPixel(unsigned int x,  unsigned int y,  unsigned int color)
+{
+
+    unsigned int position;
+
+    SelectSide(NONE);
+    WriteInstruction(LCD_SET_ADD,NONE);
 
- 
-void KS0108::SetPixel(unsigned int x,  unsigned int y,  unsigned int color){    
-  
-  unsigned int position;
-   
-  SelectSide(NONE);
-  WriteInstruction(LCD_SET_ADD,NONE);    
-  
-  if(x>=64){           
-  WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
-  WriteInstruction(LCD_SET_ADD|x,RIGHT);
-  position = ReadData();                            //dummy read 
-  position = ReadData();                            //actual read 
-  WriteInstruction(LCD_SET_ADD|x,RIGHT);
-  if(color==WHITE)                                
-  WriteData(position&(~(1<<(y%8))),RIGHT);         // draw a white pixel
-  else                                            
-  WriteData(position|(1<<(y%8)),RIGHT);
-  wait_us(450);
-  }else{ 
-  WriteInstruction(LCD_SET_PAGE|(y/8),LEFT);
-  WriteInstruction(LCD_SET_ADD|x,LEFT);  
-  position = ReadData();                            //dummy read 
-  position = ReadData();                            //actual read 
-  WriteInstruction(LCD_SET_ADD|x,LEFT);
-  if(color==WHITE)                                
-  WriteData(position&(~(1<<(y%8))),LEFT);              
-  else                                            
-  WriteData(position|(1<<(y%8)),LEFT);
-  
-  wait_us(450);
+    if(x>=64) {
+        WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
+        WriteInstruction(LCD_SET_ADD|x,RIGHT);
+        position = ReadData();                            //dummy read
+        position = ReadData();                            //actual read
+        WriteInstruction(LCD_SET_ADD|x,RIGHT);
+        if(color==WHITE)
+            WriteData(position&(~(1<<(y%8))),RIGHT);         // draw a white pixel
+        else
+            WriteData(position|(1<<(y%8)),RIGHT);
+        wait_us(450);
+    } else {
+        WriteInstruction(LCD_SET_PAGE|(y/8),LEFT);
+        WriteInstruction(LCD_SET_ADD|x,LEFT);
+        position = ReadData();                            //dummy read
+        position = ReadData();                            //actual read
+        WriteInstruction(LCD_SET_ADD|x,LEFT);
+        if(color==WHITE)
+            WriteData(position&(~(1<<(y%8))),LEFT);
+        else
+            WriteData(position|(1<<(y%8)),LEFT);
 
-  }
+        wait_us(450);
 
-}       
+    }
+
+}
 
 
 
-void KS0108::FullRectangle(unsigned int Xaxis1, unsigned int Yaxis1, unsigned int Xaxis2 ,unsigned int Yaxis2,unsigned int color){
-           
-    for(unsigned int i=Xaxis1;i<=Xaxis2;i++){
-        for(unsigned int j=Yaxis1;j<=Yaxis2;j++){
+void KS0108::FullRectangle(unsigned int Xaxis1, unsigned int Yaxis1, unsigned int Xaxis2 ,unsigned int Yaxis2,unsigned int color)
+{
+
+    for(unsigned int i=Xaxis1; i<=Xaxis2; i++) {
+        for(unsigned int j=Yaxis1; j<=Yaxis2; j++) {
             SetPixel(i,j,color);
-            
-        } 
-    }   
-}  
+
+        }
+    }
+}
 
 
-void KS0108::EmptyRectangle(unsigned int Xaxis1,unsigned int Yaxis1, unsigned int Xaxis2,unsigned int Yaxis2,unsigned int color){
-      unsigned int CurrentValue;
+void KS0108::EmptyRectangle(unsigned int Xaxis1,unsigned int Yaxis1, unsigned int Xaxis2,unsigned int Yaxis2,unsigned int color)
+{
+    unsigned int CurrentValue;
 
     /* Draw the two horizontal lines */
-      for (CurrentValue = 0; CurrentValue < Xaxis2 - Xaxis1+ 1; CurrentValue++) 
-      {
+    for (CurrentValue = 0; CurrentValue < Xaxis2 - Xaxis1+ 1; CurrentValue++) {
         SetPixel(Xaxis1 + CurrentValue, Yaxis1,color);
         SetPixel(Xaxis1 + CurrentValue, Yaxis2,color);
     }
-      
-      /* draw the two vertical lines */
-      for (CurrentValue = 0; CurrentValue < Yaxis2 - Yaxis1 + 1; CurrentValue++)    
-      {
+
+    /* draw the two vertical lines */
+    for (CurrentValue = 0; CurrentValue < Yaxis2 - Yaxis1 + 1; CurrentValue++) {
         SetPixel(Xaxis1, Yaxis1 + CurrentValue,color);
         SetPixel(Xaxis2, Yaxis1 + CurrentValue,color);
     }
 }
 
 
-void KS0108::RoundRectangle(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int radius, unsigned int color) {
-      int tSwitch, x1 = 0, y1 = radius;
-      tSwitch = 3 - 2 * radius;
-    
+void KS0108::RoundRectangle(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int radius, unsigned int color)
+{
+    int tSwitch, x1 = 0, y1 = radius;
+    tSwitch = 3 - 2 * radius;
+
     while (x1 <= y1) {
         SetPixel(x+radius - x1, y+radius - y1, color);
         SetPixel(x+radius - y1, y+radius - x1, color);
 
         SetPixel(x+width-radius + x1, y+radius - y1, color);
         SetPixel(x+width-radius + y1, y+radius - x1, color);
-        
+
         SetPixel(x+width-radius + x1, y+height-radius + y1, color);
         SetPixel(x+width-radius + y1, y+height-radius + x1, color);
 
@@ -348,7 +359,7 @@
         }
         x1++;
     }
-          
+
     HLineShort(x+radius,y, width-(2*radius), color);                // top
     HLineShort(x+radius,y+height, width-(2*radius),  color);        // bottom
     VLineShort(x,y+radius,height-(2*radius), color);                // left
@@ -356,62 +367,69 @@
 }
 
 
-void KS0108::HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color){
+void KS0108::HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color)
+{
     FullRectangle(Xaxis1,Yaxis,Xaxis2,Yaxis,color);
 
 }
 
 
-void KS0108::HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color){
+void KS0108::HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color)
+{
     FullRectangle(Xaxis,Yaxis,Xaxis+width,Yaxis,color);
 
-} 
-
-
-void KS0108::VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color){
-    FullRectangle(Xaxis,Yaxis1,Xaxis,Yaxis2,color);    
 }
 
 
-void KS0108::VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color){
+void KS0108::VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color)
+{
+    FullRectangle(Xaxis,Yaxis1,Xaxis,Yaxis2,color);
+}
+
+
+void KS0108::VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color)
+{
     FullRectangle(Xaxis,Yaxis,Xaxis,Yaxis+height,color);
 
 }
 
 
-void KS0108::DegreeLine(unsigned int x, int y,unsigned int degree,unsigned int inner_radius,unsigned int outer_radius, unsigned int color){
-  int fx,fy,tx,ty;
-  fx = x + dfloor(inner_radius * sin(degree * 3.14 / 180));
-  fy = y - dfloor(inner_radius * cos(degree * 3.14 / 180));
-  tx = x + dfloor(outer_radius * sin(degree * 3.14 / 180));
-  ty = y - dfloor(outer_radius * cos(degree * 3.14 / 180));
-  SlantyLine(fx,fy,tx,ty,color);
+void KS0108::DegreeLine(unsigned int x, int y,unsigned int degree,unsigned int inner_radius,unsigned int outer_radius, unsigned int color)
+{
+    int fx,fy,tx,ty;
+    fx = x + dfloor(inner_radius * sin(degree * 3.14 / 180));
+    fy = y - dfloor(inner_radius * cos(degree * 3.14 / 180));
+    tx = x + dfloor(outer_radius * sin(degree * 3.14 / 180));
+    ty = y - dfloor(outer_radius * cos(degree * 3.14 / 180));
+    SlantyLine(fx,fy,tx,ty,color);
 }
 
 
-double KS0108::dfloor( double value ) {
-  
-  if (value < 0.0)
-    return ceil( value );
-  else
-    return floor( value );
-    
+double KS0108::dfloor( double value )
+{
+
+    if (value < 0.0)
+        return ceil( value );
+    else
+        return floor( value );
+
 }
 
 
-void KS0108::SlantyLine(unsigned int lX1, unsigned int lY1, unsigned int lX2,unsigned int lY2,unsigned int color){
-    long lError, lDeltaX, lDeltaY, lYStep, bSteep;       
-    
+void KS0108::SlantyLine(unsigned int lX1, unsigned int lY1, unsigned int lX2,unsigned int lY2,unsigned int color)
+{
+    long lError, lDeltaX, lDeltaY, lYStep, bSteep;
+
     // A steep line has a bigger ordinate.
-    
-    if(((lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2)) > ((lX2 > lX1) ? (lX2 - lX1) : (lX1 - lX2))){
+
+    if(((lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2)) > ((lX2 > lX1) ? (lX2 - lX1) : (lX1 - lX2))) {
         bSteep = 1;
-    }else {
+    } else {
         bSteep = 0;
     }
-        
+
     // If line is steep, swap the X and Y coordinates.
-    if(bSteep){
+    if(bSteep) {
         lError = lX1;
         lX1 = lY1;
         lY1 = lError;
@@ -420,10 +438,10 @@
         lY2 = lError;
     }
 
-   
+
     // If the starting X coordinate is larger than the ending X coordinate,
     // swap coordinates.
-    if(lX1 > lX2){
+    if(lX1 > lX2) {
         lError = lX1;
         lX1 = lX2;
         lX2 = lError;
@@ -431,41 +449,40 @@
         lY1 = lY2;
         lY2 = lError;
     }
-        
-    // Compute the difference between the start and end coordinates.      
+
+    // Compute the difference between the start and end coordinates.
     lDeltaX = lX2 - lX1;
     lDeltaY = (lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2);
-                                                                   
+
     lError = -lDeltaX / 2;          // Initialize the error term to negative half the X delta.
-     
-    if(lY1 < lY2){                   // Determine the direction to step in the Y axis when required.
+
+    if(lY1 < lY2) {                  // Determine the direction to step in the Y axis when required.
         lYStep = 1;
-    }else{
+    } else {
         lYStep = -1;
     }
-        
-    for(; lX1 <= lX2; lX1++){    // Loop through all the points along the X axis of the line.
-        
+
+    for(; lX1 <= lX2; lX1++) {   // Loop through all the points along the X axis of the line.
+
         // See if this is a steep line.
-        
-        if(bSteep){
-            
+
+        if(bSteep) {
+
             // Plot this point of the line, swapping the X and Y coordinates.
-            
+
             SetPixel(lY1, lX1,color);
+        } else {         // Plot this point of the line, using the coordinates as is.
+            SetPixel(lX1, lY1,color);
         }
-        else {           // Plot this point of the line, using the coordinates as is.            
-            SetPixel(lX1, lY1,color);
-        }                     
-        
+
         // Increment the error term by the Y delta.
-        
-        lError += lDeltaY; 
-                    
-        if(lError > 0){                // See if the error term is now greater than zero.
-                     
+
+        lError += lDeltaY;
+
+        if(lError > 0) {               // See if the error term is now greater than zero.
+
             lY1 += lYStep;            // Take a step in the Y axis.
-                                                                       
+
             lError -= lDeltaX;         // Decrement the error term by the X delta.
         }
     }
@@ -473,32 +490,35 @@
 
 
 
-void KS0108::Line(unsigned int x1, unsigned int  y1, unsigned int  x2, unsigned int  y2, unsigned int color){
-unsigned int  deltax, deltay, x,y, steep;
-int lerror, ystep;
+void KS0108::Line(unsigned int x1, unsigned int  y1, unsigned int  x2, unsigned int  y2, unsigned int color)
+{
+    unsigned int  deltax, deltay, x,y, steep;
+    int lerror, ystep;
 
     steep = absDiff(y1,y2) > absDiff(x1,x2);   //check slope
 
-    if ( steep ){
+    if ( steep ) {
         swap(x1, y1);
         swap(x2, y2);
     }
 
-    if (x1 > x2){
+    if (x1 > x2) {
         swap(x1, x2);
         swap(y1, y2);
     }
 
     deltax = x2 - x1;
-    deltay = absDiff(y2,y1);  
+    deltay = absDiff(y2,y1);
     lerror = deltax / 2;
     y = y1;
-    if(y1 < y2) ystep = 1;  else ystep = -1;
+    if(y1 < y2) ystep = 1;
+    else ystep = -1;
 
-    for(x = x1; x <= x2; x++){
-        if (steep) SetPixel(y,x, color); else SetPixel(x,y, color);
-           lerror -= deltay;
-        if (lerror < 0){
+    for(x = x1; x <= x2; x++) {
+        if (steep) SetPixel(y,x, color);
+        else SetPixel(x,y, color);
+        lerror -= deltay;
+        if (lerror < 0) {
             y = y + ystep;
             lerror += deltax;
         }
@@ -506,60 +526,61 @@
 }
 
 
-void KS0108::EmptyCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color){
-  unsigned int y=0, x=0, d = 0;
-  int part; 
-  d = CenterY - CenterX;
-  y = Radius;
-  part = 3 - 2 * Radius;
+void KS0108::EmptyCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color)
+{
+    unsigned int y=0, x=0, d = 0;
+    int part;
+    d = CenterY - CenterX;
+    y = Radius;
+    part = 3 - 2 * Radius;
 
-  while (x <= y) { 
-    SetPixel(CenterX + x, CenterY + y,color);  
-    SetPixel(CenterX + x, CenterY - y,color);
-    SetPixel(CenterX - x, CenterY + y,color);    
-    SetPixel(CenterX - x, CenterY - y,color);
-    SetPixel(CenterY + y - d, CenterY + x,color); 
-    SetPixel(CenterY + y - d, CenterY - x,color);
-    SetPixel(CenterY - y - d, CenterY + x,color);
-    SetPixel(CenterY - y - d, CenterY - x,color); 
+    while (x <= y) {
+        SetPixel(CenterX + x, CenterY + y,color);
+        SetPixel(CenterX + x, CenterY - y,color);
+        SetPixel(CenterX - x, CenterY + y,color);
+        SetPixel(CenterX - x, CenterY - y,color);
+        SetPixel(CenterY + y - d, CenterY + x,color);
+        SetPixel(CenterY + y - d, CenterY - x,color);
+        SetPixel(CenterY - y - d, CenterY + x,color);
+        SetPixel(CenterY - y - d, CenterY - x,color);
 
-    if (part < 0) part += (4 * x + 6);
-    else {
-      part += (4 * (x - y) + 10);
-      y--;
+        if (part < 0) part += (4 * x + 6);
+        else {
+            part += (4 * (x - y) + 10);
+            y--;
+        }
+        x++;
     }
-    x++;
-  }
+
+}
 
-}  
 
- 
-void KS0108::FullCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color){  
+void KS0108::FullCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color)
+{
 
-int f = 1 - Radius;
-int ddF_x = 1;
-int ddF_y = 2 * Radius;             //changed sign of -2
-unsigned int x = 0;
-unsigned int y = Radius;      
-    
-     //Fill in the center between the two halves
-     
+    int f = 1 - Radius;
+    int ddF_x = 1;
+    int ddF_y = 2 * Radius;             //changed sign of -2
+    unsigned int x = 0;
+    unsigned int y = Radius;
+
+    //Fill in the center between the two halves
+
     Line(CenterX, CenterY-Radius, CenterX, CenterY+Radius, color);
- 
-    while(x < y){
-        if(f >= 0)
-        {
+
+    while(x < y) {
+        if(f >= 0) {
             y--;
             ddF_y += 2;
             f += ddF_y;
         }
         x++;
         ddF_x += 2;
-        f += ddF_x;    
+        f += ddF_x;
 
         /*
          * Now draw vertical lines between the points on the circle rather than
-         * draw the points of the circle. This draws lines between the 
+         * draw the points of the circle. This draws lines between the
          * perimeter points on the upper and lower quadrants of the 2 halves of the circle.
          */
 
@@ -567,88 +588,90 @@
         Line(CenterX-x, CenterY+y, CenterX-x, CenterY-y, color);
         Line(CenterX+y, CenterY+x, y+CenterX, CenterY-x, color);
         Line(CenterX-y, CenterY+x, CenterX-y, CenterY-x, color);
-      }
-}                 
+    }
+}
 
 
 
-void KS0108::PlotEllipse(long CX, long  CY, long XRadius,long YRadius, int color) {
+void KS0108::PlotEllipse(long CX, long  CY, long XRadius,long YRadius, int color)
+{
 
 
-  long X, Y;
-  long XChange, YChange;
-  long EllipseError;
-  long TwoASquare,TwoBSquare;
-  long StoppingX, StoppingY;
-  TwoASquare = 2*XRadius*XRadius;
-  TwoBSquare = 2*YRadius*YRadius;
-  X = XRadius;
-  Y = 0;
-  XChange = YRadius*YRadius*(1-2*XRadius);
-  YChange = XRadius*XRadius;
-  EllipseError = 0;
-  StoppingX = TwoBSquare*XRadius;
-  StoppingY = 0;
+    long X, Y;
+    long XChange, YChange;
+    long EllipseError;
+    long TwoASquare,TwoBSquare;
+    long StoppingX, StoppingY;
+    TwoASquare = 2*XRadius*XRadius;
+    TwoBSquare = 2*YRadius*YRadius;
+    X = XRadius;
+    Y = 0;
+    XChange = YRadius*YRadius*(1-2*XRadius);
+    YChange = XRadius*XRadius;
+    EllipseError = 0;
+    StoppingX = TwoBSquare*XRadius;
+    StoppingY = 0;
 
-  while ( StoppingX >=StoppingY )                 //first set of points,y'>-1
-  {
-    Plot4EllipsePoints(CX,CY,X,Y,color);
-    Y++;
-    StoppingY=StoppingY+ TwoASquare;
-    EllipseError = EllipseError+ YChange;
-    YChange=YChange+TwoASquare;
-    if ((2*EllipseError + XChange) > 0 ) {
-      X--;
-      StoppingX=StoppingX- TwoBSquare;
-      EllipseError=EllipseError+ XChange;
-      XChange=XChange+TwoBSquare;
+    while ( StoppingX >=StoppingY ) {               //first set of points,y'>-1
+        Plot4EllipsePoints(CX,CY,X,Y,color);
+        Y++;
+        StoppingY=StoppingY+ TwoASquare;
+        EllipseError = EllipseError+ YChange;
+        YChange=YChange+TwoASquare;
+        if ((2*EllipseError + XChange) > 0 ) {
+            X--;
+            StoppingX=StoppingX- TwoBSquare;
+            EllipseError=EllipseError+ XChange;
+            XChange=XChange+TwoBSquare;
+        }
     }
-  }
 
-  Y = YRadius;
-  X = 0;
-  YChange = XRadius*XRadius*(1-2*YRadius);
-  XChange = YRadius*YRadius;
-  EllipseError = 0;
-  StoppingY = TwoASquare*YRadius;
-  StoppingX = 0;
+    Y = YRadius;
+    X = 0;
+    YChange = XRadius*XRadius*(1-2*YRadius);
+    XChange = YRadius*YRadius;
+    EllipseError = 0;
+    StoppingY = TwoASquare*YRadius;
+    StoppingX = 0;
 
-  while ( StoppingY >=StoppingX )                 //{2nd set of points, y'< -1}
-  {
-    Plot4EllipsePoints(CX,CY,X,Y,color);
-    X++;
-    StoppingX=StoppingX + TwoBSquare;
-    EllipseError=EllipseError+ XChange;
-    XChange=XChange+TwoBSquare;
-    if ((2*EllipseError + YChange) > 0 ) {
-      Y--;
-      StoppingY=StoppingY- TwoASquare;
-      EllipseError=EllipseError+ YChange;
-      YChange=YChange+TwoASquare;
+    while ( StoppingY >=StoppingX ) {               //{2nd set of points, y'< -1}
+        Plot4EllipsePoints(CX,CY,X,Y,color);
+        X++;
+        StoppingX=StoppingX + TwoBSquare;
+        EllipseError=EllipseError+ XChange;
+        XChange=XChange+TwoBSquare;
+        if ((2*EllipseError + YChange) > 0 ) {
+            Y--;
+            StoppingY=StoppingY- TwoASquare;
+            EllipseError=EllipseError+ YChange;
+            YChange=YChange+TwoASquare;
+        }
     }
-  }
-} 
+}
 
 
 
-void KS0108::Plot4EllipsePoints(long CX,long  CY, long X, long Y, int color){
-  SetPixel(CX+X, CY+Y, color); //{point in quadrant 1}
-  SetPixel(CX-X, CY+Y, color); //{point in quadrant 2}
-  SetPixel(CX-X, CY-Y, color); //{point in quadrant 3}
-  SetPixel(CX+X, CY-Y, color); //{point in quadrant 4}
-}                                                        
+void KS0108::Plot4EllipsePoints(long CX,long  CY, long X, long Y, int color)
+{
+    SetPixel(CX+X, CY+Y, color); //{point in quadrant 1}
+    SetPixel(CX-X, CY+Y, color); //{point in quadrant 2}
+    SetPixel(CX-X, CY-Y, color); //{point in quadrant 3}
+    SetPixel(CX+X, CY-Y, color); //{point in quadrant 4}
+}
 
 
-void KS0108::RightTriangle ( int topx, int topy, int rightx, int righty) {
+void KS0108::RightTriangle ( int topx, int topy, int rightx, int righty)
+{
 
     //draw rectangle one line at a time
     Line( topx,topy, rightx,righty,BLACK );        //draw hypotenuse
     Line ( topx,righty,topx,topy,BLACK);         //draw perpendicular
     Line (topx,righty, rightx,righty,BLACK);      // draw base
-    
+
 }
 
-void KS0108::Triangle ( int topx, int topy, int rightx, int righty) {
+void KS0108::Triangle ( int topx, int topy, int rightx, int righty)
+{
     int base =0;
     base = 2* rightx-topx;
     //draw rectangle one line at a time
@@ -656,7 +679,7 @@
     Line ( topx,righty,topx,topy,BLACK);                     //draw perpendicular
     Line(topx-base/2,righty, rightx,righty,BLACK);         // draw base
     Line(topx-base/2, righty, topx,topy,BLACK);            // draw hypotenuse
-    
+
 }
 
 
@@ -665,71 +688,75 @@
 /***********************************************************************************/
 
 
-void KS0108::FullScreenBMP (unsigned char *PictureData){
+void KS0108::FullScreenBMP (unsigned char *PictureData)
+{
     unsigned int Page=0;
-      unsigned int Column=0;
-      
-    // Draw left side of the picture 
+    unsigned int Column=0;
+
+    // Draw left side of the picture
     SelectSide(LEFT);
-      for (Page = 0; Page < 8; Page++){                     /* loop on the 8 pages */            
-              WriteInstruction(LCD_SET_PAGE | Page,LEFT); /* Set the page */
-              for (Column = 0; Column < 64; Column++)
+    for (Page = 0; Page < 8; Page++) {                    /* loop on the 8 pages */
+        WriteInstruction(LCD_SET_PAGE | Page,LEFT); /* Set the page */
+        for (Column = 0; Column < 64; Column++)
             WriteData(PictureData[(128*Page)+Column],LEFT);
     }
-    
+
     // Draw right side of the picture
     SelectSide(RIGHT);
-      for (Page = 0; Page < 8; Page++){                     /* loop on the 8 pages */
-    
-              WriteInstruction(LCD_SET_PAGE| Page,RIGHT); /* Set the page */
-              for (Column = 64; Column < 128; Column++)
+    for (Page = 0; Page < 8; Page++) {                    /* loop on the 8 pages */
+
+        WriteInstruction(LCD_SET_PAGE| Page,RIGHT); /* Set the page */
+        for (Column = 64; Column < 128; Column++)
             WriteData(PictureData[(128*Page)+Column],RIGHT);
-    }    
+    }
 }
 
-unsigned int KS0108::ReadArrayData(const unsigned int* ptr) { 
+unsigned int KS0108::ReadArrayData(const unsigned int* ptr)
+{
     return (*ptr);
 }
 
-void KS0108::DrawBitmap(const unsigned int * bitmap, unsigned int x, unsigned int y, unsigned int color){
-unsigned int width, height;
-unsigned int i, j;
+void KS0108::DrawBitmap(const unsigned int * bitmap, unsigned int x, unsigned int y, unsigned int color)
+{
+    unsigned int width, height;
+    unsigned int i, j;
 
-  width = ReadArrayData(bitmap++); 
-  height = ReadArrayData(bitmap++);
-  for(j = 0; j < height / 8; j++) {
-     GotoXY(x, y + (j*8) );
-     for(i = 0; i < width; i++) {
-         unsigned int displayData = ReadArrayData(bitmap++);
+    width = ReadArrayData(bitmap++);
+    height = ReadArrayData(bitmap++);
+    for(j = 0; j < height / 8; j++) {
+        GotoXY(x, y + (j*8) );
+        for(i = 0; i < width; i++) {
+            unsigned int displayData = ReadArrayData(bitmap++);
             if(color == BLACK)
-            WriteData(displayData);
-         else
-            WriteData(~displayData);
-     }
-  }
-}  
+                WriteData(displayData);
+            else
+                WriteData(~displayData);
+        }
+    }
+}
 /******************************************************************************************/
 
 
-void KS0108::GotoXY(unsigned int x, unsigned int y) {
-  unsigned int chip, cmd;
-    
-  if( (x > SCREEN_WIDTH-1) || (y > SCREEN_HEIGHT-1) )    // exit if coordinates are not legal
-    return;
-  Coord.x = x;                                    // save new coordinates
-  Coord.y = y;
-    
-  if(y/8 != Coord.page) {
-      Coord.page = y/8;
-    cmd = LCD_SET_PAGE | Coord.page;            // set y address on all chips    
-    for(chip=0; chip < 2; chip++){
-       WriteInstruction(cmd, chip);    
+void KS0108::GotoXY(unsigned int x, unsigned int y)
+{
+    unsigned int chip, cmd;
+
+    if( (x > SCREEN_WIDTH-1) || (y > SCREEN_HEIGHT-1) )    // exit if coordinates are not legal
+        return;
+    Coord.x = x;                                    // save new coordinates
+    Coord.y = y;
+
+    if(y/8 != Coord.page) {
+        Coord.page = y/8;
+        cmd = LCD_SET_PAGE | Coord.page;            // set y address on all chips
+        for(chip=0; chip < 2; chip++) {
+            WriteInstruction(cmd, chip);
+        }
     }
-  }
-  chip = Coord.x/64; //select chip
-  x = x % 64; // valeur de X quelque soit le CS affich&#65533;
-  cmd = LCD_SET_ADD | x;
-  WriteInstruction(cmd, chip);                    // set x address on active chip        
+    chip = Coord.x/64; //select chip
+    x = x % 64; // valeur de X quelque soit le CS affich&#65533;
+    cmd = LCD_SET_ADD | x;
+    WriteInstruction(cmd, chip);                    // set x address on active chip
 
 }
 
@@ -738,55 +765,61 @@
 
 
 
-void KS0108::Putchar (int page, int col,unsigned char c) {
-    if (c>31 && c<127){
-    for(int i=0;i<5;i++){
-        WriteDataColPag(page,col+i,System5x7[((c-32)*5+i)+6]);
-     }
+void KS0108::Putchar (int page, int col,unsigned char c)
+{
+    if (c>31 && c<127) {
+        for(int i=0; i<5; i++) {
+            WriteDataColPag(page,col+i,System5x7[((c-32)*5+i)+6]);
+        }
     }
 }
 
 
 
-void KS0108::PutString(unsigned int x, unsigned int y,char* str){
+void KS0108::PutString(unsigned int x, unsigned int y,char* str)
+{
 
-    while(*str != 0){
-     Putchar(x,y,*str);
-     str++;
-     y+=System5x7[2];
+    while(*str != 0) {
+        Putchar(x,y,*str);
+        str++;
+        y+=System5x7[2];
     }
 
 }
 
-void KS0108::PrintFloat(float val, unsigned int x,unsigned int y){
-   char buf[20] = {};  // prints up to 20 digits         
-   sprintf(buf,"%f",val);
-   PutString(x,y,buf);
+void KS0108::PrintFloat(float val, unsigned int x,unsigned int y)
+{
+    char buf[20] = {};  // prints up to 20 digits
+    sprintf(buf,"%f",val);
+    PutString(x,y,buf);
 
 }
 
 
-void KS0108::PrintInteger(int val,unsigned int x,unsigned int y){
-   char buf[20] = {};  // prints up to 20 digits         
-   sprintf(buf,"%d",val);
-   PutString(x,y,buf);
+void KS0108::PrintInteger(int val,unsigned int x,unsigned int y)
+{
+    char buf[20] = {};  // prints up to 20 digits
+    sprintf(buf,"%d",val);
+    PutString(x,y,buf);
 }
 
-void KS0108::SelectFont(unsigned int* font,unsigned int color, FontCallback callback) {
+void KS0108::SelectFont(unsigned int* font,unsigned int color, FontCallback callback)
+{
     Font = font;
     FontRead = callback;
     FontColor = color;
 }
 
 
-int KS0108::PrintChar(char c) {
+int KS0108::PrintChar(char c)
+{
     unsigned int width = 0;
     unsigned int height = FontRead(Font+FONT_HEIGHT);
     unsigned int bytes = (height+7)/8;
-    
+
     unsigned int firstChar = FontRead(Font+FONT_FIRST_CHAR);
     unsigned int charCount = FontRead(Font+FONT_CHAR_COUNT);
-        
+
     unsigned int index = 0;
     unsigned int x=Coord.x , y=Coord.y;
 
@@ -796,17 +829,16 @@
     c-= firstChar;
 
     if( FontRead(Font+FONT_LENGTH) == 0 && FontRead(Font+FONT_LENGTH+1) == 0) {
-    // zero length is flag indicating fixed width font (array does not contain width data entries)
-       width = FontRead(Font+FONT_FIXED_WIDTH); 
-       index = c*bytes*width+FONT_WIDTH_TABLE;
-    }
-    else{
-    // variable width font, read width data, to get the index
-       for(unsigned int i=0; i<c; i++) {  
-         index += FontRead(Font+FONT_WIDTH_TABLE+i);
-       }
-       index = index*bytes+charCount+FONT_WIDTH_TABLE;
-       width = FontRead(Font+FONT_WIDTH_TABLE+c);
+        // zero length is flag indicating fixed width font (array does not contain width data entries)
+        width = FontRead(Font+FONT_FIXED_WIDTH);
+        index = c*bytes*width+FONT_WIDTH_TABLE;
+    } else {
+        // variable width font, read width data, to get the index
+        for(unsigned int i=0; i<c; i++) {
+            index += FontRead(Font+FONT_WIDTH_TABLE+i);
+        }
+        index = index*bytes+charCount+FONT_WIDTH_TABLE;
+        width = FontRead(Font+FONT_WIDTH_TABLE+c);
     }
 
     // last but not least, draw the character
@@ -814,26 +846,27 @@
         unsigned int page = i*width;
         for(unsigned int j=0; j<width; j++) {
             unsigned int data = FontRead(Font+index+page+j);
-        
+
             if(height > 8 && height < (i+1)*8) {
                 data >>= (i+1)*8-height;
             }
-            
+
             WriteData(data);
 
         }
         // 1px gap between chars
         WriteData(0x00);
         GotoXY(x,Coord.y+8);
-    
+
     }
     GotoXY(x+width+1, y);
-    
+
 
     return 0;
 }
 
-void KS0108::PrintString(char* str) {
+void KS0108::PrintString(char* str)
+{
     int x = Coord.x;
     while(*str != 0) {
         if(*str == '\n') {
@@ -845,27 +878,46 @@
     }
 }
 
-void KS0108::PrintNumber(long n){
-   char buf[10];  // prints up to 10 digits  
-   char i=0;
-   if(n==0)
-       PrintChar('0');
-   else{
-     if(n < 0){
-        PrintChar('-');
-        n = -n;
-     }
-     while(n>0 && i <= 10){
-       buf[i++] = n % 10;  // n % base
-       n /= 10;   // n/= base
-     }
-     for(; i >0; i--)
-         PrintChar((char) (buf[i-1] < 10 ? '0' + buf[i-1] : 'A' + buf[i-1] - 10));      
-   }
+void KS0108::PrintNumber(long n)
+{
+    char buf[10];  // prints up to 10 digits
+    char i=0;
+    if(n==0)
+        PrintChar('0');
+    else {
+        if(n < 0) {
+            PrintChar('-');
+            n = -n;
+        }
+        while(n>0 && i <= 10) {
+            buf[i++] = n % 10;  // n % base
+            n /= 10;   // n/= base
+        }
+        for(; i >0; i--)
+            PrintChar((char) (buf[i-1] < 10 ? '0' + buf[i-1] : 'A' + buf[i-1] - 10));
+    }
+}
+
+bool KS0108::writeLine (const char *line, uint8_t row)
+{
+//"SystemFont5x7.h"
+// |y   _x
+    int x = Coord.x;
+
+    Font = System5x7;
+    
+    FontColor = BLACK;
+    
+   // LCD.SelectFont(System5x7,BLACK,ReadData);
+    
+    
+    
+    
+    GotoXY(x+10, Coord.y+7);
+    PrintString(const_cast<char *> (line) );
+    return 1;
 }
 
 
 
-            
 
-