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和氖灯状态进行配置。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/********************************************************************* 
* 功能描述: 数据类型定义
*********************************************************************/ 
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类型常量。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/********************************************************************* 
* 功能描述: 常量定义
*********************************************************************/ 
#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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	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()函数,用于根据显示模块的显示模式计算要发送的两个字节数据。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*********************************************************************
** 	函数名称:			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的最小系统版,在此贴出主函数,以供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*********************************************************************
* 函 数 名: 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:http://www.nixieclock.org
E-mail:admin@nixieclock.org

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

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>