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:
0:bf72877f77ab
Child:
1:e98e29ea2d03
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Dec 05 14:31:49 2010 +0000
@@ -0,0 +1,177 @@
+#include "mbed.h"
+#include "MCP23S17.h"
+
+#define LCDFONTSEL  0xFF
+DigitalOut myled(LED1);
+SPI spi(p5, p6, p7); // mosi, miso, sclk
+DigitalOut cs(p20);
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+
+// write 8 bits lcd data
+void lcd_data(unsigned char d)
+{
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOB);  // select GPIOB
+    spi.write(d);      // set data byte
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL-LCD_CE-LCD_CD);   
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL - LCD_WR - LCD_CE - LCD_CD);   
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL - LCD_CD);   
+    cs=1;
+    
+}
+
+// write 8 bits lcd command
+void lcd_command(unsigned char c)
+{
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOB);  // select GPIOB
+    spi.write(c);      // set data byte
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL-LCD_CE);   
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL - LCD_WR - LCD_CE);   
+    cs=1;
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA
+    spi.write(LCDFONTSEL);   
+    cs=1;
+}
+
+void lcd_init()
+{
+    cs=0;
+    spi.write(0x40);
+    spi.write(IODIRA);  // select IODIRA at start
+    spi.write(0x00);    // IODIRA all outputs
+    spi.write(0x00);    // IODIRB all outputs
+    cs=1;
+    wait(0.1);
+    
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA at start
+    spi.write(LCDFONTSEL-LCD_RST);    // activate reset
+    spi.write(0x00);    // all B outputs 0
+    cs=1;
+    wait(0.1);
+
+    cs=0;
+    spi.write(0x40);
+    spi.write(GPIOA);  // select GPIOA at start
+    spi.write(LCDFONTSEL);    // deactivate reset
+    cs=1;
+    wait(0.1);
+
+    
+}
+
+void lcd_string(char *s)
+{
+    while (s[0])
+    {
+        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_command(TXHOME);
+    
+    // set graphic home address at 0x0200
+    lcd_data(0x00);
+    lcd_data(0x20);
+    lcd_command(GRHOME);
+    
+    // set text area 20 columns
+    lcd_data(0x14);
+    lcd_data(0x00);
+    lcd_command(TXAREA);
+
+    // set graphic area 20 columns
+    lcd_data(0x14);
+    lcd_data(0x00);
+    lcd_command(GRAREA);
+    
+    // mode set (internal character generation mode)
+    lcd_command(0x80);
+    
+    // set offset register
+    lcd_data(0x02);
+    lcd_data(0x00);
+    lcd_command(OFFSET);
+    
+    // display mode (text on graphics on cursor off)
+    lcd_command(0x94);
+    
+    // write text blank code
+    lcd_data(0x00);
+    lcd_data(0x00);
+    lcd_command(ADPSET);
+    lcd_command(AWRON);
+    for (a=0; a<160; a++) lcd_data(0);
+    lcd_command(AWROFF);
+
+    // 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);
+                    
+    while(1) {
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+    }
+}