#include "project.h" #define NCS (GPIO7) #define NCS_PORT GPIOG #define SCK (GPIO3) #define SCK_PORT GPIOB #define MOSI (GPIO5) #define MOSI_PORT GPIOB static void set (int sck, int ncs, int mosi) { if (sck) SET (SCK); else CLEAR (SCK); if (ncs) SET (NCS); else CLEAR (NCS); if (mosi) SET (MOSI); else CLEAR (MOSI); // delay_us(1); //delay_us(10); } static void spip_send_8 (uint8_t wot) { int i; for (i = 0; i < 8; ++i) { set (0, 0, wot & 0x80); set (1, 0, wot & 0x80); set (0, 0, wot & 0x80); wot <<= 1; } } static void write_reg (uint8_t reg, uint8_t data) { set (0, 1, 0); set (0, 0, 0); spip_send_8 (reg); spip_send_8 (data); spip_send_8 (reg); spip_send_8 (data); spip_send_8 (reg); spip_send_8 (data); set (0, 0, 0); set (0, 1, 0); } static void write_regs (uint8_t reg, uint8_t data1, uint8_t data2, uint8_t data3) { set (0, 1, 0); set (0, 0, 0); spip_send_8 (reg); spip_send_8 (data3); spip_send_8 (reg); spip_send_8 (data2); spip_send_8 (reg); spip_send_8 (data1); set (0, 0, 0); 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 (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 (0x9, 0x0); //No decode write_reg (0xb, 0x7); //8 digits write_regs (0xa, 15, 15, 15); //max brightness 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); }