|
@@ -28,10 +28,10 @@
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
|
/* USER CODE BEGIN PTD */
|
|
|
typedef enum {
|
|
|
- Tube_A = 0,
|
|
|
- Tube_B = 1,
|
|
|
- Tube_D = 2,
|
|
|
- Tube_E = 3
|
|
|
+ Tube_A = 3,
|
|
|
+ Tube_B = 2,
|
|
|
+ Tube_D = 1,
|
|
|
+ Tube_E = 0
|
|
|
} tube_pos_t;
|
|
|
/* USER CODE END PTD */
|
|
|
|
|
@@ -49,20 +49,26 @@ typedef enum {
|
|
|
/* USER CODE BEGIN PV */
|
|
|
static LL_RCC_ClocksTypeDef rcc_clocks;
|
|
|
/**
|
|
|
- * Nixi Tube cathodes map:
|
|
|
- * {A1 A2 A3 A4 A5 A6 A7 A8}
|
|
|
- * {A9 A0 B1 B2 B3 B4 B5 B6}
|
|
|
- * {B7 B8 B9 B0 D1 D2 D3 D4}
|
|
|
- * {D5 D6 D7 D8 D9 D0 E1 E2}
|
|
|
- * {E3 E4 E5 E6 E7 E8 E9 E0}
|
|
|
+ * Nixi Tube cathodes map in Byte Array:
|
|
|
+ * {E0 E9 E8 E7 E6 E5 E4 E3}
|
|
|
+ * {E2 E1 D0 D9 D8 D7 D6 D5}
|
|
|
+ * {D4 D3 D2 D1 B0 B9 B8 B7}
|
|
|
+ * {B6 B5 B4 B3 B2 B1 A0 A9}
|
|
|
+ * {A8 A7 A6 A5 A4 A3 A2 A1}
|
|
|
+ *
|
|
|
+ * Shift register bit map in Tube cathodes (from 0 to 1):
|
|
|
+ * {5.7 5.6 5.5 5.4 5.3 5.2 5.1 5.0 4.7 4.6} VL5/E
|
|
|
+ * {4.5 4.4 4.3 4.2 4.1 4.0 3.7 3.6 3.5 3.4} VL4/D
|
|
|
+ * {3.3 3.2 3.1 3.0 2.7 2.6 2.5 2.4 2.3 2.2} VL2/B
|
|
|
+ * {2.1 2.0 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0} VL1/A
|
|
|
*/
|
|
|
static const uint16_t nixieCathodeMap[4][10] = {
|
|
|
- {0x0200, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100},
|
|
|
- {0x0800, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400},
|
|
|
+ {0x8000, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000},
|
|
|
{0x2000, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000},
|
|
|
- {0x8000, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000}
|
|
|
+ {0x0800, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400},
|
|
|
+ {0x0200, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100}
|
|
|
};
|
|
|
-static const uint8_t nixieCathodeMask[4][2] = {{0xff, 0x03}, {0xfc, 0x0f}, {0xf0, 0x3f}, {0xc0, 0xff}};
|
|
|
+static const uint8_t nixieCathodeMask[4][2] = {{0x00, 0x3f}, {0xc0, 0x0f}, {0xf0, 0x03}, {0xc0, 0x00}};
|
|
|
static uint8_t tubesBuffer[SPI_BUFFER_SIZE];
|
|
|
|
|
|
/* USER CODE END PV */
|
|
@@ -952,41 +958,53 @@ static void MX_GPIO_Init(void)
|
|
|
/**
|
|
|
* S U B R O U T I N E S
|
|
|
*/
|
|
|
+
|
|
|
+/* Feel byte with tube position by digit.
|
|
|
+ * If digit == 0xf, then tube is off -- clear all bits.
|
|
|
+ */
|
|
|
static void showDigit(tube_pos_t pos, uint8_t dig)
|
|
|
{
|
|
|
if (dig > 9) {
|
|
|
- dig = 0;
|
|
|
+ if (dig != 0xf) {
|
|
|
+ dig = 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
switch (pos) {
|
|
|
- case Tube_A:
|
|
|
- tubesBuffer[0] = (uint8_t)nixieCathodeMap[Tube_A][dig];
|
|
|
-
|
|
|
- tubesBuffer[1] &= ~nixieCathodeMask[Tube_A][1];
|
|
|
- tubesBuffer[1] |= (uint8_t)(nixieCathodeMap[Tube_A][dig] >> 8);
|
|
|
- break;
|
|
|
-
|
|
|
- case Tube_B:
|
|
|
- tubesBuffer[1] &= ~nixieCathodeMask[Tube_B][0];
|
|
|
- tubesBuffer[1] |= (uint8_t)nixieCathodeMap[Tube_B][dig];
|
|
|
-
|
|
|
- tubesBuffer[2] &= ~nixieCathodeMask[Tube_B][1];
|
|
|
- tubesBuffer[2] |= (uint8_t)(nixieCathodeMap[Tube_B][dig] >> 8);
|
|
|
+ case Tube_E:
|
|
|
+ tubesBuffer[0] = 0;
|
|
|
+ tubesBuffer[1] &= nixieCathodeMask[Tube_E][1];
|
|
|
+ if (Tube_E != 0xf) {
|
|
|
+ tubesBuffer[0] = (uint8_t)(nixieCathodeMap[Tube_E][dig] >> 8);
|
|
|
+ tubesBuffer[1] |= (uint8_t)(nixieCathodeMap[Tube_E][dig]);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case Tube_D:
|
|
|
- tubesBuffer[2] &= ~nixieCathodeMask[Tube_D][0];
|
|
|
- tubesBuffer[2] |= (uint8_t)nixieCathodeMap[Tube_D][dig];
|
|
|
-
|
|
|
- tubesBuffer[3] &= ~nixieCathodeMask[Tube_D][1];
|
|
|
- tubesBuffer[3] |= (uint8_t)(nixieCathodeMap[Tube_D][dig] >> 8);
|
|
|
+ tubesBuffer[1] &= nixieCathodeMask[Tube_D][0];
|
|
|
+ tubesBuffer[2] &= nixieCathodeMask[Tube_D][1];
|
|
|
+ if (Tube_D != 0xf) {
|
|
|
+ tubesBuffer[1] |= (uint8_t)(nixieCathodeMap[Tube_D][dig] >> 8);
|
|
|
+ tubesBuffer[2] |= (uint8_t)(nixieCathodeMap[Tube_D][dig]);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
- case Tube_E:
|
|
|
- tubesBuffer[3] &= ~nixieCathodeMask[Tube_E][0];
|
|
|
- tubesBuffer[3] |= (uint8_t)nixieCathodeMap[Tube_E][dig];
|
|
|
+ case Tube_B:
|
|
|
+ tubesBuffer[2] &= nixieCathodeMask[Tube_B][0];
|
|
|
+ tubesBuffer[3] &= nixieCathodeMask[Tube_B][1];
|
|
|
+ if (Tube_B != 0xf) {
|
|
|
+ tubesBuffer[2] |= (uint8_t)(nixieCathodeMap[Tube_B][dig] >> 8);
|
|
|
+ tubesBuffer[3] |= (uint8_t)(nixieCathodeMap[Tube_B][dig]);
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
- tubesBuffer[4] = (uint8_t)(nixieCathodeMap[Tube_E][dig] >> 8);
|
|
|
+ case Tube_A:
|
|
|
+ tubesBuffer[3] &= nixieCathodeMask[Tube_A][0];
|
|
|
+ tubesBuffer[4] = 0;
|
|
|
+ if (Tube_A != 0xf) {
|
|
|
+ tubesBuffer[3] |= (uint8_t)(nixieCathodeMap[Tube_A][dig] >> 8);
|
|
|
+ tubesBuffer[4] = (uint8_t)(nixieCathodeMap[Tube_A][dig]);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:
|