#include "pdsp188x.h" static const PDSP188x_DriverInterface_t *driver = {NULL}; static void SetDataLine(uint8_t pin_mask) { driver->set_pins(PDSP188x_DATA_LINE_MASK, pin_mask, 1); } static void ClearDataLine(uint8_t pin_mask) { driver->set_pins(PDSP188x_DATA_LINE_MASK, pin_mask, 0); } static void SetAddrLine(uint8_t pin_mask) { driver->set_pins(PDSP188x_ADDR_LINE_MASK, pin_mask, 1); } static void ClearAddrLine(uint8_t pin_mask) { driver->set_pins(PDSP188x_ADDR_LINE_MASK, pin_mask, 0); } #define MemSelectCharRAM() SetAddrLine(A3 | A4) #define MemSelectControlWord() SetAddrLine(A4) #define MemSelectNone() ClearAddrLine(A3 | A4) #define SetAddrNone() ClearAddrLine(A0 | A1 | A2 | A3 | A4) #define FlashCycle() \ do { \ ClearDataLine(WR); \ driver->delay_us(1); \ SetDataLine(WR); \ driver->delay_us(1); \ } while (0) uint8_t pos = 0; void PDSP188x_Init(const PDSP188x_DriverInterface_t *driver_strategy) { if (driver_strategy != NULL) { driver = driver_strategy; if (driver->init != NULL) { driver->init(); } } } void PDSP188x_SetBrightness(uint8_t level) { if (driver == NULL || driver->send_byte == NULL) return; MemSelectNone(); SetAddrLine(A4); driver->send_byte(level); FlashCycle(); driver->delay_us(5); } void PDSP188x_SendChar(char c, uint8_t digit) { if (driver == NULL || driver->send_byte == NULL) return; driver->send_byte(c); driver->delay_us(1); MemSelectCharRAM(); /* digit set */ if (digit & 0x01) SetAddrLine(A0); if (digit & 0x02) SetAddrLine(A1); if (digit & 0x04) SetAddrLine(A2); driver->delay_us(1); FlashCycle(); SetAddrNone(); driver->delay_us(1); } void PDSP188x_Clear(void) { for (uint8_t i = 0; i <= 7; i++) { PDSP188x_SendChar(0x20, i); } pos = 0; } void PDSP188x_SendStr(char *str) { char c; while ((c = *str) != '\0') { if (pos > 7) { pos = 0; return; } PDSP188x_SendChar(*str++, pos++); } } void PDSP188x_BlinkEn(uint8_t control) { uint8_t control_command = control ? 0x10 : 0; if (driver == NULL || driver->send_byte == NULL) return; SetAddrNone(); MemSelectControlWord(); SetDataLine(FL); driver->send_byte(control_command); FlashCycle(); } void PDSP188x_SendInt16(int16_t n) { char str[12] = {'\0'}; itoa(n, str, 10); PDSP188x_SendStr(str); }