pdsp188x/pdsp188x.c
2026-08-14 19:59:53 +03:00

99 lines
2.3 KiB
C

#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);
}