对于光立方,首先要清楚其工作原理,整个点亮的过程,单片机需要一直工作的,单片机每一次发送的数据只能点亮一层的特性得知,在整个画面显示图案的时候,即使是静止的图案,那么单片机也是在不断循环工作的。如果单片机停止了工作,那么光立方得图案即会消失。
又由于这个特性,如果点亮某一层后停留的时间不一样,就会造成每一层的亮度不均匀,所以为了避免这些,需要一个准确的时间基准来依次点亮光立方的每一层,方法有很多,但单片机不能总处理这么一个任务,他可能要处理的还有,动画的实时运算,其他数据的采集和处理等,所以考虑到这些任务都是需要实时运行的,编程难度似乎加大了不少,这时需要引入单片机中断这一基础功能,难题便会迎刃而解。
首先定义一个缓存数组,用于储存所有的光立方每一点的数据,暂且理解为显存。我通常用display[8][8]定义为数组。
下面就要定期把这个数组定期发送至驱动板中,时间如何去定义。
我查阅资料后发现,当现实器播放大于15帧的动画时,才会在我们的眼中形成流畅的效果。那么光立方刷新频率要大于15hz/s(越大越好,但是越大单片机负载也越大),这里也就是说,每1/15秒就要进行一次全部图的刷新,又由于在相同时间,只有一层能够点亮,那么每一层停留的时间就是1/15/8s根据这些规则,我需要定义定时器让定时器有相应的数值。把这段专门用于刷新光立方显示的程序放于中断服务程序中。这样,我们程序的基础框架就有了。由于是定时器中断自动来刷新驱动板数据,这样我们看到的图像很稳定,亮度也均匀。而且我们再写其他的图案动画程序时候,不用再去考虑去更新驱动板数据,一切都会由中断自动完成。而我们如果要更改图案,我们只需要对数组所储存的数据进行更改即可,这也使我们的动画程序很驱动程序产生隔离,这样做的好处是即使更换了驱动板,那么也只需要对驱动函数(中断里面的程序)做相应的改动即可,不必再对其他程序改动。这也避免了“动一发而牵全身”的尴尬局面。