summaryrefslogtreecommitdiffstats
path: root/boot/max7219.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/max7219.c')
-rw-r--r--boot/max7219.c169
1 files changed, 155 insertions, 14 deletions
diff --git a/boot/max7219.c b/boot/max7219.c
index 3e06562..7a374eb 100644
--- a/boot/max7219.c
+++ b/boot/max7219.c
@@ -91,32 +91,173 @@ write_regs (uint8_t reg, uint8_t data1, uint8_t data2, uint8_t data3)
set (0, 1, 0);
}
+#define SDP 0x80
+#define SA 0x40
+#define SB 0x20
+#define SC 0x10
+#define SD 0x08
+#define SE 0x04
+#define SF 0x02
+#define SG 0x01
+
+static uint8_t hex (unsigned v)
+{
+ switch (v) {
+ case 0:
+ case '0':
+ return SA | SF | SB | SE | SC | SD;
+
+ case 1:
+ case '1':
+ return SB | SC;
+
+ case 2:
+ case '2':
+ case 'z':
+ return SA | SB | SG | SE | SD;
+
+ case 3:
+ case '3':
+ return SA | SB | SG | SC | SD;
+
+ case 4:
+ case '4':
+ return SF | SG | SB | SC;
+
+ case 5:
+ case '5':
+ case 's':
+ return SA | SF | SG | SC | SD;
+
+ case 6:
+ case '6':
+ return SA | SF | SG | SE | SC | SD;
+
+ case 7:
+ case '7':
+ return SA | SB | SC;
+
+ case 8:
+ case '8':
+ return SA | SF | SB | SG | SE | SC | SD;
+
+ case 9:
+ case '9':
+ case 'g':
+ return SA | SF | SB | SG | SC | SD;
+
+ case 0xa:
+ case 'a':
+ return SA | SF | SB | SG | SE | SC;
+
+ case 0xb:
+ case 'b':
+ return SF | SG | SE | SC | SD;
+
+ case 0xc:
+ case 'c':
+ return SG | SE | SD;
+
+ case 0xd:
+ case 'd':
+ return SB | SG | SE | SC | SD;
+
+ case 0xe:
+ case 'e':
+ return SA | SF | SG | SE | SD;
+
+ case 0xf:
+ case 'f':
+ return SA | SF | SG | SE;
+
+ case 'h':
+ return SF | SG | SE | SC;
+
+ case 'i':
+ return SE;
+
+ case 'j':
+ return SB | SC | SD;
+
+ case 'k':
+ case 'x':
+ return SF | SB | SG | SE | SC;
+
+ case 'l':
+ return SF | SE | SD;
+
+ case 'm':
+ case 'n':
+ return SG | SE | SC;
+
+ case 'o':
+ return SG | SE | SC | SD;
+
+ case 'p':
+ return SA | SF | SB | SG | SE;
+
+ case 'q':
+ return SA | SF | SB | SG | SC;
+
+ case 'r':
+ return SG | SE;
+
+ case 't':
+ return SF | SG | SE | SD;
+
+ case 'u':
+ case 'w':
+ return SE | SC | SD;
+
+ case 'y':
+ return SF | SB | SG | SC | SD;
+
+ case '-':
+ return SG;
+
+ case '.':
+ return SDP;
+
+ }
+
+ return 0;
+}
+
+void max7219_report_addr (uint32_t baseaddr)
+{
+ unsigned i;
+
+ for (i = 1; i <= 8; ++i) {
+ write_regs (i, hex (baseaddr & 0xf), 0, 0);
+ baseaddr >>= 4;
+ }
+}
+
+
void
-max7219_init (void)
+max7219 (const char *str)
{
MAP_OUTPUT_PP (SCK);
MAP_OUTPUT_PP (NCS);
MAP_OUTPUT_PP (MOSI);
+ unsigned reg;
set (0, 1, 0);
- write_reg (0xc, 0x1); //Power up
- write_reg (0xf, 0x0); //normal mode
+ write_reg (0xc, 0x1); //Power up
+ write_reg (0xf, 0x0); //normal mode
+
+ write_reg (0x9, 0x0); //No decode
+ write_reg (0xb, 0x7); //8 digits
+ write_regs (0xa, 15, 15, 15); //max brightness
- write_reg (0x9, 0x0); //No decode
- write_reg (0xb, 0x7); //8 digits
- write_regs (0xa,15,15,15); //max brightness
- write_reg (1,0);
- write_reg (2,0);
- write_reg (3,0);
- write_reg (4,0);
- write_reg (5,0);
- write_regs (6,0xbe,0,0);
- write_regs (7,0x47,0,0);
- write_regs (8,0x3d,0,0);
+ for (reg = 8; reg && *str; reg--, str++)
+ write_regs (reg, hex (*str) | (!str[1] ? SDP : 0), 0, 0);
+ for (; reg; reg--)
+ write_reg (reg, 0);
}