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://www.omnixie.cn/wordpress
E-mail:admin@nixieclock.org
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.