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
main.cpp
- Committer:
- gertk
- Date:
- 2010-12-05
- Revision:
- 1:e98e29ea2d03
- Parent:
- 0:bf72877f77ab
- Child:
- 2:9071445a6895
File content as of revision 1:e98e29ea2d03:
#include "mbed.h" #include "mcp_lcd.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]) { // 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_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); } }