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:38:10 2010 +0000
Revision:
1:e98e29ea2d03
Parent:
0:bf72877f77ab
Child:
2:9071445a6895
0.0002

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gertk 0:bf72877f77ab 1 #include "mbed.h"
gertk 1:e98e29ea2d03 2 #include "mcp_lcd.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 1:e98e29ea2d03 101 // convert from ascii to t6963
gertk 0:bf72877f77ab 102 lcd_data(s[0]-32);
gertk 0:bf72877f77ab 103 s++;
gertk 0:bf72877f77ab 104 }
gertk 0:bf72877f77ab 105 }
gertk 0:bf72877f77ab 106
gertk 0:bf72877f77ab 107
gertk 0:bf72877f77ab 108
gertk 0:bf72877f77ab 109 int main() {
gertk 0:bf72877f77ab 110
gertk 0:bf72877f77ab 111 unsigned char a;
gertk 0:bf72877f77ab 112 pc.printf("SPI test\n");
gertk 0:bf72877f77ab 113
gertk 0:bf72877f77ab 114 spi.format(8,0);
gertk 0:bf72877f77ab 115 spi.frequency(1000000);
gertk 0:bf72877f77ab 116 // spi.frequency(10000);
gertk 0:bf72877f77ab 117 wait(0.1);
gertk 0:bf72877f77ab 118
gertk 0:bf72877f77ab 119 pc.printf("MCP init\n");
gertk 0:bf72877f77ab 120 lcd_init();
gertk 0:bf72877f77ab 121
gertk 0:bf72877f77ab 122 // set text home address at 0x0000
gertk 0:bf72877f77ab 123 lcd_data(0x00);
gertk 0:bf72877f77ab 124 lcd_data(0x00);
gertk 0:bf72877f77ab 125 lcd_command(TXHOME);
gertk 0:bf72877f77ab 126
gertk 0:bf72877f77ab 127 // set graphic home address at 0x0200
gertk 0:bf72877f77ab 128 lcd_data(0x00);
gertk 0:bf72877f77ab 129 lcd_data(0x20);
gertk 0:bf72877f77ab 130 lcd_command(GRHOME);
gertk 0:bf72877f77ab 131
gertk 0:bf72877f77ab 132 // set text area 20 columns
gertk 0:bf72877f77ab 133 lcd_data(0x14);
gertk 0:bf72877f77ab 134 lcd_data(0x00);
gertk 0:bf72877f77ab 135 lcd_command(TXAREA);
gertk 0:bf72877f77ab 136
gertk 0:bf72877f77ab 137 // set graphic area 20 columns
gertk 0:bf72877f77ab 138 lcd_data(0x14);
gertk 0:bf72877f77ab 139 lcd_data(0x00);
gertk 0:bf72877f77ab 140 lcd_command(GRAREA);
gertk 0:bf72877f77ab 141
gertk 0:bf72877f77ab 142 // mode set (internal character generation mode)
gertk 0:bf72877f77ab 143 lcd_command(0x80);
gertk 0:bf72877f77ab 144
gertk 0:bf72877f77ab 145 // set offset register
gertk 0:bf72877f77ab 146 lcd_data(0x02);
gertk 0:bf72877f77ab 147 lcd_data(0x00);
gertk 0:bf72877f77ab 148 lcd_command(OFFSET);
gertk 0:bf72877f77ab 149
gertk 0:bf72877f77ab 150 // display mode (text on graphics on cursor off)
gertk 0:bf72877f77ab 151 lcd_command(0x94);
gertk 0:bf72877f77ab 152
gertk 0:bf72877f77ab 153 // write text blank code
gertk 0:bf72877f77ab 154 lcd_data(0x00);
gertk 0:bf72877f77ab 155 lcd_data(0x00);
gertk 0:bf72877f77ab 156 lcd_command(ADPSET);
gertk 0:bf72877f77ab 157 lcd_command(AWRON);
gertk 0:bf72877f77ab 158 for (a=0; a<160; a++) lcd_data(0);
gertk 0:bf72877f77ab 159 lcd_command(AWROFF);
gertk 0:bf72877f77ab 160
gertk 0:bf72877f77ab 161 // write some text
gertk 0:bf72877f77ab 162 lcd_data(0x40);
gertk 0:bf72877f77ab 163 lcd_data(0x00);
gertk 0:bf72877f77ab 164 lcd_command(ADPSET);
gertk 0:bf72877f77ab 165 lcd_command(AWRON);
gertk 0:bf72877f77ab 166 lcd_string("Hello World!");
gertk 0:bf72877f77ab 167 lcd_string("0123456789");
gertk 0:bf72877f77ab 168 lcd_string("abcdefghijklmnopqrstuvwxyz");
gertk 0:bf72877f77ab 169 lcd_command(AWROFF);
gertk 0:bf72877f77ab 170 lcd_data(0x80);
gertk 0:bf72877f77ab 171
gertk 0:bf72877f77ab 172 while(1) {
gertk 0:bf72877f77ab 173 myled = 1;
gertk 0:bf72877f77ab 174 wait(0.2);
gertk 0:bf72877f77ab 175 myled = 0;
gertk 0:bf72877f77ab 176 wait(0.2);
gertk 0:bf72877f77ab 177 }
gertk 0:bf72877f77ab 178 }