GNGN77
### nixie_tube.h
```c
#ifndef _NIXIE_TUBE_H
#define _NIXIE_TUBE_H
#include "main.h"
/****************************** define ******************************/
#define STB_H HAL_GPIO_WritePin(STB_GPIO_Port,STB_Pin,GPIO_PIN_SET)
#define STB_L HAL_GPIO_WritePin(STB_GPIO_Port,STB_Pin,GPIO_PIN_RESET)
#define CLK_H HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_SET)
#define CLK_L HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_RESET)
#define DIO_H HAL_GPIO_WritePin(DIO_GPIO_Port,DIO_Pin,GPIO_PIN_SET)
#define DIO_L HAL_GPIO_WritePin(DIO_GPIO_Port,DIO_Pin,GPIO_PIN_RESET)
/****************************** variable ******************************/
/****************************** function ******************************/
void NixieTubeInit(void);
void WriteByte(uint8_t dat);
void WriteCMD(uint8_t cmd);
void Display(uint8_t dat);
void Display4(uint8_t dat1,uint8_t dat2,uint8_t dat3,uint8_t dat4);
void TestDisplay(void);
#endif
```
### nixie_tube.c
```c
#include "nixie_tube.h"
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// 0 1 2 3 4 5 6 7 8 9 a b c d e f 全灭 r
uint8_t LED_Ku[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x50};
/* 若要显示“数字.”这种形式,可编写为“LED_Ku[LED_Display[i]]|0x80” */
uint8_t LED_Display[] = {0,1,2,3};
void NixieTubeInit(void)
{
STB_H;
CLK_H;
DIO_H;
}
void WriteByte(uint8_t dat)
{
uint8_t i;
STB_L;
__NOP();
for(i = 0;i < 8;i++)
{
CLK_L;
__NOP();
/* 低位优先 */
(dat & 0x01)?DIO_H:DIO_L;
CLK_H;
__NOP();
dat >>= 1;
}
HAL_Delay(1);
}
void WriteCMD(uint8_t cmd)
{
STB_H;
HAL_Delay(1);
STB_L;
HAL_Delay(1);
/* STB下降沿后的Data输入的第一个字节为一条指令 */
WriteByte(cmd);
}
void Display(uint8_t dat)
{
uint8_t i;
/* 【显示模式】4位7段 */
WriteCMD(0x00);
/* 【数据设置】普通模式、地址自增、写数据到现实寄存器 */
WriteCMD(0x40);
/* 【地址设置】起始地址为0x00 */
WriteCMD(0xC0);
/* 注意!!!这里只有设置为8才能显示4位LED数码管 */
for(i = 0;i < 8;i++)
WriteByte(dat);
/* 【显示控制】开显示、辉度1/16 */
WriteCMD(0x88);
}
void Display4(uint8_t dat1,uint8_t dat2,uint8_t dat3,uint8_t dat4)
{
/* 【显示模式】4位7段 */
WriteCMD(0x00);
/* 【数据设置】普通模式、地址自增、写数据到现实寄存器 */
WriteCMD(0x40);
/* 【地址设置】起始地址为0x00 */
WriteCMD(0xC0);
/* 注意!!!这里只有设置为8才能显示4位LED数码管 */
WriteByte(dat1);
WriteByte(dat1);
WriteByte(dat2);
WriteByte(dat2);
WriteByte(dat3);
WriteByte(dat3);
WriteByte(dat4);
WriteByte(dat4);
/* 【显示控制】开显示、辉度1/16 */
WriteCMD(0x88);
}
void TestDisplay(void)
{
/* 测试Display */
{
Display(0x01);
HAL_Delay(1000);
Display(0x02);
HAL_Delay(1000);
Display(0x04);
HAL_Delay(1000);
Display(0x08);
HAL_Delay(1000);
Display(0x10);
HAL_Delay(1000);
Display(0x20);
HAL_Delay(1000);
Display(0x40);
HAL_Delay(1000);
Display(0x80);
HAL_Delay(1000);
}
/* 测试Display4 */
Display4(0x01,0x02,0x04,0x08);
HAL_Delay(2000);
Display4(LED_Ku[LED_Display[0]],LED_Ku[LED_Display[1]],LED_Ku[LED_Display[2]],LED_Ku[LED_Display[3]]);
HAL_Delay(2000);
LED_Display[0] = 14;
LED_Display[1] = 17;
LED_Display[2] = 17;
LED_Display[3] = 1;
Display4(LED_Ku[LED_Display[0]],LED_Ku[LED_Display[1]],LED_Ku[LED_Display[2]],LED_Ku[LED_Display[3]]);
HAL_Delay(2000);
}
```