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:
Mon Oct 17 10:24:14 2011 +0000
Revision:
4:fd7c6559a56d
Parent:
3:fc101c00b5be

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }