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
Diff: main.cpp
- 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); + } +}