diff --git a/lib/vfd_hv518.c b/lib/vfd_hv518.c
index c429ebc..a760a2b 100644
--- a/lib/vfd_hv518.c
+++ b/lib/vfd_hv518.c
@@ -12,11 +12,11 @@
* along with this program. If not, see .
*
*/
-/** library to drive vacuum fluorescent display using supertex HV518 shift register VFD drivers (code)
+/** library to drive vacuum fluorescent display using supertex HV518 shift register VFD drivers
* @details the current configuration is for a VFD extracted from a Samsung SER-6500 cash register
* @file
* @author King Kévin
- * @date 2016
+ * @date 2016-2020
* @note peripherals used: SPI @ref vfd_hv518_spi , GPIO @ref vfd_hv518_gpio , timer @ref vfd_hv518_timer
*/
/* standard libraries */
@@ -36,131 +36,121 @@
/** @defgroup vfd_hv518_gpio GPIO to control supertex HV518 VFD drivers
* @{
*/
-#define VFD_PORT GPIOA /**< GPIO port */
-#define VFD_PORT_RCC RCC_GPIOA /**< GPIO port peripheral clock */
-#define VFD_STR GPIO6 /**< strobe pin to enable high voltage output, high voltage is output on low */
-#define VFD_NLE GPIO4 /**< latch enable pin, stores the shifted data on low, output the parallel data on high */
+#define VFD_STR_PIN PA6 /**< strobe pin to enable high voltage output, high voltage is output on low */
+#define VFD_NLE_PIN PA4 /**< latch enable pin, stores the shifted data on low, output the parallel data on high */
/** @} */
/** @defgroup vfd_hv518_spi SPI to send data to supertex HV518 VFD drivers
* @{
*/
-#define VFD_SPI_RCC RCC_SPI1 /**< SPI peripheral */
-#define VFD_SPI_PORT GPIOA /**< GPIO port */
-#define VFD_SPI_PORT_RCC RCC_GPIOA /**< GPIO port peripheral clock */
-#define VFD_SPI_IRQ NVIC_SPI1_IRQ /**< SPI peripheral interrupt signal */
-#define VFD_SPI_ISR spi1_isr /**< SPI interrupt service routine */
-#define VFD_CLK GPIO_SPI1_SCK /**< clock signal */
-#define VFD_DIN GPIO_SPI1_MOSI /**< data input, where the data is shifted to */
+#define VFD_SPI 1 /**< SPI peripheral */
/** @} */
/** @defgroup vfd_hv518_timer timer for automatic display blocks refresh
* @{
*/
-#define VFD_TIMER_RCC RCC_TIM2 /**< timer peripheral clock */
-#define VFD_TIMER_IRQ NVIC_TIM2_IRQ /**< timer interrupt signal */
-#define VFD_TIMER_ISR tim2_isr /**< timer interrupt service routine */
+#define VFD_TIMER 2 /**< timer peripheral ID */
/** @} */
/** ASCII characters encoded for the 7 segments digit block
* @note starts with space
*/
static const uint8_t ascii_7segments[] = {
- 0b00000000, // space
- 0b00110000, // ! (I)
- 0b00100010, // "
- 0b01011100, // # (o)
- 0b01101101, // $ (s)
- 0b01010010, // % (/)
- 0b01111101, // & (6)
- 0b00100000, // '
- 0b00111001, // ( ([)
- 0b00001111, // )
- 0b01110000, // *
- 0b01000110, // +
- 0b00010000, // ,
- 0b01000000, // -
- 0b00010000, // . (,)
- 0b01010010, // /
- 0b00111111, // 0
- 0b00000110, // 1
- 0b01011011, // 2
- 0b01001111, // 3
- 0b01100110, // 4
- 0b01101101, // 5
- 0b01111101, // 6
- 0b00000111, // 7
- 0b01111111, // 8
- 0b01101111, // 9
- 0b01001000, // : (=)
- 0b01001000, // ; (=)
- 0b01011000, // <
- 0b01001000, // =
- 0b01001100, // >
- 0b01010011, // ?
- 0b01111011, // @
- 0b01110111, // A
- 0b01111111, // B
- 0b00111001, // C
- 0b01011110, // D
- 0b01111001, // E
- 0b01110001, // F
- 0b00111101, // G
- 0b01110110, // H
- 0b00110000, // I
- 0b00011110, // J
- 0b01110110, // K
- 0b00111000, // L
- 0b00110111, // M
- 0b00110111, // N
- 0b00111111, // O
- 0b01110011, // P
- 0b01101011, // Q
- 0b00110011, // R
- 0b01101101, // S
- 0b01111000, // T
- 0b00111110, // U
- 0b00111110, // V (U)
- 0b00111110, // W (U)
- 0b01110110, // X (H)
- 0b01101110, // Y
- 0b01011011, // Z
- 0b00111001, // [
- 0b01100100, // '\'
- 0b00001111, // /
- 0b00100011, // ^
- 0b00001000, // _
- 0b00000010, // `
- 0b01011111, // a
- 0b01111100, // b
- 0b01011000, // c
- 0b01011110, // d
- 0b01111011, // e
- 0b01110001, // f
- 0b01101111, // g
- 0b01110100, // h
- 0b00010000, // i
- 0b00001100, // j
- 0b01110110, // k
- 0b00110000, // l
- 0b01010100, // m
- 0b01010100, // n
- 0b01011100, // o
- 0b01110011, // p
- 0b01100111, // q
- 0b01010000, // r
- 0b01101101, // s
- 0b01111000, // t
- 0b00011100, // u
- 0b00011100, // v (u)
- 0b00011100, // w (u)
- 0b01110110, // x
- 0b01101110, // y
- 0b01011011, // z
- 0b00111001, // { ([)
- 0b00110000, // |
- 0b00001111, // } ([)
- 0b01000000, // ~
+ 0x00, // 0b00000000, space
+ 0x30, // 0b00110000, ! (I)
+ 0x22, // 0b00100010, "
+ 0x5c, // 0b01011100, # (o)
+ 0x6d, // 0b01101101, $ (s)
+ 0x52, // 0b01010010, % (/)
+ 0x7d, // 0b01111101, & (6)
+ 0x20, // 0b00100000, '
+ 0x39, // 0b00111001, ( ([)
+ 0x0f, // 0b00001111, )
+ 0x70, // 0b01110000, *
+ 0x46, // 0b01000110, +
+ 0x10, // 0b00010000, ,
+ 0x40, // 0b01000000, -
+ 0x10, // 0b00010000, . (,)
+ 0x52, // 0b01010010, /
+ 0x3f, // 0b00111111, 0
+ 0x06, // 0b00000110, 1
+ 0x5b, // 0b01011011, 2
+ 0x4f, // 0b01001111, 3
+ 0x66, // 0b01100110, 4
+ 0x6d, // 0b01101101, 5
+ 0x7d, // 0b01111101, 6
+ 0x07, // 0b00000111, 7
+ 0x7f, // 0b01111111, 8
+ 0x6f, // 0b01101111, 9
+ 0x48, // 0b01001000, : (=)
+ 0x48, // 0b01001000, ; (=)
+ 0x58, // 0b01011000, <
+ 0x48, // 0b01001000, =
+ 0x4c, // 0b01001100, >
+ 0x53, // 0b01010011, ?
+ 0x7b, // 0b01111011, @
+ 0x77, // 0b01110111, A
+ 0x7f, // 0b01111111, B
+ 0x39, // 0b00111001, C
+ 0x5e, // 0b01011110, D
+ 0x79, // 0b01111001, E
+ 0x71, // 0b01110001, F
+ 0x3d, // 0b00111101, G
+ 0x76, // 0b01110110, H
+ 0x30, // 0b00110000, I
+ 0x1e, // 0b00011110, J
+ 0x76, // 0b01110110, K
+ 0x38, // 0b00111000, L
+ 0x37, // 0b00110111, M
+ 0x37, // 0b00110111, N
+ 0x3f, // 0b00111111, O
+ 0x73, // 0b01110011, P
+ 0x6b, // 0b01101011, Q
+ 0x33, // 0b00110011, R
+ 0x6d, // 0b01101101, S
+ 0x78, // 0b01111000, T
+ 0x3e, // 0b00111110, U
+ 0x3e, // 0b00111110, V (U)
+ 0x3e, // 0b00111110, W (U)
+ 0x76, // 0b01110110, X (H)
+ 0x6e, // 0b01101110, Y
+ 0x5b, // 0b01011011, Z
+ 0x39, // 0b00111001, [
+ 0x64, // 0b01100100, '\'
+ 0x0f, // 0b00001111, /
+ 0x23, // 0b00100011, ^
+ 0x08, // 0b00001000, _
+ 0x02, // 0b00000010, `
+ 0x5f, // 0b01011111, a
+ 0x7c, // 0b01111100, b
+ 0x58, // 0b01011000, c
+ 0x5e, // 0b01011110, d
+ 0x7b, // 0b01111011, e
+ 0x71, // 0b01110001, f
+ 0x6f, // 0b01101111, g
+ 0x74, // 0b01110100, h
+ 0x10, // 0b00010000, i
+ 0x0c, // 0b00001100, j
+ 0x76, // 0b01110110, k
+ 0x30, // 0b00110000, l
+ 0x54, // 0b01010100, m
+ 0x54, // 0b01010100, n
+ 0x5c, // 0b01011100, o
+ 0x73, // 0b01110011, p
+ 0x67, // 0b01100111, q
+ 0x50, // 0b01010000, r
+ 0x6d, // 0b01101101, s
+ 0x78, // 0b01111000, t
+ 0x1c, // 0b00011100, u
+ 0x1c, // 0b00011100, v (u)
+ 0x1c, // 0b00011100, w (u)
+ 0x76, // 0b01110110, x
+ 0x6e, // 0b01101110, y
+ 0x5b, // 0b01011011, z
+ 0x39, // 0b00111001, { ([)
+ 0x30, // 0b00110000, |
+ 0x0f, // 0b00001111, } ([)
+ 0x40, // 0b01000000, ~
};
/** font for the 5x7 dot matrix block
@@ -262,7 +252,7 @@ static const uint8_t font5x7[][5] = {
{0x00, 0x08, 0x36, 0x41, 0x00}, // {
{0x00, 0x00, 0x7F, 0x00, 0x00}, // |
{0x00, 0x41, 0x36, 0x08, 0x00}, // }
- {0b00001000, 0b00000100, 0b00001100, 0b00001000, 0b00000100} // ~
+ {0x08, 0x04, 0x0c, 0x08, 0x04}, // ~ {0b00001000, 0b00000100, 0b00001100, 0b00001000, 0b00000100}
};
/** pictures for the 5x7 dot matrix block
@@ -271,18 +261,18 @@ static const uint8_t font5x7[][5] = {
static const uint8_t pict5x7[][5] = {
{0x08, 0x08, 0x2A, 0x1C, 0x08}, // ->
{0x08, 0x1C, 0x2A, 0x08, 0x08}, // <-
- {0b01110000, 0b01110000, 0b01111010, 0b01111100, 0b01011000}, // bunny side 1
- {0b00100000, 0b01110000, 0b01110010, 0b01111100, 0b01011000}, // bunny side 2
- {0b00111110, 0b01001001, 0b01010110, 0b01001001, 0b00111110}, // bunny face 1
- {0b00111110, 0b01010001, 0b01100110, 0b01010001, 0b00111110}, // bunny face 2
- {0b00111000, 0b01010111, 0b01100100, 0b01010111, 0b00111000}, // bunny face 3
- {0b00111000, 0b01001111, 0b01010100, 0b01001111, 0b00111000}, // bunny face 4
- {0b00111000, 0b01011110, 0b01101000, 0b01011110, 0b00111000}, // bunny face 5
- {0b01000001, 0b00110110, 0b00001000, 0b00110110, 0b01000001}, // cross 1
- {~0b01000001, ~0b00110110, ~0b00001000, ~0b00110110, ~0b01000001}, // cross 1 negated
- {0b00100010, 0b00010100, 0b00001000, 0b00010100, 0b00100010}, // cross 2
- {~0b00100010, ~0b00010100, ~0b00001000, ~0b00010100, ~0b00100010}, // cross 2 negated
- {0x00, 0x00, 0x00, 0x00, 0x00} // nothing
+ {0x70, 0x70, 0x7a, 0x7c, 0x58}, // bunny side 1 {0b01110000, 0b01110000, 0b01111010, 0b01111100, 0b01011000}
+ {0x20, 0x70, 0x72, 0x7c, 0x58}, // bunny side 2 {0b00100000, 0b01110000, 0b01110010, 0b01111100, 0b01011000}
+ {0x3e, 0x49, 0x56, 0x49, 0x3e}, // bunny face 1 {0b00111110, 0b01001001, 0b01010110, 0b01001001, 0b00111110}
+ {0x3e, 0x51, 0x66, 0x51, 0x3e}, // bunny face 2 {0b00111110, 0b01010001, 0b01100110, 0b01010001, 0b00111110}
+ {0x38, 0x57, 0x64, 0x57, 0x38}, // bunny face 3 {0b00111000, 0b01010111, 0b01100100, 0b01010111, 0b00111000}
+ {0x38, 0x4f, 0x54, 0x4f, 0x38}, // bunny face 4 {0b00111000, 0b01001111, 0b01010100, 0b01001111, 0b00111000}
+ {0x38, 0x5e, 0x68, 0x5e, 0x38}, // bunny face 5 {0b00111000, 0b01011110, 0b01101000, 0b01011110, 0b00111000}
+ {0x41, 0x36, 0x08, 0x36, 0x41}, // cross 1 {0b01000001, 0b00110110, 0b00001000, 0b00110110, 0b01000001}
+ {~0x41, ~0x36, ~0x08, ~0x36, ~0x41}, // cross 1 negated {~0b01000001, ~0b00110110, ~0b00001000, ~0b00110110, ~0b01000001}
+ {0x22, 0x14, 0x08, 0x14, 0x22}, // cross 2 {0b00100010, 0b00010100, 0b00001000, 0b00010100, 0b00100010}
+ {~0x22, ~0x14, ~0x08, ~0x14, ~0x22}, // cross 2 negated {~0b00100010, ~0b00010100, ~0b00001000, ~0b00010100, ~0b00100010}
+ {0x00, 0x00, 0x00, 0x00, 0x00}, // nothing
};
/** the 32 bits values to be shifted out to the VFD driver
@@ -290,7 +280,7 @@ static const uint8_t pict5x7[][5] = {
* @note since the bits for digits and matrix are independent, they can be combined
* @note we have more matrix (12) than digits (10)
*/
-static uint16_t driver_data[VFD_MATRIX][VFD_DRIVERS*2] = {0};
+static uint16_t driver_data[VFD_MATRIX][VFD_DRIVERS * 2] = {0};
/** which driver data is being transmitted */
static volatile uint8_t spi_i = 0;
/** which grid/part to activate
@@ -304,13 +294,13 @@ static const uint32_t digit_mask = 0x00fffff0;
void vfd_digit(uint8_t nb, char c)
{
- if (!(nb=' ') { // only take printable characters
- uint8_t i = c-' '; // get index for character
- if (i= ' ') { // only take printable characters
+ uint8_t i = c - ' '; // get index for character
+ if (i < LENGTH(ascii_7segments)) {
+ digit_data |= (ascii_7segments[i] << 17); // add encoded segments to memory
}
}
digit_data &= digit_mask; // be sure only the bits for the digit are used
- digit_data |= (driver_data[nb][2]+(driver_data[nb][3]<<16))&~digit_mask; // get the existing data and add the bits for the digit
+ digit_data |= (driver_data[nb][2] + (driver_data[nb][3] << 16)) & ~digit_mask; // get the existing data and add the bits for the digit
driver_data[nb][2] = digit_data; // write back data (least significant half)
- driver_data[nb][3] = (digit_data>>16); // write back data (most significant half)
+ driver_data[nb][3] = (digit_data >> 16); // write back data (most significant half)
}
void vfd_matrix(uint8_t nb, char c)
{
// check the matrix exists
- if (!(nb=' ')) { // only take printable characters
- uint8_t i = c-' '; // get index for character
- if (i= ' ')) { // only take printable characters
+ uint8_t i = c - ' '; // get index for character
+ if (i < LENGTH(font5x7)) {
+ matrix_data[1] |= font5x7[i][0] << 24;
+ matrix_data[2] |= font5x7[i][1] << 0;
+ matrix_data[2] |= font5x7[i][2] << 8;
+ matrix_data[2] |= font5x7[i][3] << 16;
+ matrix_data[2] |= font5x7[i][4] << 24;
}
- } else if (c>0x7f) { // the non ASCII character are used for pictures
- uint8_t i = c-0x80; // get index for character
- if (i 0x7f) { // the non ASCII character are used for pictures
+ uint8_t i = c - 0x80; // get index for character
+ if (i < LENGTH(pict5x7)) {
+ matrix_data[1] |= pict5x7[i][0] << 24;
+ matrix_data[2] |= pict5x7[i][1] << 0;
+ matrix_data[2] |= pict5x7[i][2] << 8;
+ matrix_data[2] |= pict5x7[i][3] << 16;
+ matrix_data[2] |= pict5x7[i][4] << 24;
}
}
matrix_data[1] &= ~digit_mask; // be sure only the bits for the matrix are used
- matrix_data[1] |= (driver_data[nb][2]+(driver_data[nb][3]<<16))&digit_mask; // get the existing data for the digit
+ matrix_data[1] |= (driver_data[nb][2] + (driver_data[nb][3] << 16)) & digit_mask; // get the existing data for the digit
// prepare the data for SPI to shift it out
- for (uint8_t i=0; i>16;
+ for (uint8_t i = 0; i < LENGTH(matrix_data); i++) {
+ driver_data[nb][i * 2] = matrix_data[i];
+ driver_data[nb][i * 2 + 1] = matrix_data[i] >> 16;
}
}
void vfd_clear(void)
{
- for (uint8_t i=0; i.
*
*/
-/** library to drive vacuum fluorescent display using supertex HV518 shift register VFD drivers (API)
+/** library to drive vacuum fluorescent display using supertex HV518 shift register VFD drivers
* @details the current configuration is for a VFD extracted from a Samsung SER-6500 cash register
* @file
* @author King Kévin
- * @date 2016
+ * @date 2016-2020
* @note peripherals used: SPI @ref vfd_hv518_spi , GPIO @ref vfd_hv518_gpio , timer @ref vfd_hv518_timer
*/
+#pragma once
/** number HV518 VFD drivers */
#define VFD_DRIVERS 3