视频的播放地址 http://v.youku.com/v_show/id_XNDM4MTYyMjIw.html
2. 程序编写
首先,我还是想的是直接显示汉字为主吧。这个程序和LED点阵的是相似的。原理就不用再介绍了。直接写个程序就可以了。
呵呵 ,大白天的效果也是不错的啊。就是噪声有点大。估计是电机的原因了。
再往后就是这次制作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;
如下面的图片所示:
表盘上暂时没有加上数字,是因为单片机的速度问题吧。把这个工作放到了最后了。先把指针给显示出来在说表盘上数字的问题也不迟。
下面我们重点分析指针的问题了。
第一个是非常简单的秒针了。秒针我只用最外面的绿灯来代替。如果用双色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;
}
上面的程序为什么要单独考虑fen=0的情况呢?因为在分针指到0处时,左边的数据应该是118,而右边的P的值则成了2了。中间的值正好是0.所以这个位置不符合正常情况,所以需要拿出来单独处理了。时针也是需要单独处理的,不过时针的处理上面还没有,我还没有写。呵呵。
这个的效果已经可以满足我们的简单需求了。如下图所示了。
下面的工作就是给这个表盘上面添加上数字了。为了添加数字,我想,应该把分针变短一点啊。这样好腾出空来显示数字。因为,显示数字最起码需要6个空的地方。不过,那样会同时使用P4口和P3口,这样很是麻烦,我还是先直接只使用P3口来显示吧。情况要看看效果了啊。
自己算了一下,显示数字,最少要用5个LED灯,于是就自己做了张表格,看看到底哪些位需要用。做了一个table,把数据放到里面,数据的低三位是用于给程许显示表盘的刻度的。所以,用一个&操作就可以了。 显示如下图所示:
用户377235 2014-9-19 05:51
用户377235 2012-8-22 09:40