const int SPICLK = 13; const int SPIMOSI = 11; const int SPIMISO = 12; const int SPISS = 10; void SPIinit(void) { pinMode (SPICLK, OUTPUT); pinMode (SPIMOSI, OUTPUT); pinMode (SPIMISO, OUTPUT); pinMode (SPISS, OUTPUT); digitalWrite (SPISS, 1); SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR1) | _BV(SPR0); } char SPI(char d) { // send character over SPI char received = 0; SPDR = d; while(!(SPSR & _BV(SPIF))); received = SPDR; return (received); } void SPI_startpkt (void) { digitalWrite (SPISS, 0); } void SPI_endpkt (void) { digitalWrite (SPISS, 1); } static unsigned char addr = 0x82; #define WAIT1 25 #define WAIT2 15 void send_lcd (unsigned char rnum, unsigned char len, char *s) { SPI_startpkt (); delayMicroseconds (WAIT1); SPI (addr); delayMicroseconds (WAIT2); SPI (rnum); delayMicroseconds (WAIT2); while (len--) { SPI (*s++); delayMicroseconds (WAIT2); } SPI_endpkt (); } void write_lcd (char *s) { send_lcd (0, strlen (s), s); } void write_at_lcd (unsigned char x, unsigned char y, char *s) { char c; c = (y << 5) | (x & 0x1f); send_lcd (0x11, 1, &c); write_lcd (s); } void cls_lcd (void) { char c; send_lcd (0x10, 1, &c); } void set_var (unsigned char addr, unsigned char a, unsigned char v) { SPI_startpkt (); delayMicroseconds (WAIT1); SPI (addr); delayMicroseconds (WAIT2); SPI (a); delayMicroseconds (WAIT2); SPI (v); delayMicroseconds (WAIT2); SPI_endpkt (); } static unsigned char spi_servo_addr = 0x86; static unsigned char spi_7fet_addr = 0x88; void set_servo_var (unsigned char a, unsigned char v) { set_var (spi_servo_addr, a, v); } void set_7fet_var (unsigned char a, unsigned char v) { set_var (spi_7fet_addr, a, v); } void setup (void) { int i; SPIinit (); Serial.begin (9600); DDRC = 0x30; PORTC = 0x20; for (i=0;i<10;i++) { PINC = 0x30; delay (300); } cls_lcd (); } void loop (void) { static long nextupdate = 1000; static unsigned char h, m, s; char buf[17]; if (millis () > nextupdate) { nextupdate += 1000; if (s < 59) s++; else { s = 0; if (m < 59) m++; else { m = 0; if (h < 23) h++; else { h = 0; // days ++; } } } sprintf (buf, "%02d:%02d:%02d", h, m, s); write_at_lcd (8, 1, buf); Serial.write (buf); Serial.write ("\r\n"); // sprintf (buf, "%ld %ld", nextupdate, millis ()); // write_at_lcd (0, 0, buf); // delay (100); } { static unsigned char olds; if (olds != s) { olds = s; set_servo_var (0x20, (s & 0xf) << 4); } } { static unsigned char olds; if (olds != s) { static unsigned char values[4] = { 1, 4, 2, 8}; olds = s; set_7fet_var (0x10, values [s & 0x3]); } } }