QS30-1 Nixie Module for Arduino v2.0.0 | 辉光管显示模块【软件篇】

严 泽远发布

通过上一篇QS30-1 Nixie Module for Arduino v2.0.0 | 辉光管显示模块【硬件篇】的介绍,相信大家对辉光管显示模块v2.0.0的硬件有了相应了解。
但除了有相应的高压升压电路和逻辑驱动电路以外,还需要软件方面的配合才能让这些模块焕发夺目光彩,完成我们设计的应用。
先来回忆一下那种火红的朦胧:

本次新版本的辉光管显示模块,依旧是使用了两片74HC595芯片来实现串行数据通讯控制,对数字、LED颜色以及氖灯的控制实际上都是对74HC595芯片的控制。
在本文中,就以一个C51核心的单片机系统来对驱动软件进行简单的阐述,并给出具体驱动代码。

通过辉光管本身的应用来看,一共有0-9这10个数字要进行控制,另外还有RGB LED三个颜色要进行控制,以及2个氖灯要进行控制,共需要15bit的译码输出,根据原理图,两片74HC595共有16bit输出,对应的控制关系表如下:

也许看到这个表格并不直观,根据对应关系,我又重新绘制了辉光管各种显示状态、RGB LED和氖灯的状态对应表格,如下:

(1:高电平,0:低电平,x:无关)

首先为了方便控制每一个辉光管显示模块,我建立了一个结构体来对模块的数字、RGB LED和氖灯状态进行配置。
代码如下:

/********************************************************************* 
* 功能描述: 数据类型定义
*********************************************************************/ 
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

/********************************************************************* 
* 功能描述: 结构体定义
*********************************************************************/
struct t_NixieModule
{
        uint	LED;		//LED颜色
 	uint 	CLO;		//冒号状态
 	uint 	NUM;		//显示数字
};

同样和上次一样,对结构体内数字、RGB LED和氖灯的状态值,进行了预定义,每一个状态依旧被定义为一个16bit的uint类型常量。
代码如下:

/********************************************************************* 
* 功能描述: 常量定义
*********************************************************************/ 
#define	MOD_AMOUNT		6			//模组总数量 根据实际串联的总数量更改
								//模组总数量应大于等于1 小于等于255

#define	LED_OFF			0xE000 		//LED关
#define	LED_WHITE		0x0000		//LED白色
#define	LED_PURPLE		0xD000		//LED紫色
#define	LED_CYAN		0xA000		//LED青色
#define	LED_YELLOW		0x6000		//LED黄色
#define	LED_BLUE 		0x8000		//LED蓝色
#define	LED_GREEN		0x2000		//LED绿色
#define	LED_RED			0x4000		//LED红色

#define	CLO_OFF			0x0000	 	//氖灯关
#define	CLO_UP			0x0004		//氖灯上点亮
#define	CLO_DOWN		0x0002		//氖灯下点亮
#define	CLO_BOTH		0x0006		//氖灯全亮

#define	NUM_OFF		0x0000		//无数字显示
#define	NUM_0			0x0008		//显示数字0
#define	NUM_1			0x1000		//显示数字1
#define	NUM_2			0x0800		//显示数字2
#define	NUM_3			0x0400		//显示数字3
#define	NUM_4			0x0200		//显示数字4
#define	NUM_5			0x0100		//显示数字5
#define	NUM_6			0x0080		//显示数字6
#define	NUM_7			0x0040		//显示数字7
#define	NUM_8			0x0020		//显示数字8
#define	NUM_9			0x0010		//显示数字9

有了这些预定义和结构体之后,我们可以在应用中定义我们所用到的模块数量和结构体变量。
代码如下:

/********************************************************************* 
* 功能描述: 全局变量定义
*********************************************************************/
xdata	struct t_NixieModule MOD[MOD_AMOUNT];	//全局结构体变量

然后我们根据我们的应用需求,来指定每一个模块的显示状态,例如:

我们使用6个显示模块来显示数字1-6,并且让背景色各不相同,氖灯状态各不相同。
代码如下:

	MOD[0].LED	=	LED_PURPLE;
	MOD[0].CLO	=	CLO_OFF;
	MOD[0].NUM	=	NUM_1;

	MOD[1].LED	=	LED_CYAN;
	MOD[1].CLO	=	CLO_UP;
	MOD[1].NUM	=	NUM_2;

	MOD[2].LED	=	LED_YELLOW;
	MOD[2].CLO	=	CLO_DOWN;
	MOD[2].NUM	=	NUM_3;

	MOD[3].LED	=	LED_BLUE;
	MOD[3].CLO	=	CLO_BOTH;
	MOD[3].NUM	=	NUM_4;

	MOD[4].LED	=	LED_GREEN;
	MOD[4].CLO	=	CLO_UP;
	MOD[4].NUM	=	NUM_5;

	MOD[5].LED	=	LED_RED;
	MOD[5].CLO	=	CLO_DOWN;
	MOD[5].NUM	=	NUM_6;

