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

main.cpp

Committer:
gertk
Date:
2010-12-05
Revision:
0:bf72877f77ab
Child:
1:e98e29ea2d03

File content as of revision 0:bf72877f77ab:

#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);
    }
}