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@0:bf72877f77ab, 2010-12-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |