原创 POV LED(我的新版旋转灯)二

2012-8-12 11:03 2847 12 14 分类: 工程师职场

 

视频的播放地址 http://v.youku.com/v_show/id_XNDM4MTYyMjIw.html

 

2.       程序编写

        首先,我还是想的是直接显示汉字为主吧。这个程序和LED点阵的是相似的。原理就不用再介绍了。直接写个程序就可以了。

20120812105410642.gif

 

呵呵 ,大白天的效果也是不错的啊。就是噪声有点大。估计是电机的原因了。

 

再往后就是这次制作POV LED的重点了。怎么让他全屏滚动。这个我发现其实也是很简单。稍微改动一下显示的最大数据量就可以了。比如,上面的几个汉字,我只是显示了224个数据(2×16×7)。所以,适当的增加一点就可以满屏显示并滚动了。这个视频就不怎么样了。闪的厉害啊。

 

其实,我发现这个全屏的滚动,和电机旋转的稳定性有着至关重要的作用。当你调整好程序之后,却发现电机工作不稳定,一会快,一会慢,上面字来回移动,有的时候出现重叠的情况,整个屏都会闪的很厉害。所以,电机的选用也是一个重点,如果想接着往下做,就需要准备一个好的电机了,当然,选择一个步进电机自己控制速度,应该最理想吧?这个以后在验证了。

 

 

下面是开始制作表盘了啊。首先,由于我的单片机工作速度很慢,使用的是外部32768kHZ的晶振,没有接高速晶振,所以只好将就了啊。我选定的一周是120个点,也就是说,每2个点表示1的话,60秒是正好的。那么,就在中断程序里面定义一个P,是这个P转一周正好是120,这个需要不断的调节你的延时函数。我的这个单片机的工作速度很低,所以调节的时间更长,这个也启发着我,以后一定要用高速晶振。速度在1M以上最好。我之前的作品是51单片机,但是外界的是24M晶振啊。

 

先介绍一下我的电路吧,最外面的一个灯是绿色灯,初衷是用来表示秒针的。P3口(8个),P4口(8个),P5口(8个),P2口(2个)。一次排开,P2口在最里面。排的方法都是低位在外,高位在内,其中,P2口是P2.4~P2.7。绿灯是P6口,且只用了一个,所以操作起来就方便了啊。操作一个绿灯只需要直接对P6口操作就可以了。不用进行位操作了。P1口是留给了红外中断了。

下面我们接着上面的说。整个圆周分成了120份。每两个数表示一个秒数。这样,我们就可以使用下面的程序画出整个表盘来。

                if(p%10==0)//120/2/5=12,表示12个时针位置

                  P3OUT = 0XF0;

                else if(p%2==0)

                  P3OUT = 0XFC;

                else

                  P3OUT = 0XFE;

如下面的图片所示:

 

20120812105447778.gif

表盘上暂时没有加上数字,是因为单片机的速度问题吧。把这个工作放到了最后了。先把指针给显示出来在说表盘上数字的问题也不迟。

下面我们重点分析指针的问题了。

第一个是非常简单的秒针了。秒针我只用最外面的绿灯来代替。如果用双色LED表示时针和分针,那程序写起来就会方便很多了。

在制定位置显示秒针呗,程序如下:

              //下面部分用于显示秒针的位置

                if(p==miao*2)

                  P6OUT = 0X00;//显示出秒针

                else

                  P6OUT = 0XFF;//否则,不显示秒针的位置.

如果是秒针的位置,则显示秒针,否则,都熄灭LED灯。这样就可以了。我的板子上没有时钟芯片,所以我就使用定时器吧。使用MSP430内部的看门狗定时器,定时一秒,这个不是很准确,但是,好几天错上一分钟两分钟的还是可以接受的。最主要的是,这个东西就是显示出来看看的,最起码,这个作品我还没有打算一直挂在墙上当钟的打算,等我下回把噪声给降低了,在做考虑吧。所以,表走走就行,能写出这个程序就算成功了啊。

 

下面在分析时针和分针了。这两个指针有相互重叠的地方。因为我打算使用P4,P5,P2作为分针,P5,P2作为秒针。重叠的地方怎么处理呢?这个就需要做出判断了啊。在写分针的时候,分针需要在擦除分针显示的时候,需要判断时针是否存在,如果时针存在,那么需要保留时针的显示。这个就是两个指针交叉问题我的解决方法。

 

