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:
Tue Jun 28 17:02:24 2011 +0000
Revision:
3:fc101c00b5be
Parent:
2:9071445a6895
Child:
4:fd7c6559a56d

        

Who changed what in which revision?

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