或许我们对她独特的显示效果始终难以忘怀,但要让她焕发夺目色彩,重点还在于应用。该模块在其硬件方面已经具备了完备的功能,应用软件方面则需要结合实际应用要求来设计。先来回忆一下那种火红的朦胧:
无论何种应用方案,基于硬件设计原理,该模块的底层控制实为对74HC595的通讯控制,在这里,我以51单片机控制板为核心来介绍一下底层驱动软件的设计方法。
每个显示模块的辉光管数字0-9和RGB LED以及两颗Neon Lamps均由两片74HC595来控制,共需要16bit(2Byte)数据。根据原理图,两片74HC595共有16个输出端对应16bit数据,对应关系表如下:
根据对应关系表,可以得出辉光管各种显示状态、RGB LED和Neon Lamps的对应数据表:
(1:高电平,0:低电平,x:无关)
为了方便对RGB LED、Neon Lamps和辉光管进行控制,在这里我采用了结构体来对整个模块的各种显示模式进行了配置。
代码如下:
- struct t_Module
- {
- uint LED; //LED颜色
- uint CLO; //冒号状态
- uint NUM; //显示数字
- };
同时,根据各种显示状态,按照对应关系表进行了预定义,每个状态被定义成一个16位的uint类型常量。
代码如下:
- #define LED_OFF 0x7000 //LED关
- #define LED_WHITE 0x0000 //LED白色
- #define LED_PURPLE 0x4000 //LED紫色
- #define LED_CYAN 0x2000 //LED青色
- #define LED_YELLOW 0x1000 //LED黄色
- #define LED_BLUE 0x6000 //LED蓝色
- #define LED_GREEN 0x3000 //LED绿色
- #define LED_RED 0x5000 //LED红色
- #define CLO_OFF 0x0000 //氖灯关
- #define CLO_UP 0x0400 //氖灯上点亮
- #define CLO_DOWN 0x0800 //氖灯下点亮
- #define CLO_BOTH 0x0C00 //氖灯全亮
- #define NUM_OFF 0x0000 //无数字显示
- #define NUM_0 0x0200 //显示数字0
- #define NUM_1 0x0001 //显示数字1
- #define NUM_2 0x0002 //显示数字2
- #define NUM_3 0x0004 //显示数字3
- #define NUM_4 0x0008 //显示数字4
- #define NUM_5 0x0010 //显示数字5
- #define NUM_6 0x0020 //显示数字6
- #define NUM_7 0x0040 //显示数字7
- #define NUM_8 0x0080 //显示数字8
- #define NUM_9 0x0100 //显示数字9
接下来,只需要将各个模块的显示模式配置好就OK了,例如:
1、将模块1的LED配置为白色,两个氖灯只亮起上面的那颗,辉光管显示数字0;
2、将模块2的LED配置为紫色,两个氖灯只亮起下面的那颗,辉光管显示数字1;
代码如下:
- MOD[0].LED = LED_WHITE; //初始化模组1的LED状态
- MOD[0].CLO = CLO_UP; //初始化模组1的冒号状态
- MOD[0].NUM = NUM_0; //初始化模组1的数字状态
- MOD[1].LED = LED_PURPLE; //初始化模组2的LED状态
- MOD[1].CLO = CLO_DOWN; //初始化模组2的冒号状态
- MOD[1].NUM = NUM_1; //初始化模组2的数字状态
配置完显示模块的显示模式,接下来就需要将显示模式配置为N个模块需要的2byte数据,通过74HC595通讯函数发送给显示模块。
在这里设计了两个函数,一个是Send595()函数,用于发送两个字节数据到串行总线上,一个是Update()函数,用于根据显示模块的显示模式计算要发送的两个字节数据。
代码如下:
- /*********************************************************************
- ** 函数名称: void Send595(uchar count,uchar dat)
- ** 功能描述: 向74HC595发送数据
- ** 入口参数: count: 发送数据的位数
- ** dat: 发送的数据(MAX 16Bit)
- *********************************************************************/
- void Send595(uint count,uint dat)
- {
- for(;count>0;count--)
- {
- DATA = dat&0x8000;
- SHCP = 1;
- SHCP = 0;
- dat<
有了以上函数,只需要在主函数里配置好相应的结构体,然后调用Update()函数即可更新所有显示内容。
照片中,我采用的是C8051F340的最小系统版,在此贴出主函数,以供大家参考:
- /*********************************************************************
- * 函 数 名: main()
- * 功能描述: 主程序
- * 设 计 者:严泽远 日期:2012-06-29 17:11
- * 修 改 者:严泽远 日期:2012-06-30 15:22
- * 版 本:v1.0.0
- *********************************************************************/
- main()
- {
- uint i=0x0001;
- uchar j=0;
- Port_IO_Init(); //IO资源配置
- Oscillator_Init(); //晶体振荡器初始化
- OE = 0; //输出使能 或采用PWM控制来调节整体亮度
- MOD[0].LED = LED_WHITE; //初始化模组1的LED状态
- MOD[0].CLO = CLO_UP; //初始化模组1的冒号状态
- MOD[0].NUM = NUM_0; //初始化模组1的数字状态
- MOD[1].LED = LED_PURPLE; //初始化模组2的LED状态
- MOD[1].CLO = CLO_DOWN; //初始化模组2的冒号状态
- MOD[1].NUM = NUM_1; //初始化模组2的数字状态
- Update(); //刷新显示
- while(1)
- {
- ;
- }
- }
https://github.com/aguegu/nixie-tube/downloads
该模块的Datasheet下载地址请移步:
QS30-1NixieModuleUserManual_CH
Qs30-1NixieModuleUserManual_EN
同时,该模块已经完美应用于Arduino系统,由aGuegu制作了完美的Nixie Module驱动类库,并且完全开源。
详情及下载请见阿古作坊: QS30-1 辉光管通用模块 Arduino 类库开发记