我的指针,分针是小箭头,占用3个格,分别是fen-1,fen,fen+1。时针占用5个格,分别是shi-2,shi-1,shi,shi+1,shi+2。控制显示着部分的函数贴出来给大家看看。大家应该有比这个要好的多的方法,希望高手多多指教。

              /***********************************************

                下面部分用于显示时针和分针,由于时针和分针是

                有一部分重合的地方,所以需要交叉讨论。

              ***********************************************/                               

                //因为P4部分不会影响到时针,所有先单独拿出来考虑

                if(fen == 0)

                {

                    if(p==118)

                      P4OUT = 0XFD;

                    else if(p==2)

                      P4OUT = 0XFD;

                    else if(p==0)

                      P4OUT = 0X00;

                    else

                      P4OUT = 0XFF;

                }

                else  if((p>=(fen-1)*2)&&(p<=(fen+1)*2))

                {               

                      if(p==(fen-1)*2)

                        P4OUT = 0XFD;//分针箭头的左端

                      //这部分只有分针有,与时针不冲。

                      if(p==(fen+1)*2)

                        P4OUT = 0XFD;

                      if(p==fen*2)

                        P4OUT = 0X00;

                }

                else

                      P4OUT = 0XFF;

               

               if((p==fen*2)&&(p==fen*2+1))

                  {

                    //P4OUT = 0X00;

                    P5OUT = 0X00;

                    P2OUT = 0X00;

                  }

                else

                {

                  //先关闭所有的LED灯,在考虑不同的情况。

                  //如果以下五种情况都不存在,那么就直接熄灭LED灯就可以了

                  //注意,表芯是P2.7,这个灯不能熄灭,一直亮着。

                  //P4OUT = 0XFF;

                  P5OUT = 0XFF;

                  P2OUT = 0X7F;

                  //重合的五种情况

                  if(p==((shi*10-4)+ffss))

                    P5OUT = 0XFB;

                  else if(p==((shi*10-2)+ffss))

                    P5OUT = 0XFD;

                  else if(p==((shi*10)+ffss))

                  {

                    P5OUT = 0X00;

                    P2OUT = 0X00;

                  }

                  else if(p==((shi*10+4)+ffss))

                    P5OUT = 0XFB;

                  else if(p==((shi*10+2)+ffss))

                    P5OUT = 0XFD;

                }

 

20120812105522928.gif

        上面的程序为什么要单独考虑fen=0的情况呢?因为在分针指到0处时,左边的数据应该是118,而右边的P的值则成了2了。中间的值正好是0.所以这个位置不符合正常情况,所以需要拿出来单独处理了。时针也是需要单独处理的,不过时针的处理上面还没有,我还没有写。呵呵。

        这个的效果已经可以满足我们的简单需求了。如下图所示了。

 

20120812105554478.gif       

下面的工作就是给这个表盘上面添加上数字了。为了添加数字,我想,应该把分针变短一点啊。这样好腾出空来显示数字。因为,显示数字最起码需要6个空的地方。不过,那样会同时使用P4口和P3口,这样很是麻烦,我还是先直接只使用P3口来显示吧。情况要看看效果了啊。

 

自己算了一下,显示数字,最少要用5个LED灯,于是就自己做了张表格,看看到底哪些位需要用。做了一个table,把数据放到里面,数据的低三位是用于给程许显示表盘的刻度的。所以,用一个&操作就可以了。 显示如下图所示:

 

 

20120812105635152.gif

文章评论2条评论)

登录后参与讨论

用户377235 2014-9-19 05:51

厉害啊!学习了 我也想做一个

用户377235 2012-8-22 09:40

厉害!学习了,非常感谢!
相关推荐阅读
512826028 2015-09-07 00:32
Discuz论坛插件开发资料留存区
这部分就是我用过的资料网站资源等等的汇总。   第一个插件开发 新手教程 http://www.cnblogs.com/upmyself/archive/2013/01/16/286339...
512826028 2015-09-06 21:39
学习Discuz论坛插件开发二
    使用filezille对指定的config文件修改之后,就在discuz论坛后台的插件里面看到了多了一项,就是我需要的 插件开发一项。点进去之后,系统会自动提示此功能仅限开发者使用。 ...
512826028 2015-09-06 20:53
学习Discuz论坛插件开发一
     接触Discuz论坛有几个月的时间了,最近感觉里面的插件很是让我激动,于是,鼓起勇气,开始学习一下怎么自己开发一下插件。       首先接触插件学习,看的是Discuz论坛提供的插...
512826028 2015-09-06 20:27
正式开始蓝线技术,自己重新写博客
        由于CSDN博客很久没有使用,结果给我封了。就暂时把网络部分写这里了。后期会有单片机和蓝牙部分,以后也发表到这个板块里面了。   给自己打打气,加油!      至于啥...
512826028 2012-08-12 10:46
POV LED(我的新版旋转灯)三
由于我没有画电路图。所以,也没有什么电路图给大家看。电路很简单。LED电路使用共阳接法,串接的是330欧姆的电阻。电阻和LED的型号都是0805. 从最外圈向里数,依次是一个绿色LED灯(接P6口),...
我要评论
2
12
关闭 站长推荐上一条 /2 下一条