mirror of
https://github.com/sergeyyarkov/pdsp188x.git
synced 2026-10-11 10:28:54 +03:00
99 lines
2.3 KiB
C
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);
|
|
} |