]> git.tdb.fi Git - model-railway-devices.git/blobdiff - firmware/s88w-r.c
Support multiple timers (currently 0 and 1)
[model-railway-devices.git] / firmware / s88w-r.c
index f64445d81c5a33f12b8f82ef1cae2ea21c7fba5d..dbd1ef175d9a7ea95279dc5bccfe85fe12c557f5 100644 (file)
@@ -27,6 +27,7 @@ D5 - S88 RESET
 #include <avr/interrupt.h>
 #include "lcd.h"
 #include "serial.h"
+#include "delay.h"
 
 #define DATA_OUT PORTD2
 #define CLOCK    PIND3
@@ -51,20 +52,22 @@ int main()
        uint8_t bits = 0;
        uint8_t n_bits = 8;
        uint8_t offset = 0;
+       uint8_t i;
 
-       DDRD = 0x06;  // 00000110
-       PIND = 0xC0;  // 11000000
-       DDRB = 0x20;  // 00100000
-       PINB = 0x1F;  // 00011111
+       DDRD = 0x06;   // 00000110
+       PORTD = 0xC0;  // 11000000
+       DDRB = 0x20;   // 00100000
+       PORTB = 0x1F;  // 00011111
 
        serial_init(9600);
-       serial_set_callback(receive);
        lcd_init();
-       lcd_on();
-       lcd_clear();
 
        sei();
 
+       lcd_clear();
+       for(i=0; i<20; ++i)
+               lcd_write('0');
+
        while(1)
        {
                uint8_t d_pins;
@@ -140,13 +143,11 @@ void receive(uint8_t c)
                                        input[j/2] = (input[j/2]&~(0xF<<shift)) | (bits<<shift);
                                        latch[j/2] = input[j/2];
                                }
-                       }
 
-                       lcd_gotoxy(0, 0);
-                       for(i=10; i--;)
-                       {
-                               lcd_write(hexdigit(input[i]>>4));
-                               lcd_write(hexdigit(input[i]));
+                               lcd_gotoxy(19-offset-nibbles, 0);
+                               for(i=0; i<=nibbles; ++i)
+                                       lcd_write(rx_buf[3+i]);
+                               log_pos |= 0x80;
                        }
                }
                rx_fill = 0xFF;
@@ -164,10 +165,13 @@ void receive(uint8_t c)
        ++log_pos;
        if(log_pos>=60)
                log_pos = 0;
-       lcd_gotoxy(log_pos%20, 1+log_pos/20);
+       if(log_pos%20==0)
+               lcd_gotoxy(log_pos%20, 1+log_pos/20);
        lcd_write(255);
 }
 
+SERIAL_SET_CALLBACK(receive)
+
 uint8_t hexdigit(uint8_t n)
 {
        n &= 0xF;