1

Dependents:   Program_R11

Revision:
10:dd9b3a696acd
Parent:
9:0893d986e717
Child:
11:9ec02df863a1
--- a/TextLCD.cpp	Thu Jan 31 19:46:00 2013 +0000
+++ b/TextLCD.cpp	Mon Feb 04 21:48:24 2013 +0000
@@ -42,10 +42,58 @@
     writeByte(0x2);     // 4-bit mode
     wait(0.000040f);    // most instructions take 40us
 
-    writeCommand(0x28); // Function set 001 BW N F - -
-    writeCommand(0x0C);
-    writeCommand(0x06); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
-    cls();
+    // Display is now in 4-bit mode
+    switch (_type) {
+        case LCD8x1:
+            writeCommand(0x20); // Function set 001 BW N F - -
+                                //   N=0 (1 line)
+                                //   F=0 (5x7 dots font)
+            break;                                
+            
+        case LCD24x4:
+            // Special mode for KS0078
+            writeCommand(0x2A); // Function set 001 BW N RE DH REV
+                                //    N=1  (Dont care for KS0078)
+                                //   RE=0  (Extended Regs, special mode for KS0078)
+                                //   DH=1  (Disp shift, special mode for KS0078)                                
+                                //   REV=0 (Reverse, special mode for KS0078)
+
+            writeCommand(0x2E); // Function set 001 BW N RE DH REV
+                                //    N=1  (Dont care for KS0078)
+                                //   RE=1  (Ena Extended Regs, special mode for KS0078)
+                                //   DH=1  (Disp shift, special mode for KS0078)                                
+                                //   REV=0 (Reverse, special mode for KS0078)
+
+            writeCommand(0x09); // Ext Function set 0000 1 FW BW NW
+                                //   FW=0  (5-dot font, special mode for KS0078)
+                                //   BW=0  (Cur BW invert disable, special mode for KS0078)
+                                //   NW=1  (4 Line, special mode for KS0078)                                
+
+            writeCommand(0x2A); // Function set 001 BW N RE DH REV
+                                //    N=1  (Dont care for KS0078)
+                                //   RE=0  (Dis. Extended Regs, special mode for KS0078)
+                                //   DH=1  (Disp shift, special mode for KS0078)                                
+                                //   REV=0 (Reverse, special mode for KS0078)
+            break;
+                                            
+        default:
+            writeCommand(0x28); // Function set 001 BW N F - -
+                                //   N=1 (2 lines)
+                                //   F=0 (5x7 dots font)
+            
+            break;
+    }
+
+    writeCommand(0x0C); // Display Ctrl 0000 1 D C B
+                        //   Display On, Cursor Off, Blink Off
+    _cursor = CurOff;                                
+    
+    writeCommand(0x06); // Entry Mode 0000 01 CD S 
+                        //   Cursor Direction and Display Shift
+                        //   CD=1 (Cur incr)
+                        //   S=0  (No display shift)                        
+
+    cls();    
 }
 
 
@@ -184,6 +232,19 @@
                     return 0x54 + column;
             }
 
+// Special mode for KS0078
+        case LCD24x4:
+            switch (row) {
+                case 0:
+                    return 0x00 + column;
+                case 1:
+                    return 0x20 + column;
+                case 2:
+                    return 0x40 + column;
+                case 3:
+                    return 0x60 + column;
+            }
+
 // Not sure about this one, seems wrong.
         case LCD16x2B:      
             return 0x00 + (row * 40) + column;
@@ -229,6 +290,7 @@
             return 20;
 
         case LCD24x2:
+        case LCD24x4:        
             return 24;        
 
         case LCD40x2:
@@ -255,9 +317,34 @@
                     
         case LCD16x4:
         case LCD20x4:
+        case LCD24x4:        
             return 4;
       
         default:
             return 0;        
     }
 }
+
+
+TextLCD::LCDCursor TextLCD::cursor(TextLCD::LCDCursor show) { 
+    LCDCursor cur = _cursor;
+    
+    switch (show) {
+      case CurOn  : writeCommand(0x0F); // Cursor on and Blink char
+                    wait_us(40);  
+                    _cursor = show;
+                    break;
+      case CurOff : writeCommand(0x0C);
+                    wait_us(40);
+                    _cursor = show;
+                    break;
+      default : 
+                    break;
+                      
+    }
+    return cur;
+}
+
+
+
+