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

Committer:
gertk
Date:
Sun Dec 05 14:31:49 2010 +0000
Revision:
0:bf72877f77ab
Child:
1:e98e29ea2d03
0.0001

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gertk 0:bf72877f77ab 1 #include "mbed.h"
gertk 0:bf72877f77ab 2 #include "MCP23S17.h"
gertk 0:bf72877f77ab 3
gertk 0:bf72877f77ab 4 #define LCDFONTSEL 0xFF
gertk 0:bf72877f77ab 5 DigitalOut myled(LED1);
gertk 0:bf72877f77ab 6 SPI spi(p5, p6, p7); // mosi, miso, sclk
gertk 0:bf72877f77ab 7 DigitalOut cs(p20);
gertk 0:bf72877f77ab 8
gertk 0:bf72877f77ab 9 Serial pc(USBTX, USBRX); // tx, rx
gertk 0:bf72877f77ab 10
gertk 0:bf72877f77ab 11
gertk 0:bf72877f77ab 12 // write 8 bits lcd data
gertk 0:bf72877f77ab 13 void lcd_data(unsigned char d)
gertk 0:bf72877f77ab 14 {
gertk 0:bf72877f77ab 15 cs=0;
gertk 0:bf72877f77ab 16 spi.write(0x40);
gertk 0:bf72877f77ab 17 spi.write(GPIOB); // select GPIOB
gertk 0:bf72877f77ab 18 spi.write(d); // set data byte
gertk 0:bf72877f77ab 19 cs=1;
gertk 0:bf72877f77ab 20
gertk 0:bf72877f77ab 21 cs=0;
gertk 0:bf72877f77ab 22 spi.write(0x40);
gertk 0:bf72877f77ab 23 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 24 spi.write(LCDFONTSEL-LCD_CE-LCD_CD);
gertk 0:bf72877f77ab 25 cs=1;
gertk 0:bf72877f77ab 26
gertk 0:bf72877f77ab 27 cs=0;
gertk 0:bf72877f77ab 28 spi.write(0x40);
gertk 0:bf72877f77ab 29 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 30 spi.write(LCDFONTSEL - LCD_WR - LCD_CE - LCD_CD);
gertk 0:bf72877f77ab 31 cs=1;
gertk 0:bf72877f77ab 32
gertk 0:bf72877f77ab 33 cs=0;
gertk 0:bf72877f77ab 34 spi.write(0x40);
gertk 0:bf72877f77ab 35 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 36 spi.write(LCDFONTSEL - LCD_CD);
gertk 0:bf72877f77ab 37 cs=1;
gertk 0:bf72877f77ab 38
gertk 0:bf72877f77ab 39 }
gertk 0:bf72877f77ab 40
gertk 0:bf72877f77ab 41 // write 8 bits lcd command
gertk 0:bf72877f77ab 42 void lcd_command(unsigned char c)
gertk 0:bf72877f77ab 43 {
gertk 0:bf72877f77ab 44 cs=0;
gertk 0:bf72877f77ab 45 spi.write(0x40);
gertk 0:bf72877f77ab 46 spi.write(GPIOB); // select GPIOB
gertk 0:bf72877f77ab 47 spi.write(c); // set data byte
gertk 0:bf72877f77ab 48 cs=1;
gertk 0:bf72877f77ab 49
gertk 0:bf72877f77ab 50 cs=0;
gertk 0:bf72877f77ab 51 spi.write(0x40);
gertk 0:bf72877f77ab 52 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 53 spi.write(LCDFONTSEL-LCD_CE);
gertk 0:bf72877f77ab 54 cs=1;
gertk 0:bf72877f77ab 55
gertk 0:bf72877f77ab 56 cs=0;
gertk 0:bf72877f77ab 57 spi.write(0x40);
gertk 0:bf72877f77ab 58 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 59 spi.write(LCDFONTSEL - LCD_WR - LCD_CE);
gertk 0:bf72877f77ab 60 cs=1;
gertk 0:bf72877f77ab 61
gertk 0:bf72877f77ab 62 cs=0;
gertk 0:bf72877f77ab 63 spi.write(0x40);
gertk 0:bf72877f77ab 64 spi.write(GPIOA); // select GPIOA
gertk 0:bf72877f77ab 65 spi.write(LCDFONTSEL);
gertk 0:bf72877f77ab 66 cs=1;
gertk 0:bf72877f77ab 67 }
gertk 0:bf72877f77ab 68
gertk 0:bf72877f77ab 69 void lcd_init()
gertk 0:bf72877f77ab 70 {
gertk 0:bf72877f77ab 71 cs=0;
gertk 0:bf72877f77ab 72 spi.write(0x40);
gertk 0:bf72877f77ab 73 spi.write(IODIRA); // select IODIRA at start
gertk 0:bf72877f77ab 74 spi.write(0x00); // IODIRA all outputs
gertk 0:bf72877f77ab 75 spi.write(0x00); // IODIRB all outputs
gertk 0:bf72877f77ab 76 cs=1;
gertk 0:bf72877f77ab 77 wait(0.1);
gertk 0:bf72877f77ab 78
gertk 0:bf72877f77ab 79 cs=0;
gertk 0:bf72877f77ab 80 spi.write(0x40);
gertk 0:bf72877f77ab 81 spi.write(GPIOA); // select GPIOA at start
gertk 0:bf72877f77ab 82 spi.write(LCDFONTSEL-LCD_RST); // activate reset
gertk 0:bf72877f77ab 83 spi.write(0x00); // all B outputs 0
gertk 0:bf72877f77ab 84 cs=1;
gertk 0:bf72877f77ab 85 wait(0.1);
gertk 0:bf72877f77ab 86
gertk 0:bf72877f77ab 87 cs=0;
gertk 0:bf72877f77ab 88 spi.write(0x40);
gertk 0:bf72877f77ab 89 spi.write(GPIOA); // select GPIOA at start
gertk 0:bf72877f77ab 90 spi.write(LCDFONTSEL); // deactivate reset
gertk 0:bf72877f77ab 91 cs=1;
gertk 0:bf72877f77ab 92 wait(0.1);
gertk 0:bf72877f77ab 93
gertk 0:bf72877f77ab 94
gertk 0:bf72877f77ab 95 }
gertk 0:bf72877f77ab 96
gertk 0:bf72877f77ab 97 void lcd_string(char *s)
gertk 0:bf72877f77ab 98 {
gertk 0:bf72877f77ab 99 while (s[0])
gertk 0:bf72877f77ab 100 {
gertk 0:bf72877f77ab 101 lcd_data(s[0]-32);
gertk 0:bf72877f77ab 102 s++;
gertk 0:bf72877f77ab 103 }
gertk 0:bf72877f77ab 104 }
gertk 0:bf72877f77ab 105
gertk 0:bf72877f77ab 106
gertk 0:bf72877f77ab 107
gertk 0:bf72877f77ab 108 int main() {
gertk 0:bf72877f77ab 109
gertk 0:bf72877f77ab 110 unsigned char a;
gertk 0:bf72877f77ab 111 pc.printf("SPI test\n");
gertk 0:bf72877f77ab 112
gertk 0:bf72877f77ab 113 spi.format(8,0);
gertk 0:bf72877f77ab 114 spi.frequency(1000000);
gertk 0:bf72877f77ab 115 // spi.frequency(10000);
gertk 0:bf72877f77ab 116 wait(0.1);
gertk 0:bf72877f77ab 117
gertk 0:bf72877f77ab 118 pc.printf("MCP init\n");
gertk 0:bf72877f77ab 119 lcd_init();
gertk 0:bf72877f77ab 120
gertk 0:bf72877f77ab 121 // set text home address at 0x0000
gertk 0:bf72877f77ab 122 lcd_data(0x00);
gertk 0:bf72877f77ab 123 lcd_data(0x00);
gertk 0:bf72877f77ab 124 lcd_command(TXHOME);
gertk 0:bf72877f77ab 125
gertk 0:bf72877f77ab 126 // set graphic home address at 0x0200
gertk 0:bf72877f77ab 127 lcd_data(0x00);
gertk 0:bf72877f77ab 128 lcd_data(0x20);
gertk 0:bf72877f77ab 129 lcd_command(GRHOME);
gertk 0:bf72877f77ab 130
gertk 0:bf72877f77ab 131 // set text area 20 columns
gertk 0:bf72877f77ab 132 lcd_data(0x14);
gertk 0:bf72877f77ab 133 lcd_data(0x00);
gertk 0:bf72877f77ab 134 lcd_command(TXAREA);
gertk 0:bf72877f77ab 135
gertk 0:bf72877f77ab 136 // set graphic area 20 columns
gertk 0:bf72877f77ab 137 lcd_data(0x14);
gertk 0:bf72877f77ab 138 lcd_data(0x00);
gertk 0:bf72877f77ab 139 lcd_command(GRAREA);
gertk 0:bf72877f77ab 140
gertk 0:bf72877f77ab 141 // mode set (internal character generation mode)
gertk 0:bf72877f77ab 142 lcd_command(0x80);
gertk 0:bf72877f77ab 143
gertk 0:bf72877f77ab 144 // set offset register
gertk 0:bf72877f77ab 145 lcd_data(0x02);
gertk 0:bf72877f77ab 146 lcd_data(0x00);
gertk 0:bf72877f77ab 147 lcd_command(OFFSET);
gertk 0:bf72877f77ab 148
gertk 0:bf72877f77ab 149 // display mode (text on graphics on cursor off)
gertk 0:bf72877f77ab 150 lcd_command(0x94);
gertk 0:bf72877f77ab 151
gertk 0:bf72877f77ab 152 // write text blank code
gertk 0:bf72877f77ab 153 lcd_data(0x00);
gertk 0:bf72877f77ab 154 lcd_data(0x00);
gertk 0:bf72877f77ab 155 lcd_command(ADPSET);
gertk 0:bf72877f77ab 156 lcd_command(AWRON);
gertk 0:bf72877f77ab 157 for (a=0; a<160; a++) lcd_data(0);
gertk 0:bf72877f77ab 158 lcd_command(AWROFF);
gertk 0:bf72877f77ab 159
gertk 0:bf72877f77ab 160 // write some text
gertk 0:bf72877f77ab 161 lcd_data(0x40);
gertk 0:bf72877f77ab 162 lcd_data(0x00);
gertk 0:bf72877f77ab 163 lcd_command(ADPSET);
gertk 0:bf72877f77ab 164 lcd_command(AWRON);
gertk 0:bf72877f77ab 165 lcd_string("Hello World!");
gertk 0:bf72877f77ab 166 lcd_string("0123456789");
gertk 0:bf72877f77ab 167 lcd_string("abcdefghijklmnopqrstuvwxyz");
gertk 0:bf72877f77ab 168 lcd_command(AWROFF);
gertk 0:bf72877f77ab 169 lcd_data(0x80);
gertk 0:bf72877f77ab 170
gertk 0:bf72877f77ab 171 while(1) {
gertk 0:bf72877f77ab 172 myled = 1;
gertk 0:bf72877f77ab 173 wait(0.2);
gertk 0:bf72877f77ab 174 myled = 0;
gertk 0:bf72877f77ab 175 wait(0.2);
gertk 0:bf72877f77ab 176 }
gertk 0:bf72877f77ab 177 }