Added custom fonts. Added triangle drawing function

Dependents:   sc100016x4lcd REVO_Updated_Steering Driving_game Arkanoid_v1 ... more

Files at this revision

API Documentation at this revision

Comitter:
DimiterK
Date:
Tue Jan 04 18:35:28 2011 +0000
Child:
1:a368f2688222
Commit message:
First release.

Changed in this revision

KS0108.cpp Show annotated file Show diff for this revision Revisions of this file
KS0108.h Show annotated file Show diff for this revision Revisions of this file
SystemFont5x7.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KS0108.cpp	Tue Jan 04 18:35:28 2011 +0000
@@ -0,0 +1,822 @@
+#include "KS0108.h"     
+#include <math.h>
+
+/*Constructor, initializes the lcd on the respective pins.
+ *
+ *@param pins 
+ *@param databus
+ */
+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)
+    : DB(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7),RST (_RST),DI(_DI), RW(_RW), E(_E), CS2(_CS2), CS1(_CS1) {
+   
+    DB.output();      
+    CS1.output(); CS2.output();    
+    RST.write(0);
+    wait_us(10);  
+    RST.write(1);                     //reset screen
+     E.write(0);                       
+    ClearScreen();                     //clear display
+    WriteInstruction(LCD_ON, BOTH);     //turn on lcd       
+}
+
+
+/*Write instruction to the specific controller.
+ *
+ *@param Command command to send
+ *@param side controller side can be LEFT or RIGHT
+ *@return none
+ *
+ */
+void  KS0108::WriteInstruction(unsigned int Command,unsigned int side){
+    E.write(0); 
+    DI.write(0);
+    RW.write(0);
+        
+    SelectSide(side);
+
+    wait(0.0000003); // 300ns
+    E.write(1);
+    DB.output();
+    DB.write(Command);        
+    wait(0.0000001);
+    E.write(0);
+}
+
+/*Write data to the controller. 
+ *
+ *@param data data to send
+ *@param side controller side can be LEFT or RIGHT
+ *
+ *@return none
+ */
+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 = 1;
+    DB.output();
+    DB.write(data);     
+    wait(0.0000001);
+    E = 0;
+}
+
+/*Write data to the screen on specific page and column 
+ *
+ *@param page page varies from0-7 for each side
+ *@param col col varies from 0-64 for each side 
+ *@param data info to be written on given coordinates
+ *@return 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
+    }    
+                           
+    SelectSide(NONE);
+}
+
+/*Read data from diplay
+ *
+ *@param none
+ *@return data
+ *
+ */
+unsigned int KS0108::ReadData(){
+   unsigned int data;
+   DB.input();
+   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;     
+}
+
+/*Read status of display , and check if it's busy
+ *
+ *@param none
+ *@return status status of display
+ * 
+ */
+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;     
+}
+
+/*Read status of display
+ *
+ *@param side controller side can be LEFT or RIGHT
+ *@return none
+ *
+ */
+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);}
+}
+
+/*Clears display
+ *
+ *@param none
+ *@return none
+ *
+ */
+void KS0108::ClearScreen(){
+     for (int col=0;col<128;col++) {
+        for (int page=0;page<8;page++)
+        {
+            WriteDataColPag(page,col,WHITE);
+        }
+    }
+}     
+
+
+/*******************************************************************************************/      
+
+
+/*Set pixel to specific location on the screen.  
+ *@param x page varies from 0-128 
+ *@param y col varies from 0-64 
+ *@param color color of pixel, can be BLACK or WHITE
+ *@return 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);
+
+  }
+
+}       
+
+
+/*Draw a filled reactangle 
+ *
+ *@param Xaxis1 
+ *@param Yaxis1 
+ *@param Xaxis2 
+ *@param Yaxis2 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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);
+        } 
+    }   
+}  
+
+/*Draw an empty rectangle 
+ *@param Xaxis1 
+ *@param Yaxis1 
+ *@param Xaxis2 
+ *@param Yaxis2 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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++) 
+      {
+        SetPixel(Xaxis1 + CurrentValue, Yaxis1,color);
+        SetPixel(Xaxis1 + CurrentValue, Yaxis2,color);
+    }
+      
+      /* draw the two vertical lines */
+      for (CurrentValue = 0; CurrentValue < Yaxis2 - Yaxis1 + 1; CurrentValue++)    
+      {
+        SetPixel(Xaxis1, Yaxis1 + CurrentValue,color);
+        SetPixel(Xaxis2, Yaxis1 + CurrentValue,color);
+    }
+}
+
+/*Draw a rectangle with round corners
+ *@param Xaxis1 
+ *@param Yaxis1 
+ *@param Xaxis2 
+ *@param Yaxis2 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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);
+
+        SetPixel(x+radius - x1, y+height-radius + y1, color);
+        SetPixel(x+radius - y1, y+height-radius + x1, color);
+
+        if (tSwitch < 0) {
+            tSwitch += (4 * x1 + 6);
+        } else {
+            tSwitch += (4 * (x1 - y1) + 10);
+            y1--;
+        }
+        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
+    VLineShort(x+width, y+radius,height-(2*radius),  color);        // right
+}
+
+/*Draw a horizontal line
+ *@param Xaxis1 
+ *@param Xaxis2 
+ *@param Yaxis 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+void KS0108::HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color){
+    FullRectangle(Xaxis1,Yaxis,Xaxis2,Yaxis,color);
+
+}
+
+/*Draw a horizontal line
+ *@param Xaxis1 
+ *@param Xaxis2 
+ *@param Yaxis 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+void KS0108::HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color){
+    FullRectangle(Xaxis,Yaxis,Xaxis+width,Yaxis,color);
+
+} 
+
+/*Draw a horizontal line
+ *@param Xaxis1 
+ *@param Xaxis2 
+ *@param Yaxis 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */ 
+void KS0108::VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color){
+    FullRectangle(Xaxis,Yaxis1,Xaxis,Yaxis2,color);    
+}
+
+/*Draw a horizontal line
+ *@param Xaxis1 
+ *@param Xaxis2 
+ *@param Yaxis 
+ *@param color can be BLACK or WHITE
+ *@return none
+ * 
+ */
+void KS0108::VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color){
+    FullRectangle(Xaxis,Yaxis,Xaxis,Yaxis+height,color);
+
+}
+
+/*
+ *Draws a line from x,y at given degree from inner_radius to outer_radius.
+ *@param Xaxis1 
+ *@param Xaxis2 
+ *@param Yaxis 
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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);
+}
+
+/*
+ *Round a double
+ *@param double 
+ *@return value 
+ *
+ */
+double KS0108::dfloor( double value ) {
+  
+  if (value < 0.0)
+    return ceil( value );
+  else
+    return floor( value );
+    
+}
+
+/*
+ *Draws a line from x,y at given degree from inner_radius to outer_radius.
+ *@param lX1   x coordinate of one side
+ *@param lY1   y coordinate of one side
+ *@param lX2   x coordinate of other side
+ *@param lY2   y coordinate of other side
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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))){
+        bSteep = 1;
+    }else {
+        bSteep = 0;
+    }
+        
+    // If line is steep, swap the X and Y coordinates.
+    if(bSteep){
+        lError = lX1;
+        lX1 = lY1;
+        lY1 = lError;
+        lError = lX2;
+        lX2 = lY2;
+        lY2 = lError;
+    }
+
+   
+    // If the starting X coordinate is larger than the ending X coordinate,
+    // then swap the start and end coordinates.
+    if(lX1 > lX2){
+        lError = lX1;
+        lX1 = lX2;
+        lX2 = lError;
+        lError = lY1;
+        lY1 = lY2;
+        lY2 = lError;
+    }
+        
+    // Compute the difference between the start and end coordinates in each    axis.      
+    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.
+        lYStep = 1;
+    }else{
+        lYStep = -1;
+    }
+        
+    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){
+            
+            // 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);
+        }                     
+        
+        // Increment the error term by the Y delta.
+        
+        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.
+        }
+    }
+}
+
+
+/*
+ *Draws a line from x1,y1 to x2,y2
+ *@param lX1   x coordinate of one side
+ *@param lY1   y coordinate of one side
+ *@param lX2   x coordinate of other side
+ *@param lY2   y coordinate of other side
+ *@param color can be BLACK or WHITE
+ *@return none 
+ *
+ */
+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 ){
+        swap(x1, y1);
+        swap(x2, y2);
+    }
+
+    if (x1 > x2){
+        swap(x1, x2);
+        swap(y1, y2);
+    }
+
+    deltax = x2 - x1;
+    deltay = absDiff(y2,y1);  
+    lerror = deltax / 2;
+    y = y1;
+    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){
+            y = y + ystep;
+            lerror += deltax;
+        }
+    }
+}
+
+/*
+ *Draws an empty circle centered a x,y with radius R and specific color.
+ *@param lX1   x coordinate of one side
+ *@param lY1   y coordinate of one side
+ *@param lX2   x coordinate of other side
+ *@param lY2   y coordinate of other side
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ */
+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); 
+
+    if (part < 0) part += (4 * x + 6);
+    else {
+      part += (4 * (x - y) + 10);
+      y--;
+    }
+    x++;
+  }
+
+}  
+
+/*
+ * Circle fill Code is merely a modification of the midpoint
+ * circle algorithem which is an adaption of Bresenham's line algorithm
+ * http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
+ * http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
+ * Adapted from arduino lib
+ *
+ *@param  CenterX
+ *@param CenterY
+ *@param Radius
+ *@param 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
+     
+    Line(CenterX, CenterY-Radius, CenterX, CenterY+Radius, color);
+ 
+    while(x < y){
+        if(f >= 0)
+        {
+            y--;
+            ddF_y += 2;
+            f += ddF_y;
+        }
+        x++;
+        ddF_x += 2;
+        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 
+         * perimeter points on the upper and lower quadrants of the 2 halves of the circle.
+         */
+
+        Line(CenterX+x, CenterY+y, CenterX+x, CenterY-y, color);
+        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);
+      }
+}                 
+
+
+/*
+ *Draws a line from x,y at given degree from inner_radius to outer_radius.
+ *@param lX1   x coordinate of one side
+ *@param lY1   y coordinate of one side
+ *@param lX2   x coordinate of other side
+ *@param lY2   y coordinate of other side
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ * Ported the algorithm found at http://homepage.smc.edu/kennedy_john/belipse.pdf
+ * 
+ */
+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;
+
+  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;
+
+  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;
+    }
+  }
+} 
+
+
+/*
+ *Helper function for drawing an ellipse.
+ *@param CX   x coordinate of one side
+ *@param CY   y coordinate of one side
+ *@param X   x coordinate of other side
+ *@param Y   y coordinate of other side
+ *@param color can be BLACK or WHITE
+ *@return none
+ *
+ * Portted the algorithm found at http://homepage.smc.edu/kennedy_john/belipse.pdf
+ * 
+ */
+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}
+}
+
+/***********************************************************************************/
+
+/*
+ *Draws an image on screen.
+ *@param PictureData  128x64 image array
+ *@return none
+ *
+ * 
+ */
+void KS0108::FullScreenBMP (unsigned char *PictureData){
+    unsigned int Page=0;
+      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++)
+            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++)
+            WriteData(PictureData[(128*Page)+Column],RIGHT);
+    }    
+}
+
+   
+/******************************************************************************************/
+
+/*
+ *Moves cursor to x,y.
+ *@param x   x coordinate
+ *@param y   y coordinate 
+ *@return none
+ * 
+ */
+void KS0108::CursorXY(unsigned int x, unsigned int y){   
+  if( (x > SCREEN_WIDTH-1) || (y > SCREEN_HEIGHT-1) )    // exit if coordinates are not legal
+    return;  
+
+  if(y<(SCREEN_WIDTH/2)){
+  SelectSide(LEFT);
+  WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
+  WriteInstruction(LCD_SET_ADD|x,RIGHT);
+  }else{ 
+  SelectSide(RIGHT); 
+  WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
+  WriteInstruction(LCD_SET_ADD|x,RIGHT); 
+  }     
+}
+
+/*
+ *Print a char on the specified coordinates
+ *@param page   row coordinate 
+ *@param col   y coordinate 
+ *@param c   character from systemfont
+ *@return none
+ *
+ * 
+ */ 
+void KS0108::Putc (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]);
+     }
+    }
+}
+
+
+/*
+ *Print a string on the specified coordinates.
+ *@param x   row coordinate 
+ *@param y   y coordinate 
+ *@param str   character string 
+ *@return none
+ *
+ * 
+ */
+void KS0108::PutString(unsigned int x, unsigned int y,char* str){
+
+    while(*str != 0){
+     Putc(x,y,*str);
+     str++;
+     y+=System5x7[2];
+    }
+
+}
+
+
+
+/*
+ *Print a float on the specified coordiantes.
+ *@param val float number
+ *@param x  row coordinate
+ *@param y  y coordinate
+ *@return none
+ *
+ * 
+ */
+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);
+
+}
+
+/*
+ *Print an integer on th specified coordinates.
+ *@param val integer number
+ *@param x row coordinate
+ *@param y column coordinate 
+ *@return none
+ * 
+ */
+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);
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KS0108.h	Tue Jan 04 18:35:28 2011 +0000
@@ -0,0 +1,141 @@
+#ifndef KS0108_H
+#define KS0108_H
+
+#define VERSION 1
+
+#include "mbed.h"
+#include "SystemFont5x7.h"	
+
+/************************************************************************************/
+// Commands
+#define LCD_ON				0x3F
+#define LCD_OFF				0x3E
+#define LCD_SET_ADD			0x40
+#define LCD_SET_PAGE		0xB8
+#define LCD_DISP_START		0xC0
+
+//Controller directives
+#define LEFT				1
+#define RIGHT				2
+#define BOTH				3
+#define NONE				4
+
+// Colors
+#define BLACK				0xFF
+#define WHITE				0x00
+
+//Screen dimensions
+#define SCREEN_HEIGHT	64
+#define SCREEN_WIDTH	128	  
+
+/***********************************************************************************/
+
+#define absDiff(x,y) ((x>y) ?  (x-y) : (y-x))
+#define swap(a,b) \
+do\
+{\
+uint8_t t;\
+	t=a;\
+	a=b;\
+	b=t;\
+} while(0)
+
+/**************************************************************************************/
+
+#define MAX_IMG_SIZE 128*64
+
+typedef struct {	  
+	unsigned char imgarray[MAX_IMG_SIZE];
+ 	unsigned int imgWidth;
+	unsigned int imgHeight;
+}Image;
+
+/**************************************************************************************/
+
+// Font Indices
+#define FONT_LENGTH			0
+#define FONT_FIXED_WIDTH	2
+#define FONT_HEIGHT			3
+#define FONT_FIRST_CHAR		4
+#define FONT_CHAR_COUNT		5
+#define FONT_WIDTH_TABLE	6
+
+
+typedef struct {
+	unsigned int x;
+	unsigned int y;
+	unsigned int page;
+} LCDCoord;
+
+
+/****************************************************************************************/
+
+
+class KS0108  {
+    public:
+        // Constructor:
+		KS0108 (PinName _RST,PinName _DI, PinName _RW, PinName _E, PinName _CS1, PinName _CS2, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7);
+   		
+		void  WriteInstruction(unsigned int Command,unsigned int side);
+		void  WriteData(unsigned int data ,unsigned char side);		
+		void  WriteDataColPag(unsigned int page, unsigned int col,  unsigned int data);
+		unsigned int ReadData();
+		unsigned int ReadStatus();
+		void SelectSide(unsigned char side);		
+		void ClearScreen();							
+
+		//Graphic functions
+		void SetPixel( unsigned int x,  unsigned int y,  unsigned int color);										
+
+		void HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color); 
+		void HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color);	 		
+		void VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color);
+		void VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color);		
+		void Line(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2, unsigned int color);		
+		void SlantyLine(unsigned int lX1, unsigned int lY1, unsigned int lX2,unsigned int lY2,unsigned int color);	
+		void DegreeLine(unsigned int x, int y,unsigned int degree,unsigned int inner_radius,unsigned int outer_radius, unsigned int color);
+
+
+		void FullRectangle(unsigned int Xaxis1, unsigned int Yaxis1, unsigned int Xaxis2 ,unsigned int Yaxis2,unsigned int color);	
+		void EmptyRectangle(unsigned int Xaxis1,unsigned int Yaxis1, unsigned int Xaxis2,unsigned int Yaxis2,unsigned int color);
+		void RoundRectangle(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int radius, unsigned int color);
+		
+																												
+		void EmptyCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color);  
+		void FullCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color);		
+		void PlotEllipse(long CX, long  CY, long XRadius,long YRadius, int color); 		
+		void Plot4EllipsePoints(long CX,long  CY, long X, long Y, int color);  		
+		  
+		void FullScreenBMP (unsigned char *PictureData);
+				
+		double dfloor( double value ); 	   		
+		
+						
+		// Font Functions 		
+		void Putc (int page, int col,unsigned char c);				  		
+		void PutString(unsigned int x, unsigned int y,char* str);	
+		void PrintFloat(float val, unsigned int x,unsigned int y);
+		void PrintInteger(int val,unsigned int x,unsigned int y); 
+
+		void CursorXY( unsigned int x, unsigned int y);	
+			
+					
+		  
+    private:
+        BusInOut DB;
+		DigitalOut RST;
+        DigitalOut DI;
+        DigitalOut RW;
+        DigitalOut E;
+		DigitalInOut CS2;
+        DigitalInOut CS1; 
+
+		unsigned int color; 		
+	
+		unsigned int			FontColor;
+		unsigned int*			Font;      
+		LCDCoord				Coord;
+};
+	
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SystemFont5x7.h	Tue Jan 04 18:35:28 2011 +0000
@@ -0,0 +1,147 @@
+/*
+ *
+ * System5x7
+ *
+ *
+ * File Name           : System5x7.h
+ * Date                : 28 Oct 2008
+ * Font size in bytes  : 470
+ * Font width          : 5
+ * Font height         : 7
+ * Font first char     : 32
+ * Font last char      : 127
+ * Font used chars     : 94
+ *
+ * The font data are defined as
+ *
+ * struct _FONT_ {
+ *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
+ *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
+ *     uint8_t    font_Height_in_Pixel_for_all_characters;
+ *     unit8_t    font_First_Char;
+ *     uint8_t    font_Char_Count;
+ *
+ *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
+ *                  // for each character the separate width in pixels,
+ *                  // characters < 128 have an implicit virtual right empty row
+ *
+ *     uint8_t    font_data[];
+ *                  // bit field of all characters
+ */
+
+#ifndef SYSTEM5x7_H
+#define SYSTEM5x7_H
+
+#define SYSTEM5x7_WIDTH 5
+#define SYSTEM5x7_HEIGHT 7
+
+static unsigned int System5x7[]  = {
+    0x0, 0x0, 	// size of zero indicates fixed width font, actual length is width * height
+    0x05, 		// width
+    0x07, 		// height
+    0x20, 		// first char
+    0x7f, 		// char count
+    
+    // Fixed width; char width table not used !!!!
+    
+    // font data
+    0x00, 0x00, 0x00, 0x00, 0x00,// (space)
+	0x00, 0x00, 0x5F, 0x00, 0x00,// !
+	0x00, 0x07, 0x00, 0x07, 0x00,// "
+	0x14, 0x7F, 0x14, 0x7F, 0x14,// #
+	0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
+	0x23, 0x13, 0x08, 0x64, 0x62,// %
+	0x36, 0x49, 0x55, 0x22, 0x50,// &
+	0x00, 0x05, 0x03, 0x00, 0x00,// '
+	0x00, 0x1C, 0x22, 0x41, 0x00,// (
+	0x00, 0x41, 0x22, 0x1C, 0x00,// )
+	0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
+	0x08, 0x08, 0x3E, 0x08, 0x08,// +
+	0x00, 0x50, 0x30, 0x00, 0x00,// ,
+	0x08, 0x08, 0x08, 0x08, 0x08,// -
+	0x00, 0x60, 0x60, 0x00, 0x00,// .
+	0x20, 0x10, 0x08, 0x04, 0x02,// /
+	0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
+	0x00, 0x42, 0x7F, 0x40, 0x00,// 1
+	0x42, 0x61, 0x51, 0x49, 0x46,// 2
+	0x21, 0x41, 0x45, 0x4B, 0x31,// 3
+	0x18, 0x14, 0x12, 0x7F, 0x10,// 4
+	0x27, 0x45, 0x45, 0x45, 0x39,// 5
+	0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
+	0x01, 0x71, 0x09, 0x05, 0x03,// 7
+	0x36, 0x49, 0x49, 0x49, 0x36,// 8
+	0x06, 0x49, 0x49, 0x29, 0x1E,// 9
+	0x00, 0x36, 0x36, 0x00, 0x00,// :
+	0x00, 0x56, 0x36, 0x00, 0x00,// ;
+	0x00, 0x08, 0x14, 0x22, 0x41,// <
+	0x14, 0x14, 0x14, 0x14, 0x14,// =
+	0x41, 0x22, 0x14, 0x08, 0x00,// >
+	0x02, 0x01, 0x51, 0x09, 0x06,// ?
+	0x32, 0x49, 0x79, 0x41, 0x3E,// @
+	0x7E, 0x11, 0x11, 0x11, 0x7E,// A
+	0x7F, 0x49, 0x49, 0x49, 0x36,// B
+	0x3E, 0x41, 0x41, 0x41, 0x22,// C
+	0x7F, 0x41, 0x41, 0x22, 0x1C,// D
+	0x7F, 0x49, 0x49, 0x49, 0x41,// E
+	0x7F, 0x09, 0x09, 0x01, 0x01,// F
+	0x3E, 0x41, 0x41, 0x51, 0x32,// G
+	0x7F, 0x08, 0x08, 0x08, 0x7F,// H
+	0x00, 0x41, 0x7F, 0x41, 0x00,// I
+	0x20, 0x40, 0x41, 0x3F, 0x01,// J
+	0x7F, 0x08, 0x14, 0x22, 0x41,// K
+	0x7F, 0x40, 0x40, 0x40, 0x40,// L
+	0x7F, 0x02, 0x04, 0x02, 0x7F,// M
+	0x7F, 0x04, 0x08, 0x10, 0x7F,// N
+	0x3E, 0x41, 0x41, 0x41, 0x3E,// O
+	0x7F, 0x09, 0x09, 0x09, 0x06,// P
+	0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
+	0x7F, 0x09, 0x19, 0x29, 0x46,// R
+	0x46, 0x49, 0x49, 0x49, 0x31,// S
+	0x01, 0x01, 0x7F, 0x01, 0x01,// T
+	0x3F, 0x40, 0x40, 0x40, 0x3F,// U
+	0x1F, 0x20, 0x40, 0x20, 0x1F,// V
+	0x7F, 0x20, 0x18, 0x20, 0x7F,// W
+	0x63, 0x14, 0x08, 0x14, 0x63,// X
+	0x03, 0x04, 0x78, 0x04, 0x03,// Y
+	0x61, 0x51, 0x49, 0x45, 0x43,// Z
+	0x00, 0x00, 0x7F, 0x41, 0x41,// [
+	0x02, 0x04, 0x08, 0x10, 0x20,// "\"
+	0x41, 0x41, 0x7F, 0x00, 0x00,// ]
+	0x04, 0x02, 0x01, 0x02, 0x04,// ^
+	0x40, 0x40, 0x40, 0x40, 0x40,// _
+	0x00, 0x01, 0x02, 0x04, 0x00,// `
+	0x20, 0x54, 0x54, 0x54, 0x78,// a
+	0x7F, 0x48, 0x44, 0x44, 0x38,// b
+	0x38, 0x44, 0x44, 0x44, 0x20,// c
+	0x38, 0x44, 0x44, 0x48, 0x7F,// d
+	0x38, 0x54, 0x54, 0x54, 0x18,// e
+	0x08, 0x7E, 0x09, 0x01, 0x02,// f
+	0x08, 0x14, 0x54, 0x54, 0x3C,// g
+	0x7F, 0x08, 0x04, 0x04, 0x78,// h
+	0x00, 0x44, 0x7D, 0x40, 0x00,// i
+	0x20, 0x40, 0x44, 0x3D, 0x00,// j
+	0x00, 0x7F, 0x10, 0x28, 0x44,// k
+	0x00, 0x41, 0x7F, 0x40, 0x00,// l
+	0x7C, 0x04, 0x18, 0x04, 0x78,// m
+	0x7C, 0x08, 0x04, 0x04, 0x78,// n
+	0x38, 0x44, 0x44, 0x44, 0x38,// o
+	0x7C, 0x14, 0x14, 0x14, 0x08,// p
+	0x08, 0x14, 0x14, 0x18, 0x7C,// q
+	0x7C, 0x08, 0x04, 0x04, 0x08,// r
+	0x48, 0x54, 0x54, 0x54, 0x20,// s
+	0x04, 0x3F, 0x44, 0x40, 0x20,// t
+	0x3C, 0x40, 0x40, 0x20, 0x7C,// u
+	0x1C, 0x20, 0x40, 0x20, 0x1C,// v
+	0x3C, 0x40, 0x30, 0x40, 0x3C,// w
+	0x44, 0x28, 0x10, 0x28, 0x44,// x
+	0x0C, 0x50, 0x50, 0x50, 0x3C,// y
+	0x44, 0x64, 0x54, 0x4C, 0x44,// z
+	0x00, 0x08, 0x36, 0x41, 0x00,// {
+	0x00, 0x00, 0x7F, 0x00, 0x00,// |
+	0x00, 0x41, 0x36, 0x08, 0x00,// }
+	0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
+	0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
+    
+};
+
+#endif