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@4:fd7c6559a56d, 2011-10-17 (annotated)
- Committer:
- gertk
- Date:
- Mon Oct 17 10:24:14 2011 +0000
- Revision:
- 4:fd7c6559a56d
- Parent:
- 3:fc101c00b5be
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gertk | 4:fd7c6559a56d | 1 | // Demo program displaying an analog clock |
gertk | 4:fd7c6559a56d | 2 | // on a T6963 based LCD connected to the mbed through |
gertk | 4:fd7c6559a56d | 3 | // SPI with a MCP23S17 thereby using only 4 pins I/O |
gertk | 4:fd7c6559a56d | 4 | // by Gert van der Knokke 2010 |
gertk | 3:fc101c00b5be | 5 | #include "mbed.h" |
gertk | 3:fc101c00b5be | 6 | #include "mcp_lcd.h" |
gertk | 3:fc101c00b5be | 7 | |
gertk | 3:fc101c00b5be | 8 | // for 21 characters on a row (6x8 font) |
gertk | 3:fc101c00b5be | 9 | #define LCDFONTSEL 0xFF |
gertk | 3:fc101c00b5be | 10 | // for 16 characters on a row (8x8 font) |
gertk | 3:fc101c00b5be | 11 | // #define LCDFONTSEL 0xDF |
gertk | 3:fc101c00b5be | 12 | |
gertk | 3:fc101c00b5be | 13 | // lcd dimensions in pixels |
gertk | 3:fc101c00b5be | 14 | #define LCD_XWIDTH 128 |
gertk | 3:fc101c00b5be | 15 | #define LCD_YHEIGHT 128 |
gertk | 3:fc101c00b5be | 16 | |
gertk | 3:fc101c00b5be | 17 | #if LCDFONTSEL == 0xFF |
gertk | 3:fc101c00b5be | 18 | // lcd dimensions in characters |
gertk | 3:fc101c00b5be | 19 | #define LCD_WIDTH 22 |
gertk | 3:fc101c00b5be | 20 | #define LCD_HEIGHT 16 |
gertk | 3:fc101c00b5be | 21 | #define PIXELWIDTH 6 |
gertk | 3:fc101c00b5be | 22 | #else |
gertk | 3:fc101c00b5be | 23 | #define LCD_WIDTH 16 |
gertk | 3:fc101c00b5be | 24 | #define LCD_HEIGHT 16 |
gertk | 3:fc101c00b5be | 25 | #define PIXELWIDTH 8 |
gertk | 3:fc101c00b5be | 26 | #endif |
gertk | 3:fc101c00b5be | 27 | |
gertk | 3:fc101c00b5be | 28 | #define TEXT_STARTADDRESS 0x0000 |
gertk | 3:fc101c00b5be | 29 | #define GRAPHIC_STARTADDRESS 0x1000 |
gertk | 3:fc101c00b5be | 30 | |
gertk | 3:fc101c00b5be | 31 | |
gertk | 3:fc101c00b5be | 32 | #define CENTERX 64 |
gertk | 3:fc101c00b5be | 33 | #define CENTERY 64 |
gertk | 3:fc101c00b5be | 34 | #define INNER_RADIUS 45 |
gertk | 3:fc101c00b5be | 35 | #define OUTER_RADIUS 50 |
gertk | 3:fc101c00b5be | 36 | #define CENTER_CIRCLE 5 |
gertk | 3:fc101c00b5be | 37 | |
gertk | 3:fc101c00b5be | 38 | DigitalOut myled(LED1); |
gertk | 3:fc101c00b5be | 39 | SPI spi(p5, p6, p7); // mosi, miso, sclk |
gertk | 3:fc101c00b5be | 40 | DigitalOut cs(p20); |
gertk | 3:fc101c00b5be | 41 | |
gertk | 3:fc101c00b5be | 42 | Serial pc(USBTX, USBRX); // tx, rx |
gertk | 3:fc101c00b5be | 43 | |
gertk | 3:fc101c00b5be | 44 | |
gertk | 3:fc101c00b5be | 45 | // write 8 bits lcd data |
gertk | 3:fc101c00b5be | 46 | void lcd_data(unsigned char d) |
gertk | 3:fc101c00b5be | 47 | { |
gertk | 3:fc101c00b5be | 48 | cs=0; |
gertk | 3:fc101c00b5be | 49 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 50 | spi.write(GPIOB); // select GPIOB |
gertk | 3:fc101c00b5be | 51 | spi.write(d); // set data byte |
gertk | 3:fc101c00b5be | 52 | cs=1; |
gertk | 3:fc101c00b5be | 53 | |
gertk | 3:fc101c00b5be | 54 | cs=0; |
gertk | 3:fc101c00b5be | 55 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 56 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 57 | spi.write(LCDFONTSEL-LCD_CE-LCD_CD); |
gertk | 3:fc101c00b5be | 58 | cs=1; |
gertk | 3:fc101c00b5be | 59 | |
gertk | 3:fc101c00b5be | 60 | cs=0; |
gertk | 3:fc101c00b5be | 61 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 62 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 63 | spi.write(LCDFONTSEL - LCD_WR - LCD_CE - LCD_CD); |
gertk | 3:fc101c00b5be | 64 | cs=1; |
gertk | 3:fc101c00b5be | 65 | |
gertk | 3:fc101c00b5be | 66 | cs=0; |
gertk | 3:fc101c00b5be | 67 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 68 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 69 | spi.write(LCDFONTSEL - LCD_CD); |
gertk | 3:fc101c00b5be | 70 | cs=1; |
gertk | 3:fc101c00b5be | 71 | |
gertk | 3:fc101c00b5be | 72 | } |
gertk | 3:fc101c00b5be | 73 | |
gertk | 3:fc101c00b5be | 74 | // write 8 bits lcd command |
gertk | 3:fc101c00b5be | 75 | void lcd_command(unsigned char c) |
gertk | 3:fc101c00b5be | 76 | { |
gertk | 3:fc101c00b5be | 77 | cs=0; |
gertk | 3:fc101c00b5be | 78 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 79 | spi.write(GPIOB); // select GPIOB |
gertk | 3:fc101c00b5be | 80 | spi.write(c); // set data byte |
gertk | 3:fc101c00b5be | 81 | cs=1; |
gertk | 3:fc101c00b5be | 82 | |
gertk | 3:fc101c00b5be | 83 | cs=0; |
gertk | 3:fc101c00b5be | 84 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 85 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 86 | spi.write(LCDFONTSEL-LCD_CE); |
gertk | 3:fc101c00b5be | 87 | cs=1; |
gertk | 3:fc101c00b5be | 88 | |
gertk | 3:fc101c00b5be | 89 | cs=0; |
gertk | 3:fc101c00b5be | 90 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 91 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 92 | spi.write(LCDFONTSEL - LCD_WR - LCD_CE); |
gertk | 3:fc101c00b5be | 93 | cs=1; |
gertk | 3:fc101c00b5be | 94 | |
gertk | 3:fc101c00b5be | 95 | cs=0; |
gertk | 3:fc101c00b5be | 96 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 97 | spi.write(GPIOA); // select GPIOA |
gertk | 3:fc101c00b5be | 98 | spi.write(LCDFONTSEL); |
gertk | 3:fc101c00b5be | 99 | cs=1; |
gertk | 3:fc101c00b5be | 100 | } |
gertk | 3:fc101c00b5be | 101 | |
gertk | 3:fc101c00b5be | 102 | void lcd_init() |
gertk | 3:fc101c00b5be | 103 | { |
gertk | 3:fc101c00b5be | 104 | cs=0; |
gertk | 3:fc101c00b5be | 105 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 106 | spi.write(IODIRA); // select IODIRA at start |
gertk | 3:fc101c00b5be | 107 | spi.write(0x00); // IODIRA all outputs |
gertk | 3:fc101c00b5be | 108 | spi.write(0x00); // IODIRB all outputs |
gertk | 3:fc101c00b5be | 109 | cs=1; |
gertk | 3:fc101c00b5be | 110 | wait(0.1); |
gertk | 3:fc101c00b5be | 111 | |
gertk | 3:fc101c00b5be | 112 | cs=0; |
gertk | 3:fc101c00b5be | 113 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 114 | spi.write(GPIOA); // select GPIOA at start |
gertk | 3:fc101c00b5be | 115 | spi.write(LCDFONTSEL-LCD_RST); // activate reset |
gertk | 3:fc101c00b5be | 116 | spi.write(0x00); // all B outputs 0 |
gertk | 3:fc101c00b5be | 117 | cs=1; |
gertk | 3:fc101c00b5be | 118 | wait(0.1); |
gertk | 3:fc101c00b5be | 119 | |
gertk | 3:fc101c00b5be | 120 | cs=0; |
gertk | 3:fc101c00b5be | 121 | spi.write(0x40); |
gertk | 3:fc101c00b5be | 122 | spi.write(GPIOA); // select GPIOA at start |
gertk | 3:fc101c00b5be | 123 | spi.write(LCDFONTSEL); // deactivate reset |
gertk | 3:fc101c00b5be | 124 | cs=1; |
gertk | 3:fc101c00b5be | 125 | wait(0.1); |
gertk | 3:fc101c00b5be | 126 | |
gertk | 3:fc101c00b5be | 127 | // set text home address at 0x0000 |
gertk | 3:fc101c00b5be | 128 | lcd_data(TEXT_STARTADDRESS%0x100); |
gertk | 3:fc101c00b5be | 129 | lcd_data(TEXT_STARTADDRESS/0x100); |
gertk | 3:fc101c00b5be | 130 | lcd_command(TXHOME); |
gertk | 3:fc101c00b5be | 131 | |
gertk | 3:fc101c00b5be | 132 | // set graphic home address at 0x1000 |
gertk | 3:fc101c00b5be | 133 | lcd_data(GRAPHIC_STARTADDRESS%0x100); |
gertk | 3:fc101c00b5be | 134 | lcd_data(GRAPHIC_STARTADDRESS/0x100); |
gertk | 3:fc101c00b5be | 135 | lcd_command(GRHOME); |
gertk | 3:fc101c00b5be | 136 | |
gertk | 3:fc101c00b5be | 137 | // set text area |
gertk | 3:fc101c00b5be | 138 | lcd_data(LCD_WIDTH); |
gertk | 3:fc101c00b5be | 139 | lcd_data(0x00); |
gertk | 3:fc101c00b5be | 140 | lcd_command(TXAREA); |
gertk | 3:fc101c00b5be | 141 | |
gertk | 3:fc101c00b5be | 142 | // set graphic area |
gertk | 3:fc101c00b5be | 143 | lcd_data(LCD_WIDTH); |
gertk | 3:fc101c00b5be | 144 | lcd_data(0x00); |
gertk | 3:fc101c00b5be | 145 | lcd_command(GRAREA); |
gertk | 3:fc101c00b5be | 146 | |
gertk | 3:fc101c00b5be | 147 | // mode set (internal character generation mode) |
gertk | 3:fc101c00b5be | 148 | lcd_command(0x80); |
gertk | 3:fc101c00b5be | 149 | |
gertk | 3:fc101c00b5be | 150 | // set offset register |
gertk | 3:fc101c00b5be | 151 | lcd_data(0x02); |
gertk | 3:fc101c00b5be | 152 | lcd_data(0x00); |
gertk | 3:fc101c00b5be | 153 | lcd_command(OFFSET); |
gertk | 3:fc101c00b5be | 154 | |
gertk | 3:fc101c00b5be | 155 | // display mode (text on graphics on cursor off) |
gertk | 3:fc101c00b5be | 156 | lcd_command(0x90+0x08+0x04); |
gertk | 3:fc101c00b5be | 157 | |
gertk | 3:fc101c00b5be | 158 | } |
gertk | 3:fc101c00b5be | 159 | |
gertk | 3:fc101c00b5be | 160 | // put a text string at position x,y (character row,column) |
gertk | 3:fc101c00b5be | 161 | void lcd_string(char x,char y,char *s) |
gertk | 3:fc101c00b5be | 162 | { |
gertk | 3:fc101c00b5be | 163 | int adr; |
gertk | 3:fc101c00b5be | 164 | adr=TEXT_STARTADDRESS+x+y*LCD_WIDTH; |
gertk | 3:fc101c00b5be | 165 | lcd_data(adr%0x100); |
gertk | 3:fc101c00b5be | 166 | lcd_data(adr/0x100); |
gertk | 3:fc101c00b5be | 167 | lcd_command(ADPSET); |
gertk | 3:fc101c00b5be | 168 | lcd_command(AWRON); |
gertk | 3:fc101c00b5be | 169 | |
gertk | 3:fc101c00b5be | 170 | while (s[0]) |
gertk | 3:fc101c00b5be | 171 | { |
gertk | 3:fc101c00b5be | 172 | // convert from ascii to t6963 |
gertk | 3:fc101c00b5be | 173 | lcd_data(s[0]-32); |
gertk | 3:fc101c00b5be | 174 | s++; |
gertk | 3:fc101c00b5be | 175 | } |
gertk | 3:fc101c00b5be | 176 | lcd_command(AWROFF); |
gertk | 3:fc101c00b5be | 177 | } |
gertk | 3:fc101c00b5be | 178 | |
gertk | 3:fc101c00b5be | 179 | // clear lcd display memory (8k) |
gertk | 3:fc101c00b5be | 180 | void lcd_cls() |
gertk | 3:fc101c00b5be | 181 | { |
gertk | 3:fc101c00b5be | 182 | int a; |
gertk | 3:fc101c00b5be | 183 | lcd_data(0x00); |
gertk | 3:fc101c00b5be | 184 | lcd_data(0x00); |
gertk | 3:fc101c00b5be | 185 | lcd_command(ADPSET); |
gertk | 3:fc101c00b5be | 186 | lcd_command(AWRON); |
gertk | 3:fc101c00b5be | 187 | for (a=0; a<8192; a++) lcd_data(0); |
gertk | 3:fc101c00b5be | 188 | lcd_command(AWROFF); |
gertk | 3:fc101c00b5be | 189 | } |
gertk | 3:fc101c00b5be | 190 | |
gertk | 3:fc101c00b5be | 191 | // set or reset a pixel on the display on position x,y with color 0 or 1 |
gertk | 3:fc101c00b5be | 192 | void lcd_plot(char x,char y,char color) |
gertk | 3:fc101c00b5be | 193 | { |
gertk | 3:fc101c00b5be | 194 | int adr; |
gertk | 3:fc101c00b5be | 195 | adr = GRAPHIC_STARTADDRESS + ((LCD_WIDTH) * y) + (x/PIXELWIDTH); // calculate offset |
gertk | 3:fc101c00b5be | 196 | lcd_data(adr%0x100); // set low byte |
gertk | 3:fc101c00b5be | 197 | lcd_data(adr/0x100); // set high byte |
gertk | 3:fc101c00b5be | 198 | lcd_command(ADPSET); // set address pointer |
gertk | 3:fc101c00b5be | 199 | if (color) lcd_command(BS + ((PIXELWIDTH-1)-(x%PIXELWIDTH))); // use bit set mode |
gertk | 3:fc101c00b5be | 200 | else lcd_command(BR + ((PIXELWIDTH-1)-(x%PIXELWIDTH))); // use bit reset mode |
gertk | 3:fc101c00b5be | 201 | } |
gertk | 3:fc101c00b5be | 202 | |
gertk | 3:fc101c00b5be | 203 | // Bresenham line routine |
gertk | 3:fc101c00b5be | 204 | void lcd_line(int x0, int y0, int x1, int y1,char color) |
gertk | 3:fc101c00b5be | 205 | { |
gertk | 3:fc101c00b5be | 206 | char steep=1; |
gertk | 3:fc101c00b5be | 207 | int i,dx,dy,e; |
gertk | 3:fc101c00b5be | 208 | signed char sx,sy; |
gertk | 3:fc101c00b5be | 209 | |
gertk | 3:fc101c00b5be | 210 | dx = abs(x1-x0); |
gertk | 3:fc101c00b5be | 211 | sx = ((x1 - x0) >0) ? 1 : -1; |
gertk | 3:fc101c00b5be | 212 | dy=abs(y1-y0); |
gertk | 3:fc101c00b5be | 213 | sy = ((y1 - y0) >0) ? 1 : -1; |
gertk | 3:fc101c00b5be | 214 | |
gertk | 3:fc101c00b5be | 215 | if (dy > dx) |
gertk | 3:fc101c00b5be | 216 | { |
gertk | 3:fc101c00b5be | 217 | steep=0; |
gertk | 3:fc101c00b5be | 218 | // swap X0 and Y0 |
gertk | 3:fc101c00b5be | 219 | x0=x0 ^ y0; |
gertk | 3:fc101c00b5be | 220 | y0=x0 ^ y0; |
gertk | 3:fc101c00b5be | 221 | x0=x0 ^ y0; |
gertk | 3:fc101c00b5be | 222 | |
gertk | 3:fc101c00b5be | 223 | // swap DX and DY |
gertk | 3:fc101c00b5be | 224 | dx=dx ^ dy; |
gertk | 3:fc101c00b5be | 225 | dy=dx ^ dy; |
gertk | 3:fc101c00b5be | 226 | dx=dx ^ dy; |
gertk | 3:fc101c00b5be | 227 | |
gertk | 3:fc101c00b5be | 228 | // swap SX and SY |
gertk | 3:fc101c00b5be | 229 | sx=sx ^ sy; |
gertk | 3:fc101c00b5be | 230 | sy=sx ^ sy; |
gertk | 3:fc101c00b5be | 231 | sx=sx ^ sy; |
gertk | 3:fc101c00b5be | 232 | } |
gertk | 3:fc101c00b5be | 233 | |
gertk | 3:fc101c00b5be | 234 | e = (dy << 1) - dx; |
gertk | 3:fc101c00b5be | 235 | |
gertk | 3:fc101c00b5be | 236 | for (i=0; i<=dx; i++) |
gertk | 3:fc101c00b5be | 237 | { |
gertk | 3:fc101c00b5be | 238 | if (steep) |
gertk | 3:fc101c00b5be | 239 | { |
gertk | 3:fc101c00b5be | 240 | lcd_plot(x0,y0,color); |
gertk | 3:fc101c00b5be | 241 | } |
gertk | 3:fc101c00b5be | 242 | else |
gertk | 3:fc101c00b5be | 243 | { |
gertk | 3:fc101c00b5be | 244 | lcd_plot(y0,x0,color); |
gertk | 3:fc101c00b5be | 245 | } |
gertk | 3:fc101c00b5be | 246 | while (e >= 0) |
gertk | 3:fc101c00b5be | 247 | { |
gertk | 3:fc101c00b5be | 248 | y0 += sy; |
gertk | 3:fc101c00b5be | 249 | e -= (dx << 1); |
gertk | 3:fc101c00b5be | 250 | } |
gertk | 3:fc101c00b5be | 251 | x0 += sx; |
gertk | 3:fc101c00b5be | 252 | e += (dy << 1); |
gertk | 3:fc101c00b5be | 253 | } |
gertk | 3:fc101c00b5be | 254 | } |
gertk | 3:fc101c00b5be | 255 | |
gertk | 3:fc101c00b5be | 256 | // Bresenham circle routine |
gertk | 3:fc101c00b5be | 257 | void lcd_circle(int x0,int y0, int radius, char color) |
gertk | 3:fc101c00b5be | 258 | { |
gertk | 3:fc101c00b5be | 259 | |
gertk | 3:fc101c00b5be | 260 | int f = 1 - radius; |
gertk | 3:fc101c00b5be | 261 | int dx = 1; |
gertk | 3:fc101c00b5be | 262 | int dy = -2 * radius; |
gertk | 3:fc101c00b5be | 263 | int x = 0; |
gertk | 3:fc101c00b5be | 264 | int y = radius; |
gertk | 3:fc101c00b5be | 265 | |
gertk | 3:fc101c00b5be | 266 | lcd_plot(x0, y0 + radius,color); |
gertk | 3:fc101c00b5be | 267 | lcd_plot(x0, y0 - radius,color); |
gertk | 3:fc101c00b5be | 268 | lcd_plot(x0 + radius, y0,color); |
gertk | 3:fc101c00b5be | 269 | lcd_plot(x0 - radius, y0,color); |
gertk | 3:fc101c00b5be | 270 | |
gertk | 3:fc101c00b5be | 271 | while(x < y) |
gertk | 3:fc101c00b5be | 272 | { |
gertk | 3:fc101c00b5be | 273 | if(f >= 0) |
gertk | 3:fc101c00b5be | 274 | { |
gertk | 3:fc101c00b5be | 275 | y--; |
gertk | 3:fc101c00b5be | 276 | dy += 2; |
gertk | 3:fc101c00b5be | 277 | f += dy; |
gertk | 3:fc101c00b5be | 278 | } |
gertk | 3:fc101c00b5be | 279 | x++; |
gertk | 3:fc101c00b5be | 280 | dx += 2; |
gertk | 3:fc101c00b5be | 281 | f += dx; |
gertk | 3:fc101c00b5be | 282 | lcd_plot(x0 + x, y0 + y,color); |
gertk | 3:fc101c00b5be | 283 | lcd_plot(x0 - x, y0 + y,color); |
gertk | 3:fc101c00b5be | 284 | lcd_plot(x0 + x, y0 - y,color); |
gertk | 3:fc101c00b5be | 285 | lcd_plot(x0 - x, y0 - y,color); |
gertk | 3:fc101c00b5be | 286 | lcd_plot(x0 + y, y0 + x,color); |
gertk | 3:fc101c00b5be | 287 | lcd_plot(x0 - y, y0 + x,color); |
gertk | 3:fc101c00b5be | 288 | lcd_plot(x0 + y, y0 - x,color); |
gertk | 3:fc101c00b5be | 289 | lcd_plot(x0 - y, y0 - x,color); |
gertk | 3:fc101c00b5be | 290 | } |
gertk | 3:fc101c00b5be | 291 | } |
gertk | 3:fc101c00b5be | 292 | |
gertk | 3:fc101c00b5be | 293 | int main() { |
gertk | 3:fc101c00b5be | 294 | |
gertk | 3:fc101c00b5be | 295 | |
gertk | 3:fc101c00b5be | 296 | float a,b,f; |
gertk | 3:fc101c00b5be | 297 | float pi=3.14159265; |
gertk | 3:fc101c00b5be | 298 | float h_pi=pi/6; |
gertk | 3:fc101c00b5be | 299 | float m_pi=pi/30; |
gertk | 3:fc101c00b5be | 300 | |
gertk | 3:fc101c00b5be | 301 | char buf[40]; |
gertk | 3:fc101c00b5be | 302 | time_t seconds; |
gertk | 3:fc101c00b5be | 303 | int sec,min,hour; |
gertk | 3:fc101c00b5be | 304 | int s_sx,s_sy,s_ex,s_ey; |
gertk | 3:fc101c00b5be | 305 | int m_sx,m_sy,m_ex,m_ey; |
gertk | 3:fc101c00b5be | 306 | int h_sx,h_sy,h_ex,h_ey; |
gertk | 3:fc101c00b5be | 307 | |
gertk | 3:fc101c00b5be | 308 | // setup time structure |
gertk | 3:fc101c00b5be | 309 | struct tm t; |
gertk | 3:fc101c00b5be | 310 | t.tm_sec = 00; // 0-59 |
gertk | 3:fc101c00b5be | 311 | t.tm_min = 30; // 0-59 |
gertk | 3:fc101c00b5be | 312 | t.tm_hour = 21; // 0-23 |
gertk | 3:fc101c00b5be | 313 | t.tm_mday = 14; // 1-31 |
gertk | 3:fc101c00b5be | 314 | t.tm_mon = 11; // 0-11 |
gertk | 3:fc101c00b5be | 315 | t.tm_year = 110; // year since 1900 |
gertk | 3:fc101c00b5be | 316 | seconds = mktime(&t); |
gertk | 3:fc101c00b5be | 317 | // set_time(seconds); |
gertk | 3:fc101c00b5be | 318 | |
gertk | 3:fc101c00b5be | 319 | |
gertk | 3:fc101c00b5be | 320 | pc.printf("SPI test\n"); |
gertk | 3:fc101c00b5be | 321 | |
gertk | 3:fc101c00b5be | 322 | // set SPI to full speed (10 MHz mode) |
gertk | 3:fc101c00b5be | 323 | spi.format(8,0); |
gertk | 3:fc101c00b5be | 324 | spi.frequency(10000000); |
gertk | 3:fc101c00b5be | 325 | // spi.frequency(10000); |
gertk | 3:fc101c00b5be | 326 | wait(0.1); |
gertk | 3:fc101c00b5be | 327 | |
gertk | 3:fc101c00b5be | 328 | pc.printf("MCP init\n"); |
gertk | 3:fc101c00b5be | 329 | lcd_init(); |
gertk | 3:fc101c00b5be | 330 | lcd_cls(); |
gertk | 3:fc101c00b5be | 331 | |
gertk | 3:fc101c00b5be | 332 | // write some text 345678901234567890 |
gertk | 3:fc101c00b5be | 333 | lcd_string(0,0,"* Hello mbed World! *"); |
gertk | 3:fc101c00b5be | 334 | // lcd_string(0,15,"abcdefghijklmnopqrstuvwxyz"); |
gertk | 3:fc101c00b5be | 335 | |
gertk | 3:fc101c00b5be | 336 | |
gertk | 3:fc101c00b5be | 337 | // draw outer circle of analog clock |
gertk | 3:fc101c00b5be | 338 | lcd_circle(CENTERX,CENTERY,OUTER_RADIUS+1,1); |
gertk | 3:fc101c00b5be | 339 | |
gertk | 3:fc101c00b5be | 340 | // draw hour markings |
gertk | 3:fc101c00b5be | 341 | for (min=0; min<59; min+=5) |
gertk | 3:fc101c00b5be | 342 | { |
gertk | 3:fc101c00b5be | 343 | b=min*m_pi; |
gertk | 3:fc101c00b5be | 344 | m_sx=sin(b)*INNER_RADIUS+CENTERX; |
gertk | 3:fc101c00b5be | 345 | m_sy=-cos(b)*INNER_RADIUS+CENTERY; |
gertk | 3:fc101c00b5be | 346 | m_ex=sin(b)*OUTER_RADIUS+CENTERX; |
gertk | 3:fc101c00b5be | 347 | m_ey=-cos(b)*OUTER_RADIUS+CENTERY; |
gertk | 3:fc101c00b5be | 348 | lcd_line(m_sx,m_sy,m_ex,m_ey,1); |
gertk | 3:fc101c00b5be | 349 | } |
gertk | 3:fc101c00b5be | 350 | |
gertk | 3:fc101c00b5be | 351 | |
gertk | 3:fc101c00b5be | 352 | for(;;) |
gertk | 3:fc101c00b5be | 353 | { |
gertk | 3:fc101c00b5be | 354 | seconds = time(NULL); |
gertk | 3:fc101c00b5be | 355 | |
gertk | 3:fc101c00b5be | 356 | // 13:24:00 dd/mm/yyyy |
gertk | 3:fc101c00b5be | 357 | strftime(buf,40, "%H:%M:%S %d/%m/%Y", localtime(&seconds)); |
gertk | 3:fc101c00b5be | 358 | lcd_string(0,15,buf); |
gertk | 3:fc101c00b5be | 359 | |
gertk | 3:fc101c00b5be | 360 | strftime(buf,40, "%I %M %S", localtime(&seconds)); |
gertk | 3:fc101c00b5be | 361 | sscanf(buf,"%d %d %d",&hour,&min,&sec); |
gertk | 3:fc101c00b5be | 362 | |
gertk | 3:fc101c00b5be | 363 | b=sec*m_pi; |
gertk | 3:fc101c00b5be | 364 | s_sx=CENTERX; |
gertk | 3:fc101c00b5be | 365 | s_sy=CENTERY; |
gertk | 3:fc101c00b5be | 366 | s_ex=sin(b)*(INNER_RADIUS-3)+CENTERX; |
gertk | 3:fc101c00b5be | 367 | s_ey=-cos(b)*(INNER_RADIUS-3)+CENTERY; |
gertk | 3:fc101c00b5be | 368 | |
gertk | 3:fc101c00b5be | 369 | |
gertk | 3:fc101c00b5be | 370 | b=min*m_pi; |
gertk | 3:fc101c00b5be | 371 | m_sx=sin(b)*(CENTER_CIRCLE)+CENTERX; |
gertk | 3:fc101c00b5be | 372 | m_sy=-cos(b)*(CENTER_CIRCLE)+CENTERY; |
gertk | 3:fc101c00b5be | 373 | m_ex=sin(b)*(INNER_RADIUS-10)+CENTERX; |
gertk | 3:fc101c00b5be | 374 | m_ey=-cos(b)*(INNER_RADIUS-10)+CENTERY; |
gertk | 3:fc101c00b5be | 375 | |
gertk | 3:fc101c00b5be | 376 | // advancing hour hand |
gertk | 3:fc101c00b5be | 377 | if (hour<12) |
gertk | 3:fc101c00b5be | 378 | { |
gertk | 3:fc101c00b5be | 379 | // draw hour hand with an offset |
gertk | 3:fc101c00b5be | 380 | // calculated by dividing minutes by 12 |
gertk | 3:fc101c00b5be | 381 | b=(hour*5+min/12)*m_pi; |
gertk | 3:fc101c00b5be | 382 | } |
gertk | 3:fc101c00b5be | 383 | else |
gertk | 3:fc101c00b5be | 384 | { |
gertk | 3:fc101c00b5be | 385 | // hour would be 0 offset at 12 o'clock |
gertk | 3:fc101c00b5be | 386 | // so we can leave it out of the equation... |
gertk | 3:fc101c00b5be | 387 | b=(min/12)*m_pi; |
gertk | 3:fc101c00b5be | 388 | } |
gertk | 3:fc101c00b5be | 389 | h_sx=sin(b)*(CENTER_CIRCLE)+CENTERX; |
gertk | 3:fc101c00b5be | 390 | h_sy=-cos(b)*(CENTER_CIRCLE)+CENTERY; |
gertk | 3:fc101c00b5be | 391 | h_ex=sin(b)*(INNER_RADIUS-20)+CENTERX; |
gertk | 3:fc101c00b5be | 392 | h_ey=-cos(b)*(INNER_RADIUS-20)+CENTERY; |
gertk | 3:fc101c00b5be | 393 | |
gertk | 3:fc101c00b5be | 394 | // draw 'new' hands |
gertk | 3:fc101c00b5be | 395 | lcd_line(s_sx,s_sy,s_ex,s_ey,1); |
gertk | 3:fc101c00b5be | 396 | lcd_line(m_sx,m_sy,m_ex,m_ey,1); |
gertk | 3:fc101c00b5be | 397 | lcd_line(h_sx,h_sy,h_ex,h_ey,1); |
gertk | 3:fc101c00b5be | 398 | |
gertk | 3:fc101c00b5be | 399 | lcd_circle(CENTERX,CENTERY,CENTER_CIRCLE,1); |
gertk | 3:fc101c00b5be | 400 | lcd_circle(CENTERX,CENTERY,1,1); |
gertk | 3:fc101c00b5be | 401 | |
gertk | 3:fc101c00b5be | 402 | myled = !myled; |
gertk | 3:fc101c00b5be | 403 | |
gertk | 3:fc101c00b5be | 404 | // now wait until the seconds change |
gertk | 3:fc101c00b5be | 405 | while (seconds==time(NULL)) wait(0.1); |
gertk | 3:fc101c00b5be | 406 | |
gertk | 3:fc101c00b5be | 407 | // erase 'old' hands |
gertk | 3:fc101c00b5be | 408 | lcd_line(s_sx,s_sy,s_ex,s_ey,0); |
gertk | 3:fc101c00b5be | 409 | lcd_line(m_sx,m_sy,m_ex,m_ey,0); |
gertk | 3:fc101c00b5be | 410 | lcd_line(h_sx,h_sy,h_ex,h_ey,0); |
gertk | 3:fc101c00b5be | 411 | |
gertk | 3:fc101c00b5be | 412 | } |
gertk | 3:fc101c00b5be | 413 | } |