This is a sample program to drive a 128x128 LCD with t6963 controller through SPI by means of an MCP23S17 16-Bit I/O Expander with Serial Interface

Dependencies:   mbed

Revision:
2:9071445a6895
Parent:
1:e98e29ea2d03
Child:
3:fc101c00b5be
--- a/main.cpp	Sun Dec 05 14:38:10 2010 +0000
+++ b/main.cpp	Mon Dec 06 20:45:00 2010 +0000
@@ -1,7 +1,27 @@
 #include "mbed.h"
 #include "mcp_lcd.h"
 
-#define LCDFONTSEL  0xFF
+// for 21 characters on a row (6x8 font)
+// #define LCDFONTSEL  0xFF
+// for 16 characters on a row (8x8 font)
+#define LCDFONTSEL 0xDF
+
+// lcd dimensions in pixels
+#define LCD_XWIDTH     128
+#define LCD_YHEIGHT    128
+
+#if LCDFONTSEL == 0xFF
+// lcd dimensions in characters
+#define LCD_WIDTH   22
+#define LCD_HEIGHT  16
+#else
+#define LCD_WIDTH   16
+#define LCD_HEIGHT  16
+#endif
+
+#define TEXT_STARTADDRESS       0x0000
+#define GRAPHIC_STARTADDRESS    0x1000
+
 DigitalOut myled(LED1);
 SPI spi(p5, p6, p7); // mosi, miso, sclk
 DigitalOut cs(p20);
@@ -91,51 +111,23 @@
     cs=1;
     wait(0.1);
 
-    
-}
-
-void lcd_string(char *s)
-{
-    while (s[0])
-    {
-        // convert from ascii to t6963
-        lcd_data(s[0]-32);
-        s++;
-    }
-}
-        
-
-
-int main() {
-
-    unsigned char a;
-    pc.printf("SPI test\n");
-    
-    spi.format(8,0);
-    spi.frequency(1000000);
-//    spi.frequency(10000);
-    wait(0.1);
-
-    pc.printf("MCP init\n");
-    lcd_init();
-
     // set text home address at 0x0000
-    lcd_data(0x00);
-    lcd_data(0x00);
+    lcd_data(TEXT_STARTADDRESS%0x100);
+    lcd_data(TEXT_STARTADDRESS/0x100);
     lcd_command(TXHOME);
     
-    // set graphic home address at 0x0200
-    lcd_data(0x00);
-    lcd_data(0x20);
+    // set graphic home address at 0x1000
+    lcd_data(GRAPHIC_STARTADDRESS%0x100);
+    lcd_data(GRAPHIC_STARTADDRESS/0x100);
     lcd_command(GRHOME);
     
-    // set text area 20 columns
-    lcd_data(0x14);
+    // set text area 
+    lcd_data(LCD_WIDTH);
     lcd_data(0x00);
     lcd_command(TXAREA);
 
-    // set graphic area 20 columns
-    lcd_data(0x14);
+    // set graphic area
+    lcd_data(LCD_WIDTH);
     lcd_data(0x00);
     lcd_command(GRAREA);
     
@@ -148,27 +140,75 @@
     lcd_command(OFFSET);
     
     // display mode (text on graphics on cursor off)
-    lcd_command(0x94);
+    lcd_command(0x90+0x08+0x04);
+        
+}
+
+// put a text string at position x,y (character row,column)
+void lcd_string(char x,char y,char *s)
+{
+    int adr;
+    adr=TEXT_STARTADDRESS+x+y*LCD_WIDTH;
+    lcd_data(adr%0x100);
+    lcd_data(adr/0x100);
+    lcd_command(ADPSET);
+    lcd_command(AWRON);
     
-    // write text blank code
+    while (s[0])
+    {
+        // convert from ascii to t6963
+        lcd_data(s[0]-32);
+        s++;
+    }
+    lcd_command(AWROFF);
+}
+
+// clear lcd display memory (8k)        
+void lcd_cls()
+{
+    int a;
     lcd_data(0x00);
     lcd_data(0x00);
     lcd_command(ADPSET);
     lcd_command(AWRON);
-    for (a=0; a<160; a++) lcd_data(0);
+    for (a=0; a<8192; a++) lcd_data(0);
     lcd_command(AWROFF);
+}
+
+// set or reset a pixel on the display on position x,y with color 0 or 1
+void lcd_plot(char x,char y,char color)
+{
+    int adr;                         
+    adr = GRAPHIC_STARTADDRESS + ((LCD_WIDTH) * y) + (x/8);   // calculate offset
+    lcd_data(adr%0x100);       // set low byte
+    lcd_data(adr/0x100);       // set high byte
+    lcd_command(ADPSET);           // set address pointer
+    if (color) lcd_command(BS + (7-(x%8)));   // use bit set mode
+        else  lcd_command(BR + (7-(x%8)));  // use bit reset mode
+}
+
+int main() {
+
+    int a;
+    pc.printf("SPI test\n");
+    
+    // set SPI to full speed (10 MHz mode)
+    spi.format(8,0);
+    spi.frequency(10000000);
+//    spi.frequency(10000);
+    wait(0.1);
+
+    pc.printf("MCP init\n");
+    lcd_init();
+    lcd_cls();
 
     // write some text    
-    lcd_data(0x40);
-    lcd_data(0x00);
-    lcd_command(ADPSET);
-    lcd_command(AWRON);
-    lcd_string("Hello World!");
-    lcd_string("0123456789");
-    lcd_string("abcdefghijklmnopqrstuvwxyz");
-    lcd_command(AWROFF);
-    lcd_data(0x80);
-                    
+    lcd_string(0,0,"Hello World!");
+    lcd_string(0,2,"0123456789");
+    lcd_string(0,15,"abcdefghijklmnopqrstuvwxyz");
+   
+    for (a=0; a<128; a++) lcd_plot(a,a/2+48,1);
+    
     while(1) {
         myled = 1;
         wait(0.2);