配置完显示模块的显示模式,接下来就需要将显示模式配置为N个模块需要的2byte数据,通过74HC595通讯函数发送给显示模块。

在这里设计了两个函数,一个是Send595()函数,用于发送两个字节数据到串行总线上,一个是Update()函数,用于根据显示模块的显示模式计算要发送的两个字节数据。
代码如下:

/*********************************************************************
** 	函数名称:			void 	Send595(uchar count,uchar dat)
**	功能描述:			向74HC595发送数据  
**	入口参数:			count:	发送数据的位数
**						dat:	发送的数据(MAX 16Bit)
**	创 建 者:			严泽远
**	创建时间:			2012-06-29 22:32
**	版    本:			v1.0.0
*********************************************************************/
void 	Send595(uint count,uint dat)
{
	for(;count>0;count--)
	{
		DATA = dat&0x8000;
		SHCP  = 1;
		SHCP  = 0;
		dat<

有了以上函数,只需要在主函数里配置好相应的结构体,然后调用Update()函数即可更新所有显示内容。

整个测试过程我采用的是C8051F340的最小系统版,在此贴出主函数,以供大家参考:

/*********************************************************************
* 函 数 名: main()
* 功能描述: 主程序
* 设 计 者:严泽远 日期:2014-01-29 23:11
* 修 改 者:严泽远 日期:2014-01-29 23:12
* 版    本:v1.0.0
*********************************************************************/
main()
{
	Port_IO_Init();				//IO资源配置
	Oscillator_Init();			//晶体振荡器初始化	

	OE	=	0;			//输出使能 或采用PWM控制来调节整体亮度

	MOD[0].LED	=	LED_PURPLE;
	MOD[0].CLO	=	CLO_OFF;
	MOD[0].NUM	=	NUM_1;

	MOD[1].LED	=	LED_CYAN;
	MOD[1].CLO	=	CLO_UP;
	MOD[1].NUM	=	NUM_2;

	MOD[2].LED	=	LED_YELLOW;
	MOD[2].CLO	=	CLO_DOWN;
	MOD[2].NUM	=	NUM_3;

	MOD[3].LED	=	LED_BLUE;
	MOD[3].CLO	=	CLO_BOTH;
	MOD[3].NUM	=	NUM_4;

	MOD[4].LED	=	LED_GREEN;
	MOD[4].CLO	=	CLO_UP;
	MOD[4].NUM	=	NUM_5;

	MOD[5].LED	=	LED_RED;
	MOD[5].CLO	=	CLO_DOWN;
	MOD[5].NUM	=	NUM_6;

	Update();				//刷新显示

	while(1)
	{
	;
	}
}

有了基本的控制模式,我们就可以轻松的使用51内核的单片机系统对辉光管模块的显示内容、背景色和氖灯状态进行控制。

该模块的Datasheet下载地址请移步:

QS30-1 Nixie Module UserManual_CH v2.0.0
Qs30-1 Nixie Module UserManual_EN v2.0.0

该模块完美支持Arduino UNO系统,只需要4个IO通讯端口即可实现数字、背景灯颜色、氖灯的完全控制。
v2.0.0的最新Arduino类库在aGuegu制作的v1.0.1版本的基础上升级而成,完全开源。特别感谢:aGuegu

Arduino Library for QS30-1 Nixie Module v2.0.0

v2.0.0与v1.0.1的类库使用方法相同,使用详情请参考:

阿古作坊: QS30-1 辉光管通用模块 Arduino 类库开发记

其他参考:

QS30-1 Nixie Module list on eBay

DIY是一种享受,享受的是过程,更是结果……

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

软硬件设计:严泽远
QQ:6626209
Mobile:18602007878
WebSite:https://nixieclock.org
E-mail:admin@nixieclock.org


严 泽远

☑男性☑80后☑已婚☑没大房☑没好车☑没钱☑没工作☑没......

4 条评论

XANA · 2014 年 1 月 30 日 上午 12:36

貌似和上一版本的驱动差不多
占领沙发!

Arnaud7380 from Belgium · 2015 年 3 月 18 日 下午 11:04

Hello,
Thank you for the picture of the bits , here helped me a lot , with that, not need to use the supplied library.
I will try to use it with the shiftpwm library.

Vince Patron · 2018 年 2 月 1 日 上午 7:59

Hello, I wrote a Python module for the Raspberry Pi to control this module. You and your customers might be interested in it. The code is at https://github.com/vpatron0/pi_nixie

    ♂唯有→奋斗 · 2018 年 2 月 2 日 下午 12:02

    Woowwww, you’re great Vince, it’s very easy to use Nixie Module for Makers, thank you for your efforts.

♂唯有→奋斗进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注

error: Content is protected !!