const uint8_t digits_32px_data[] PROGMEM = {
- 0x1B, 0x00, 0x1B, 0x08, 0x00, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x09,
+ 0x1A, 0x00, 0x1A, 0x08, 0x00, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x09,
- 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF,
0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00,
- 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
- 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF8, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x01,
- 0xE0, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x0F, 0xF8, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0x3F,
- 0xFC, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0x03, 0xC0, 0x7F, 0x7F, 0x00, 0x00, 0xFE,
- 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8,
- 0x3F, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0xFE, 0xFE, 0x03, 0xC0, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F,
- 0xFC, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x3F, 0xF8, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0xFF, 0x0F,
- 0xE0, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xF0, 0x03, 0x00, 0xFC, 0xF0, 0x03, 0x00, 0xFC, 0xF8, 0x01, 0x00, 0xFC, 0xF8, 0x01, 0x00, 0xFC,
- 0xFC, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0x7E, 0x00, 0x00, 0xFC,
- 0x7E, 0x00, 0x00, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
+ 0x00, 0xF8, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x0F,
+ 0xF8, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x7F,
+ 0xFE, 0x03, 0xC0, 0x7F, 0x7F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xF8,
+ 0x1F, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0xFE,
+ 0xFE, 0x03, 0xC0, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x3F,
+ 0xF8, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x01,
+ 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0xFC, 0xF0, 0x03, 0x00, 0xFC,
+ 0xF8, 0x01, 0x00, 0xFC, 0xF8, 0x01, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFC,
+ 0xFC, 0x00, 0x00, 0xFC, 0x7E, 0x00, 0x00, 0xFC, 0x7E, 0x00, 0x00, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC,
+ 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC,
- 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0xF8, 0xFC, 0x01, 0x00, 0xFC,
- 0xFC, 0x00, 0x00, 0xFE, 0x7E, 0x00, 0x00, 0xFF, 0x7E, 0x00, 0x80, 0xFF, 0x3E, 0x00, 0xC0, 0xFF,
- 0x3E, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0xF8, 0xFF,
- 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFE, 0xFD, 0x1F, 0x00, 0xFF, 0xFC, 0x3F, 0x80, 0x7F, 0xFC,
- 0x3F, 0xC0, 0x3F, 0xFC, 0xFF, 0xE0, 0x3F, 0xFC, 0xFF, 0xFF, 0x1F, 0xFC, 0xFE, 0xFF, 0x0F, 0xFC,
- 0xFE, 0xFF, 0x07, 0xFC, 0xFC, 0xFF, 0x03, 0xFC, 0xFC, 0xFF, 0x01, 0xFC, 0xF8, 0xFF, 0x00, 0xFC,
- 0xF0, 0x7F, 0x00, 0xFC, 0xC0, 0x1F, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8,
+ 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00,
+ 0xF8, 0x01, 0x00, 0xF8, 0xFC, 0x01, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFE, 0x7E, 0x00, 0x00, 0xFF,
+ 0x7E, 0x00, 0x80, 0xFF, 0x3E, 0x00, 0xC0, 0xFF, 0x3E, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xE0, 0xFF,
+ 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFE, 0xFD,
+ 0x1F, 0x00, 0xFF, 0xFC, 0x3F, 0x80, 0x7F, 0xFC, 0x3F, 0xC0, 0x3F, 0xFC, 0xFF, 0xE0, 0x3F, 0xFC,
+ 0xFF, 0xFF, 0x1F, 0xFC, 0xFE, 0xFF, 0x0F, 0xFC, 0xFE, 0xFF, 0x07, 0xFC, 0xFC, 0xFF, 0x03, 0xFC,
+ 0xFC, 0xFF, 0x01, 0xFC, 0xF8, 0xFF, 0x00, 0xFC, 0xF0, 0x7F, 0x00, 0xFC, 0xC0, 0x1F, 0x00, 0xFC,
+ 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x7C,
+ 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0xE0, 0x03, 0xF8,
0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8,
- 0x1F, 0xE0, 0x03, 0xF8, 0x3F, 0xF0, 0x03, 0xF8, 0x3F, 0xF0, 0x07, 0xFC, 0x7F, 0xF8, 0x07, 0xFC,
- 0xFF, 0xFF, 0x1F, 0x7E, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xBF, 0xFF, 0x7F,
- 0xFC, 0xBF, 0xFF, 0x3F, 0xFC, 0x1F, 0xFF, 0x3F, 0xF8, 0x0F, 0xFE, 0x1F, 0xE0, 0x07, 0xFC, 0x0F,
- 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x03,
- 0x00, 0x00, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0xF8, 0xF7, 0x03,
- 0x00, 0xFC, 0xF3, 0x03, 0x00, 0xFE, 0xF1, 0x03, 0x80, 0x7F, 0xF0, 0x03, 0xC0, 0x3F, 0xF0, 0x03,
- 0xF0, 0x0F, 0xF0, 0x03, 0xF8, 0x07, 0xF0, 0x03, 0xFE, 0x03, 0xF0, 0x03, 0xFE, 0x00, 0xF0, 0x03,
+ 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x3F, 0xF0, 0x03, 0xF8,
+ 0x3F, 0xF0, 0x07, 0xFC, 0x7F, 0xF8, 0x07, 0xFC, 0xFF, 0xFF, 0x1F, 0x7E, 0xFE, 0xFF, 0xFF, 0x7F,
+ 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xBF, 0xFF, 0x7F, 0xFC, 0xBF, 0xFF, 0x3F, 0xFC, 0x1F, 0xFF, 0x3F,
+ 0xF8, 0x0F, 0xFE, 0x1F, 0xE0, 0x07, 0xFC, 0x0F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0x03,
+ 0x00, 0xE0, 0xFF, 0x03, 0x00, 0xF8, 0xF7, 0x03, 0x00, 0xFC, 0xF3, 0x03, 0x00, 0xFE, 0xF1, 0x03,
+ 0x80, 0x7F, 0xF0, 0x03, 0xC0, 0x3F, 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x03, 0xF8, 0x07, 0xF0, 0x03,
+ 0xFE, 0x03, 0xF0, 0x03, 0xFE, 0x00, 0xF0, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, 0x03,
- 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x3F, 0xFE, 0xFF, 0x01, 0x7E, 0xFE, 0xFF, 0x00, 0x7E, 0xFE, 0xFF, 0x00, 0x7C,
- 0xFE, 0xFF, 0x00, 0x7C, 0xFE, 0x7F, 0x00, 0xFC, 0xFE, 0x7F, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8,
- 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8,
- 0x7E, 0xFC, 0x00, 0xFC, 0x7E, 0xFC, 0x00, 0xFC, 0x7E, 0xFC, 0x01, 0xFE, 0x7E, 0xFC, 0x03, 0x7F,
- 0x7E, 0xF8, 0xFF, 0x7F, 0x7E, 0xF8, 0xFF, 0x7F, 0x7E, 0xF0, 0xFF, 0x3F, 0x7E, 0xF0, 0xFF, 0x3F,
- 0x7E, 0xE0, 0xFF, 0x1F, 0x7E, 0xC0, 0xFF, 0x0F, 0x7E, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x01,
- 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x07,
- 0xE0, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0x1F, 0xF8, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x7F,
- 0xFC, 0xFF, 0xFF, 0x7F, 0xFE, 0xE3, 0xFF, 0x7F, 0xFE, 0xF0, 0x03, 0xFE, 0x7F, 0xF0, 0x01, 0xFC,
- 0x3F, 0xF8, 0x00, 0xF8, 0x3F, 0xF8, 0x00, 0xF8, 0x3F, 0xF8, 0x00, 0xF8, 0x1F, 0xF8, 0x00, 0xF8,
- 0x1F, 0xF8, 0x00, 0xF8, 0x1F, 0xF8, 0x01, 0xFC, 0x1F, 0xF8, 0x03, 0xFE, 0x1F, 0xF8, 0xFF, 0x7F,
- 0x1F, 0xF0, 0xFF, 0x7F, 0x3F, 0xF0, 0xFF, 0x7F, 0x3F, 0xE0, 0xFF, 0x3F, 0x3E, 0xE0, 0xFF, 0x1F,
- 0x7E, 0xC0, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xC0, 0x7E, 0x00, 0x00, 0xF0, 0x7E, 0x00, 0x00, 0xFC,
- 0x7E, 0x00, 0x00, 0xFF, 0x7E, 0x00, 0xC0, 0xFF, 0x7E, 0x00, 0xF8, 0xFF, 0x7E, 0x00, 0xFE, 0xFF,
- 0x7E, 0x80, 0xFF, 0xFF, 0x7E, 0xE0, 0xFF, 0x3F, 0x7E, 0xF8, 0xFF, 0x0F, 0x7E, 0xFE, 0xFF, 0x03,
- 0xFE, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0xFE, 0xFF, 0x01, 0x00,
- 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0xFC, 0x0F,
- 0xF8, 0x1F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x3F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFF, 0x7F,
- 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x7F, 0xF8, 0x07, 0xFC,
- 0x3F, 0xF0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8,
- 0x3F, 0xF0, 0x03, 0xF8, 0x7F, 0xF8, 0x07, 0xFC, 0xFF, 0xFF, 0x0F, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0x7F, 0xFF, 0x7F, 0xFC, 0x3F, 0xFF, 0x7F, 0xFC, 0x3F, 0xFE, 0x3F,
- 0xF8, 0x1F, 0xFE, 0x1F, 0xE0, 0x07, 0xFC, 0x0F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x03, 0x7E, 0xF8, 0xFF, 0x07, 0x7C,
- 0xFC, 0xFF, 0x07, 0xFC, 0xFE, 0xFF, 0x0F, 0xFC, 0xFE, 0xFF, 0x0F, 0xF8, 0xFE, 0xFF, 0x1F, 0xF8,
- 0x7F, 0xC0, 0x1F, 0xF8, 0x3F, 0x80, 0x1F, 0xF8, 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0x00, 0x1F, 0xF8,
- 0x1F, 0x00, 0x1F, 0xFC, 0x1F, 0x00, 0x1F, 0xFC, 0x3F, 0x80, 0x0F, 0xFE, 0x7F, 0xC0, 0x0F, 0x7F,
- 0xFE, 0xFF, 0xC7, 0x7F, 0xFE, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x1F,
- 0xF8, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x00,
- 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F,
+ 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF0, 0x03,
+ 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0xFF, 0x01, 0x7E,
+ 0xFE, 0xFF, 0x00, 0x7E, 0xFE, 0xFF, 0x00, 0x7C, 0xFE, 0xFF, 0x00, 0x7C, 0xFE, 0x7F, 0x00, 0xFC,
+ 0xFE, 0x7F, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8,
+ 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0x7C, 0x00, 0xF8, 0x7E, 0xFC, 0x00, 0xFC, 0x7E, 0xFC, 0x00, 0xFC,
+ 0x7E, 0xFC, 0x01, 0xFE, 0x7E, 0xFC, 0x03, 0x7F, 0x7E, 0xF8, 0xFF, 0x7F, 0x7E, 0xF8, 0xFF, 0x7F,
+ 0x7E, 0xF0, 0xFF, 0x3F, 0x7E, 0xF0, 0xFF, 0x3F, 0x7E, 0xE0, 0xFF, 0x1F, 0x7E, 0xC0, 0xFF, 0x0F,
+ 0x7E, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0x1F,
+ 0xF8, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0x7F, 0xFE, 0xE3, 0xFF, 0x7F,
+ 0xFE, 0xF0, 0x03, 0xFE, 0x7F, 0xF0, 0x01, 0xFC, 0x3F, 0xF8, 0x00, 0xF8, 0x3F, 0xF8, 0x00, 0xF8,
+ 0x3F, 0xF8, 0x00, 0xF8, 0x1F, 0xF8, 0x00, 0xF8, 0x1F, 0xF8, 0x00, 0xF8, 0x1F, 0xF8, 0x01, 0xFC,
+ 0x1F, 0xF8, 0x03, 0xFE, 0x1F, 0xF8, 0xFF, 0x7F, 0x1F, 0xF0, 0xFF, 0x7F, 0x3F, 0xF0, 0xFF, 0x7F,
+ 0x3F, 0xE0, 0xFF, 0x3F, 0x3E, 0xE0, 0xFF, 0x1F, 0x7E, 0xC0, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0x07,
+ 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xC0,
+ 0x7E, 0x00, 0x00, 0xF0, 0x7E, 0x00, 0x00, 0xFC, 0x7E, 0x00, 0x00, 0xFF, 0x7E, 0x00, 0xC0, 0xFF,
+ 0x7E, 0x00, 0xF8, 0xFF, 0x7E, 0x00, 0xFE, 0xFF, 0x7E, 0x80, 0xFF, 0xFF, 0x7E, 0xE0, 0xFF, 0x3F,
+ 0x7E, 0xF8, 0xFF, 0x0F, 0x7E, 0xFE, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0x3F, 0x00,
+ 0xFE, 0xFF, 0x07, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00,
+ 0xFE, 0x07, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFE, 0x3F,
+ 0xFC, 0x3F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x0F, 0xFE, 0x7F, 0xF8, 0x07, 0xFC, 0x3F, 0xF0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8,
+ 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x03, 0xF8, 0x3F, 0xF0, 0x03, 0xF8, 0x7F, 0xF8, 0x07, 0xFC,
+ 0xFF, 0xFF, 0x0F, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0x7F, 0xFF, 0x7F,
+ 0xFC, 0x3F, 0xFF, 0x7F, 0xFC, 0x3F, 0xFE, 0x3F, 0xF8, 0x1F, 0xFE, 0x1F, 0xE0, 0x07, 0xFC, 0x0F,
+ 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00,
+ 0xF0, 0xFF, 0x03, 0x7E, 0xF8, 0xFF, 0x07, 0x7C, 0xFC, 0xFF, 0x07, 0xFC, 0xFE, 0xFF, 0x0F, 0xFC,
+ 0xFE, 0xFF, 0x0F, 0xF8, 0xFE, 0xFF, 0x1F, 0xF8, 0x7F, 0xC0, 0x1F, 0xF8, 0x3F, 0x80, 0x1F, 0xF8,
+ 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0x00, 0x1F, 0xFC, 0x1F, 0x00, 0x1F, 0xFC,
+ 0x3F, 0x80, 0x0F, 0xFE, 0x7F, 0xC0, 0x0F, 0x7F, 0xFE, 0xFF, 0xC7, 0x7F, 0xFE, 0xFF, 0xFF, 0x3F,
+ 0xFE, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x1F, 0xF8, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0x07,
+ 0xE0, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F,
- 0xC0, 0x3F, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
};
-const struct font_info digits_32px PROGMEM = {0x44+(0x05<<8),0x1C,0x20,0x2B,0x3A,digits_32px_data,(uint8_t*)digits_32px_data+0x3A-0x2B+1};
+const struct font_info digits_32px PROGMEM = {1340,0x1B,0x20,0x2B,0x3A,digits_32px_data,(uint8_t*)digits_32px_data+0x3A-0x2B+1};
#endif
#define FIRMWARE_VERSION 0x001
-#define KP_C1_ON() PORTD |= (1 << PD7)
-#define KP_C1_OFF() PORTD &= ~(1 << PD7)
-#define KP_C2_ON() PORTC |= (1 << PC6)
-#define KP_C2_OFF() PORTC &= ~(1 << PC6)
-#define KP_C3_ON() PORTC |= (1 << PC7)
-#define KP_C3_OFF() PORTC &= ~(1 << PC7)
-#define KP_C4_ON() PORTE |= (1 << PE2)
-#define KP_C4_OFF() PORTE &= ~(1 << PE2)
-
-#define KP_R1() ((PIND & (1<<PD3))?1:0)
-#define KP_R2() ((PIND & (1<<PD5))?1:0)
-#define KP_R3() ((PIND & (1<<PD6))?1:0)
-#define KP_R4() ((PIND & (1<<PD4))?1:0)
-
-#define ENABLE_M2() PORTF |= (1 << PF0)
-#define DISABLE_M2() PORTF &= ~(1 << PF0)
-
-#define ENABLE_M1() PORTF |= (1 << PF7)
-#define DISABLE_M1() PORTF &= ~(1 << PF7)
+#define KP_C1_OFF() PORTD |= (1 << PD7)
+#define KP_C1_ON() PORTD &= ~(1 << PD7)
+#define KP_C2_OFF() PORTC |= (1 << PC6)
+#define KP_C2_ON() PORTC &= ~(1 << PC6)
+#define KP_C3_OFF() PORTC |= (1 << PC7)
+#define KP_C3_ON() PORTC &= ~(1 << PC7)
+#define KP_C4_OFF() PORTE |= (1 << PE2)
+#define KP_C4_ON() PORTE &= ~(1 << PE2)
+
+#define KP_R1() ((PIND & (1<<PD3))?0:1)
+#define KP_R2() ((PIND & (1<<PD5))?0:1)
+#define KP_R3() ((PIND & (1<<PD6))?0:1)
+#define KP_R4() ((PIND & (1<<PD4))?0:1)
+
+#define DISABLE_M2() PORTF |= (1 << PF0)
+#define ENABLE_M2() PORTF &= ~(1 << PF0)
+
+#define DISABLE_M1() PORTF |= (1 << PF7)
+#define ENABLE_M1() PORTF &= ~(1 << PF7)
#define PULSE_HIGH_M2() PORTF |= (1 << PF4)
#define PULSE_LOW_M2() PORTF &= ~(1 << PF4)
#define DIRECTION_FORWARD_M2() PORTF |= (1 << PF1)
#define DIRECTION_BACKWARD_M2() PORTF &= ~(1 << PF1)
-#define DIRECTION_FORWARD_M1() PORTF |= (1 << PF6)
-#define DIRECTION_BACKWARD_M1() PORTF &= ~(1 << PF6)
+#define DIRECTION_BACKWARD_M1() PORTF |= (1 << PF6)
+#define DIRECTION_FORWARD_M1() PORTF &= ~(1 << PF6)
-
-volatile int32_t M1_STEPS = 0;
-volatile int32_t M2_STEPS = 0;
-
-volatile uint8_t M1_ACTIVE = 0;
-volatile uint8_t M2_ACTIVE = 0;
-
-volatile uint8_t M1_ENABLE = 0;
-volatile uint8_t M2_ENABLE = 0;
+uint8_t motor_active = 0;
+volatile uint32_t M1_STEPS = 0;
+volatile uint32_t M2_STEPS = 0;
+volatile uint8_t halfstep = 0;
+volatile uint8_t M1_DIR = 0;
+volatile uint8_t M2_DIR = 0;
volatile uint8_t M1_SWITCH_LOW = 0;
volatile uint8_t M2_SWITCH_LOW = 0;
volatile uint8_t M2_SWITCH_HIGH = 0;
volatile uint8_t switch_changed = 0;
+volatile int32_t M1_position = 100000;
+volatile int32_t M2_position = 100000;
+uint32_t stepsize = 32;
+int32_t inputbuffer = 0;
+uint32_t last_inputbuffer = 1;
+uint8_t negativeinput = 0;
uint16_t time;
uint8_t rxcnt = 0, txpoint = 0;
uint8_t rxbuf[15];
uint8_t txbuf[15];
-color_t colors[6];
+color_t colors[16];
color_t topback;
-uint8_t keypad[16] = {0};
+volatile uint8_t keypad[16] = {0};
+volatile uint16_t keystate = 0;
+uint8_t numlock = 0;
+uint8_t speed = 4;
+
+uint8_t speeds[8] = {128,64,48,32,16,8,4,2};
+ //0 128 0.25k
+ //1 64 0.5k
+ //2 48 0.66k
+ //3 32 1k
+ //4 16 1.95k
+ //5 8 3.9k
+ //6 4 7.8k
+ //7 2 15.6k
/*****************************************************************
* Command Handling
txbuf[10] =nib_to_hex(v, 0);
txbuf[11] = '\n';
txbuf[12] = 0;
- send_answer_buf(txbuf,12);
+ usb_serial_write(txbuf, 12);
+ usb_serial_flush_output();
+ // send_answer_buf(txbuf);
}
-
+//R0100000000
/*****************************************************************
* Setting functions
*****************************************************************/
-
+// uint16_t keystate_old = 0;
+uint8_t keyupdate = 0;
/*****************************************************************
* Interrupts
*****************************************************************/
-ISR(TIMER0_OVF_vect) {
+ISR(TIMER0_COMPA_vect) {
// interupt for time, watchdog, keypad
time++;
-
+ asm volatile("wdr");
+
KP_C1_ON(); asm volatile("nop");
- uint8_t t = 0;
- keypad[0] += KP_R1();
- keypad[1] += KP_R2();
- keypad[2] += KP_R3();
- keypad[3] += KP_R4();
- KP_C1_OFF(); asm volatile("nop");
+ uint16_t tmp_keystate = 0;
+ if ( KP_R1()) tmp_keystate |= (1 << 0);
+ if ( KP_R2()) tmp_keystate |= (1 << 1);
+ if ( KP_R3()) tmp_keystate |= (1 << 2);
+ if ( KP_R4()) tmp_keystate |= (1 << 3);
+
+ KP_C1_OFF();
KP_C2_ON(); asm volatile("nop");
- uint8_t t = 0;
- keypad[4] += KP_R1();
- keypad[5] += KP_R2();
- keypad[6] += KP_R3();
- keypad[7] += KP_R4();
- KP_C2_OFF(); asm volatile("nop");
+ if ( KP_R1()) tmp_keystate |= (1 << 4);
+ if ( KP_R2()) tmp_keystate |= (1 << 5);
+ if ( KP_R3()) tmp_keystate |= (1 << 6);
+ if ( KP_R4()) tmp_keystate |= (1 << 7);
+ KP_C2_OFF();
KP_C3_ON(); asm volatile("nop");
- uint8_t t = 0;
- keypad[8] += KP_R1();
- keypad[9] += KP_R2();
- keypad[10] += KP_R3();
- keypad[11] += KP_R4();
- KP_C3_OFF(); asm volatile("nop");
+ if ( KP_R1()) tmp_keystate |= (1 << 8);
+ if ( KP_R2()) tmp_keystate |= (1 << 9);
+ if ( KP_R3()) tmp_keystate |= (1 << 10);
+ if ( KP_R4()) tmp_keystate |= (1 << 11);
+ KP_C3_OFF();
KP_C4_ON(); asm volatile("nop");
- uint8_t t = 0;
- keypad[12] += KP_R1();
- keypad[13] += KP_R2();
- keypad[14] += KP_R3();
- keypad[15] += KP_R4();
- KP_C4_OFF(); asm volatile("nop");
+ if ( KP_R1()) tmp_keystate |= (1 << 12);
+ if ( KP_R2()) tmp_keystate |= (1 << 13);
+ if ( KP_R3()) tmp_keystate |= (1 << 14);
+ if ( KP_R4()) tmp_keystate |= (1 << 15);
+ KP_C4_OFF();
+
+ // keystate_old = keystate;
+ keystate = tmp_keystate;
+ keyupdate = 1;
+ uint8_t j = 0;
+ for(uint16_t i = 1; i != 0 ; i <<= 1) {
+ if(tmp_keystate & i) {
+ if (keypad[j] < 200)
+ keypad[j]++;
+ }
+ else if (keypad[j] == 255) {
+ keypad[j] = 0;
+ }
+ j++;
+ }
- asm volatile("wdr");
}
+ISR(TIMER1_COMPA_vect) {
+
+ // if (M1_STEPS > 0) {
+ if (halfstep) {
+ if (M1_DIR) {
+ // DIRECTION_FORWARD_M1();
+ if (M1_SWITCH_HIGH)
+ M1_STEPS = 0;
+ }
+ else {
+ // DIRECTION_BACKWARD_M1();
+ if (M1_SWITCH_LOW)
+ M1_STEPS = 0;
+ }
+ // if (!motor_active) M1_STEPS = 0;
+ if (M1_STEPS > 0) {
+ M1_STEPS--;
+ M1_position += 2*M1_DIR-1;
+ PULSE_HIGH_M1();
+ }
+ }
+ else {
+ PULSE_LOW_M1();
+ }
+ // }
+
+ // if (M2_STEPS > 0) {
+ if (halfstep) {
+ if (M2_DIR) {
+ // DIRECTION_FORWARD_M2();
+ if (M2_SWITCH_HIGH)
+ M2_STEPS = 0;
+ }
+ else {
+ // DIRECTION_BACKWARD_M2();
+ if (M2_SWITCH_LOW)
+ M2_STEPS = 0;
+ }
+ // if (!motor_active) M2_STEPS = 0;
+ if (M2_STEPS > 0) {
+ M2_STEPS--;
+ M2_position += 2*M2_DIR-1;
+ PULSE_HIGH_M2();
+ }
+ }
+ else {
+ PULSE_LOW_M2();
+ }
+ // }
+
+ halfstep = 1 - halfstep;
+}
+
ISR(PCINT0_vect) {
// interupt for switches
- M1_SWITCH_LOW = (PINB & (1<<PB6))? 1 : 0;
- M1_SWITCH_HIGH = (PINB & (1<<PB5))? 1 : 0;
- M2_SWITCH_LOW = (PINB & (1<<PB4))? 1 : 0;
- M2_SWITCH_HIGH = (PINB & (1<<PB7))? 1 : 0;
+ M1_SWITCH_LOW = (PINB & (1<<PB5))? 0 : 1;
+ M1_SWITCH_HIGH = (PINB & (1<<PB6))? 0 : 1;
+ M2_SWITCH_LOW = (PINB & (1<<PB4))? 0 : 1;
+ M2_SWITCH_HIGH = (PINB & (1<<PB7))? 0 : 1;
switch_changed = 1;
}
+
+
+void init_spi_lcd() {
+}
+
/*****************************************************************
* Communication
*****************************************************************/
}
}
-
+// R0000000000
/*****************************************************************
* Main function
*****************************************************************/
PORTC = 0b00000000;
DDRC = 0b11000000;
- PORTD = 0b01111000;
+ PORTD = 0b01111100;
DDRD = 0b10000100;
PORTE = 0b00000000;
DDRE = 0b01000100;
- PORTF = 0b00000000;
+ PORTF = 0b10000001;
DDRF = 0b11110011;
- // Timer0 at 30 Hz overflow
- TCCR0B = (5 << CS00);
- TIMSK0 = (1 << TOIE0); // Overflow interrupt`
+ // Timer0 at 50 Hz CTC
+ TCCR0A = (2 << WGM00); // CTC mode
+ TCCR0B = (5 << CS00); //1024 prescaler
+ OCR0A = 160;
+ TIMSK0 = (1 << OCIE0A); // Overflow interrupt
//SPI for display
SPCR = 0 << SPIE | 1 << SPE | 0 << DORD | 1 << MSTR | 1 << CPOL | 1 << CPHA | 0 << SPR1 | 0 << SPR0;
PCMSK0 = 0xf0;
//Timer for motor Controller
+ TCCR1A = 0;
+ TCCR1B = (4 << CS00) | (1 << WGM12); //256 prescaler, CTC mode
+ OCR1A = 16; //1.95 kHz
+ TIMSK1 = (1 << OCIE1A); //overflow interrupt
+
+
//I2C for current monitor
-
+ usb_init();
_delay_ms(200);
- lcd_init();
+ lcd_init();
lcd_set_color(colors+0,0x1f,0x3f,0x0e); //yellow 1st
lcd_set_color(colors+1,0x1f,0x3f,0x0e); //yellow 2nd
lcd_set_color(colors+2,0x1f,0x3f,0x1f); //second curve
lcd_set_color(colors+3,0x0e,0x3f,0x0f); //green
lcd_set_color(colors+4,0x0e,0x1f,0x1f); //blue cool
- lcd_set_color(colors+5,0x1f,0x09,0x01); //red heat
-
+ lcd_set_color(colors+5,0x1f,0x0f,0x05); //red heat
+ lcd_set_color(colors+6,0,0,0); //black
+
lcd_set_color(&topback,0x03,0x04,0x05);
- // lcd_command_1(LCD_MIRROR, LCD_BGR | LCD_FLIP_XY);
+ lcd_command_1(LCD_MIRROR, LCD_BGR | LCD_FLIP_XY);
lcd_command(LCD_ON);
- lcd_use_background(topback);
+ lcd_use_background(colors[6]);
+ lcd_use_foreground(colors[0]);
lcd_set_area_xy(0, 0x13F, 0, 0xEF);
- lcd_set_font(font_proportional_16px,SPACING);
- lcd_use_background(topback);
- lcd_putstr_xy_P(PSTR("Step Motor Controller"),32,0);
+ lcd_set_font(FONT_PROP_16,SPACING);
+ lcd_putstr_xy_P(PSTR("Step Motor Controller"),2,0);
+ lcd_putstr_xy_P(PSTR("X"),72,2);
+ lcd_putstr_xy_P(PSTR("Y"),112,2);
+ lcd_putstr_xy_P(PSTR("S"),208,2);
+ lcd_use_foreground(colors[5]);
+ lcd_putstr_xy_P(PSTR("off"),16,280);
+ lcd_use_foreground(colors[0]);
+ lcd_putstr_xy_P(PSTR("<-->"),32,280);
+ lcd_putstr_xy_P(PSTR("Sp 4"),48,280);
+ lcd_set_font(FONT_DIGITS_32,SPACING);
+ LCD_MOVE_TO(200,46);
+ lcd_put_long(stepsize);
+ lcd_set_font(FONT_PROP_16,SPACING);
uint16_t lasttime = 0;
+ for (uint8_t i = 0; i < 16; i++) keypad[i] = 0;
+
while (1) {
- // int n = usb_serial_getchar();
- // if (n >= 0) {
- // isMaster = 1;
- // //SELECT_MASTER();
- // getdata(n);
- // }
+ int n = usb_serial_getchar();
+ if (n >= 0) {
+ getdata(n);
+ }
if ((time != lasttime)) {
if(switch_changed) {
- lcd_set_font(font_fixed_16px,SPACING);
- uint8_t[6] text;
- text[0] = M1_SWITCH_LOW ? '_':'X';
- text[1] = M1_SWITCH_HIGH ? '_':'X';
- text[2] = ' ';
- text[3] = M2_SWITCH_LOW ? '_':'X';
- text[4] = M2_SWITCH_HIGH ? '_':'X';
- text[5] = 0;
- lcd_putstr_xy(text,32,0);
+ switch_changed = 0;
+ lcd_set_font(FONT_PROP_16,SPACING);
+ lcd_use_foreground(colors[5]);
+ if(M1_SWITCH_LOW) lcd_putstr_xy_P(PSTR("min"),72,240);
+ if(M1_SWITCH_HIGH) lcd_putstr_xy_P(PSTR("max"),72,240);
+ if(M2_SWITCH_LOW) lcd_putstr_xy_P(PSTR("min"),112,240);
+ if(M2_SWITCH_HIGH) lcd_putstr_xy_P(PSTR("max"),112,240);
+ if(!M1_SWITCH_LOW && !M1_SWITCH_HIGH) lcd_set_area_xy(240, 280, 72, 88);
+ if(!M2_SWITCH_LOW && !M2_SWITCH_HIGH) lcd_set_area_xy(240, 280, 112, 128);
+ lcd_use_foreground(colors[0]);
+ }
+
+//ABCD
+ if(keyupdate) {
+ keyupdate = 0;
+
+ lcd_set_font(FONT_PROP_16,SPACING);
+ if(keypad[12] && keypad[12] != 255) { //A
+ if (motor_active) {
+ motor_active = 0;
+ DISABLE_M1();
+ DISABLE_M2();
+ M1_STEPS = 0;
+ M2_STEPS = 0;
+ lcd_use_foreground(colors[5]);
+ lcd_putstr_xy_P(PSTR("off"),16,280);
+ lcd_use_foreground(colors[0]);
+ }
+ else {
+ motor_active = 1;
+ ENABLE_M1();
+ ENABLE_M2();
+ lcd_use_foreground(colors[3]);
+ lcd_putstr_xy_P(PSTR("ON "),16,280);
+ lcd_use_foreground(colors[0]);
+ }
+ keypad[12] = 255;
+ }
+ if(keypad[13] && keypad[13] != 255) { //B
+ numlock = 1 - numlock;
+ if (numlock) {
+ lcd_set_area_xy(280,320,32,48);
+ lcd_putstr_xy_P(PSTR("NUM"),32,280);
+ }
+ else {
+ lcd_set_area_xy(280,320,32,48);
+ lcd_putstr_xy_P(PSTR("<-->"),32,280);
+ lcd_set_area_xy(240,320,224,240);
+ inputbuffer = 0;
+ negativeinput = 0;
+ }
+ keypad[13] = 255;
}
+//Cursor Keys
+ if(!numlock) {
+ if(keypad[14] && keypad[14] != 255) { //C
+ cli();
+ M1_position = 0;
+ M2_position = 0;
+ sei();
+ keypad[14] = 255;
+ }
+ if(keypad[15] && keypad[15] != 255) { //D
+ cli();
+ M1_STEPS = 0;
+ M2_STEPS = 0;
+ sei();
+ keypad[14] = 255;
+ }
+
+ if(keypad[4]) { //2
+ if (keypad[4] < 20 || keypad[4] > 40) {
+ if(M2_STEPS == 0 && motor_active) {
+ DIRECTION_FORWARD_M2();
+ M2_DIR = 1;
+ M2_STEPS = stepsize;
+ }
+ }
+ if(keypad[4] < 20) keypad[4] = 20;
+ if (!(keystate & (1<<4))) keypad[4] = 255;
+ }
+
+ if(keypad[6]) { //8
+ if (keypad[6] < 20 || keypad[6] > 40) {
+ if(M2_STEPS == 0 && motor_active) {
+ DIRECTION_BACKWARD_M2();
+ M2_DIR = 0;
+ M2_STEPS = stepsize;
+ }
+ }
+ if(keypad[6] < 20) keypad[6] = 20;
+ if (!(keystate & (1<<6))) keypad[6] = 255;
+ }
+
+ if(keypad[1]) { //4
+ if (keypad[1] < 20 || keypad[1] > 40) {
+ if(M1_STEPS == 0 && motor_active) {
+ DIRECTION_BACKWARD_M1();
+ M1_DIR = 0;
+ M1_STEPS = stepsize;
+ }
+ }
+ if(keypad[1] < 20) keypad[1] = 20;
+ if (!(keystate & (1<<1))) keypad[1] = 255;
+ }
+
+ if(keypad[9]) { //6
+ if (keypad[9] < 20 || keypad[9] > 40) {
+ if(M1_STEPS == 0 && motor_active) {
+ DIRECTION_FORWARD_M1();
+ M1_DIR = 1;
+ M1_STEPS = stepsize;
+ }
+ }
+ if(keypad[9] < 20) keypad[9] = 20;
+ if (!(keystate & (1<<9))) keypad[9] = 255;
+ }
+ inputbuffer = 0;
+ }
+//Number input
+ else {
+ if( keypad[0] && keypad[0] != 255) { inputbuffer *= 10; inputbuffer += 1; keypad[0] = 255; }
+ if( keypad[1] && keypad[1] != 255) { inputbuffer *= 10; inputbuffer += 4; keypad[1] = 255; }
+ if( keypad[2] && keypad[2] != 255) { inputbuffer *= 10; inputbuffer += 7; keypad[2] = 255; }
+ if( keypad[4] && keypad[4] != 255) { inputbuffer *= 10; inputbuffer += 2; keypad[4] = 255; }
+ if( keypad[5] && keypad[5] != 255) { inputbuffer *= 10; inputbuffer += 5; keypad[5] = 255; }
+ if( keypad[6] && keypad[6] != 255) { inputbuffer *= 10; inputbuffer += 8; keypad[6] = 255; }
+ if( keypad[7] && keypad[7] != 255) {
+ if (inputbuffer != 0) {inputbuffer *= 10; inputbuffer += 0; keypad[7] = 255; }
+ if (inputbuffer == 0) {negativeinput = 1 - negativeinput; keypad[7] = 255;}
+ }
+ if( keypad[8] && keypad[8] != 255) { inputbuffer *= 10; inputbuffer += 3; keypad[8] = 255; }
+ if( keypad[9] && keypad[9] != 255) { inputbuffer *= 10; inputbuffer += 6; keypad[9] = 255; }
+ if( keypad[10] && keypad[10] != 255) { inputbuffer *= 10; inputbuffer += 9; keypad[10] = 255; }
+ if( keypad[11] && keypad[11] != 255) { // #
+ stepsize = inputbuffer;
+ inputbuffer = 0; negativeinput=0;
+ if (stepsize > 100000) stepsize = 100000;
+ keypad[11] = 255;
+ lcd_set_font(FONT_DIGITS_32,SPACING);
+ LCD_MOVE_TO(200,16);
+ lcd_set_area_xy(16,240,200,232);
+ lcd_put_long_align32_7(stepsize);
+ lcd_set_font(FONT_PROP_16,SPACING);
+ }
+ if(keypad[3] && keypad[3] != 255) { // *
+ speed = inputbuffer & 0x7;
+ inputbuffer = 0; negativeinput = 0;
+ cli();
+ OCR1A = speeds[speed];
+ TCNT1 = 0;
+ sei();
+ keypad[3] = 255;
+ lcd_set_font(FONT_PROP_16,SPACING);
+ lcd_set_area_xy(280,320,48,64);
+ LCD_MOVE_TO(48,280);
+ lcd_putstr_P(PSTR("Sp "));
+ lcd_put_short(speed);
+ }
+ if(keypad[14] && keypad[14] != 255) { //C
+ if (motor_active) {
+ cli();
+ M1_STEPS = 0;
+ if (negativeinput) inputbuffer *= -1;
+ if(M1_position < inputbuffer) {
+ DIRECTION_FORWARD_M1();
+ M1_DIR = 1;
+ M1_STEPS = inputbuffer-M1_position;
+ } else {
+ DIRECTION_BACKWARD_M1();
+ M1_DIR = 0;
+ M1_STEPS = M1_position-inputbuffer;
+ }
+ inputbuffer = 0; negativeinput = 0;
+ sei();
+ }
+ keypad[14] = 255;
+ }
+ if(keypad[15] && keypad[15] != 255) { //D
+ if (motor_active) {
+ cli();
+ M2_STEPS = 0;
+ if (negativeinput) inputbuffer *= -1;
+ if(M2_position < inputbuffer) {
+ DIRECTION_FORWARD_M2();
+ M2_DIR = 1;
+ M2_STEPS = inputbuffer-M2_position;
+ } else {
+ DIRECTION_BACKWARD_M2();
+ M2_DIR = 0;
+ M2_STEPS = M2_position-inputbuffer;
+ }
+ inputbuffer = 0; negativeinput = 0;
+ sei();
+ }
+ keypad[15] = 255;
+ }
+ if (inputbuffer > 1000000) inputbuffer = 0;
+ if(inputbuffer != last_inputbuffer) {
+ lcd_set_font(FONT_PROP_16,SPACING);
+ lcd_set_area_xy(240,320,224,240);
+ LCD_MOVE_TO(224,240);
+ if (negativeinput) lcd_put_long(-inputbuffer);
+ else lcd_put_long(inputbuffer);
+
+ }
+ last_inputbuffer = inputbuffer;
+ }
+ }
+
+ //output position
+ if( (time & 0xf) == 0) {
+ lcd_set_font(FONT_DIGITS_32,SPACING);
+ // lcd_use_background(topback);
+
+ LCD_MOVE_TO(64,16);
+ // lcd_set_area_xy(16,180,64,96);
+ lcd_put_long_align32_7(M1_position);
+
+ LCD_MOVE_TO(104,16);
+ // lcd_set_area_xy(16,180,104,136);
+ lcd_put_long_align32_7(M2_position);
+
+ }
}