这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 辉光管显示模块 介绍【软件篇】【精华】

共1条 1/1 1 跳转至

辉光管显示模块 介绍【软件篇】【精华】

高工
2013-09-23 16:00:13     打赏
在上一篇文章中,重点介绍了辉光管显示模块的硬件部分及设计、制作过程。
或许我们对她独特的显示效果始终难以忘怀,但要让她焕发夺目色彩,重点还在于应用。该模块在其硬件方面已经具备了完备的功能,应用软件方面则需要结合实际应用要求来设计。先来回忆一下那种火红的朦胧:

无论何种应用方案,基于硬件设计原理,该模块的底层控制实为对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和辉光管进行控制,在这里我采用了结构体来对整个模块的各种显示模式进行了配置。
代码如下:
  1. struct t_Module
  2. {
  3.     uint    LED;        //LED颜色
  4.      uint     CLO;        //冒号状态
  5.      uint     NUM;        //显示数字
  6. };


同时,根据各种显示状态,按照对应关系表进行了预定义,每个状态被定义成一个16位的uint类型常量。
代码如下:
  1. #define    LED_OFF            0x7000         //LED关
  2. #define    LED_WHITE        0x0000        //LED白色
  3. #define    LED_PURPLE        0x4000        //LED紫色
  4. #define    LED_CYAN        0x2000        //LED青色
  5. #define    LED_YELLOW        0x1000        //LED黄色
  6. #define    LED_BLUE        0x6000        //LED蓝色
  7. #define    LED_GREEN        0x3000        //LED绿色
  8. #define    LED_RED            0x5000        //LED红色
  9. #define    CLO_OFF            0x0000         //氖灯关
  10. #define    CLO_UP            0x0400        //氖灯上点亮
  11. #define    CLO_DOWN        0x0800        //氖灯下点亮
  12. #define    CLO_BOTH        0x0C00        //氖灯全亮
  13. #define    NUM_OFF            0x0000        //无数字显示
  14. #define    NUM_0            0x0200        //显示数字0
  15. #define    NUM_1            0x0001        //显示数字1
  16. #define    NUM_2            0x0002        //显示数字2
  17. #define    NUM_3            0x0004        //显示数字3
  18. #define    NUM_4            0x0008        //显示数字4
  19. #define    NUM_5            0x0010        //显示数字5
  20. #define    NUM_6            0x0020        //显示数字6
  21. #define    NUM_7            0x0040        //显示数字7
  22. #define    NUM_8            0x0080        //显示数字8
  23. #define    NUM_9            0x0100        //显示数字9


接下来,只需要将各个模块的显示模式配置好就OK了,例如:
1、将模块1的LED配置为白色,两个氖灯只亮起上面的那颗,辉光管显示数字0;
2、将模块2的LED配置为紫色,两个氖灯只亮起下面的那颗,辉光管显示数字1;
代码如下:
  1. MOD[0].LED    =     LED_WHITE;    //初始化模组1的LED状态
  2. MOD[0].CLO    =     CLO_UP;    //初始化模组1的冒号状态
  3. MOD[0].NUM    =     NUM_0;        //初始化模组1的数字状态
  4. MOD[1].LED    =     LED_PURPLE;    //初始化模组2的LED状态
  5. MOD[1].CLO    =     CLO_DOWN;    //初始化模组2的冒号状态
  6. MOD[1].NUM    =     NUM_1;        //初始化模组2的数字状态


配置完显示模块的显示模式,接下来就需要将显示模式配置为N个模块需要的2byte数据,通过74HC595通讯函数发送给显示模块。
在这里设计了两个函数,一个是Send595()函数,用于发送两个字节数据到串行总线上,一个是Update()函数,用于根据显示模块的显示模式计算要发送的两个字节数据。
代码如下:
  1. /*********************************************************************
  2. **     函数名称:            void     Send595(uchar count,uchar dat)
  3. **    功能描述:            向74HC595发送数据
  4. **    入口参数:            count:    发送数据的位数
  5. **                    dat:        发送的数据(MAX 16Bit)
  6. *********************************************************************/
  7. void     Send595(uint count,uint dat)
  8. {
  9.     for(;count>0;count--)
  10.     {
  11.         DATA = dat&0x8000;
  12.         SHCP  = 1;
  13.         SHCP  = 0;
  14.         dat<


有了以上函数,只需要在主函数里配置好相应的结构体,然后调用Update()函数即可更新所有显示内容。
照片中,我采用的是C8051F340的最小系统版,在此贴出主函数,以供大家参考:
  1. /*********************************************************************
  2. * 函 数 名: main()
  3. * 功能描述: 主程序
  4. * 设 计 者:严泽远 日期:2012-06-29 17:11
  5. * 修 改 者:严泽远 日期:2012-06-30 15:22
  6. * 版    本:v1.0.0
  7. *********************************************************************/
  8. main()
  9. {
  10.     uint    i=0x0001;
  11.     uchar    j=0;
  12.     Port_IO_Init();                //IO资源配置
  13.     Oscillator_Init();            //晶体振荡器初始化    
  14.     OE    =    0;            //输出使能 或采用PWM控制来调节整体亮度
  15.     MOD[0].LED    =     LED_WHITE;    //初始化模组1的LED状态
  16.     MOD[0].CLO    =     CLO_UP;    //初始化模组1的冒号状态
  17.     MOD[0].NUM    =     NUM_0;        //初始化模组1的数字状态
  18.     MOD[1].LED    =     LED_PURPLE;    //初始化模组2的LED状态
  19.     MOD[1].CLO    =     CLO_DOWN;    //初始化模组2的冒号状态
  20.     MOD[1].NUM    =     NUM_1;        //初始化模组2的数字状态
  21.     Update();                //刷新显示
  22.     while(1)
  23.     {
  24.     ;
  25.     }
  26. }
需要下载完整代码的朋友请移步:
https://github.com/aguegu/nixie-tube/downloads
该模块的Datasheet下载地址请移步:
QS30-1NixieModuleUserManual_CH
Qs30-1NixieModuleUserManual_EN
同时,该模块已经完美应用于Arduino系统,由aGuegu制作了完美的Nixie Module驱动类库,并且完全开源。
详情及下载请见阿古作坊: QS30-1 辉光管通用模块 Arduino 类库开发记




关键词: 辉光     显示     模块     介绍     软件     精华     数字     状态     #    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]