点阵之路_STC15单片机+16*24点阵+DS1302时钟

代码是在工作室大神的指导下完成的,有bug的地方,还望多多包涵,开源给大家做一个参考~话不多说,先把代码奉上~~~

链接: https://pan.baidu.com/s/1qj-iTDMvCHDDdZ7J2MJ4-A 
提取码:6rpd 

文件夹内容如下:
点阵之路_STC15单片机+16*24点阵+DS1302时钟_第1张图片


实物图片如下,先有一个大概的图片,然后才能给大家说一下下边的原理~

这个是时间显示:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第2张图片

这个是年份以及日期显示:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第3张图片

这个是星期的显示:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第4张图片

这个是最后面的图:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第5张图片

侧面图:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第6张图片

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第7张图片


硬件介绍及原理

1. 主控:STC15F2K60S2,或者IAP15W4K58S4均可,具体的芯片手册可以到STC官网上去下载!

2. 点阵:采用型号为 788BS 的点阵,体积小但是分辨率要更高一点

参考资料:https://blog.csdn.net/Fighting_Boom/article/details/82936458

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第8张图片

3. 驱动电路,用了74HC138译码器,然后再身边大神给的原理图基础上,继续改进了一下!下边会给上原理图以及实物图,自己手工跳线焊接的,可能不太好看,但是使我自己对点阵了解了更多一线!这个是38译码器以及单片机的接口图:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第9张图片

原理简单介绍一下:

        一共用了3块38译码器,然后把6块点阵分为两行三列,每一列阴极并联接一块74HC138的输出口,然后3块译码器刚好够用,接着把第一行的阳极并联到一块,接到单片机的P0端口,再把第二行的阳极并联到一块,接到单片机的P1端口,这个是用单片机直接驱动的,所以看着不是特别亮,这个也是一个缺点,但是由于是自己手工跳线焊接的,板子也不大,所以就没想这么麻烦,就想着这个亮度就好,然后就没加三极管驱动电路,不过可以自己加驱动电路,显示效果更好!

6块点阵的数组顺序我自己写了一下,可以参考一下:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第10张图片

一共有48个char型码,在数组中的围着分别对应上图,不懂得可以写一下,这样有助于理解!

4. 时钟电路还是用的DS1302,从上边图片可以看到。然后就是程序中的接口可能换了,参考下图,不过不碍事,端口可以自定义!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第11张图片


程序

程序内容参考此文件夹:

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第12张图片

1. 初始化定时器0,这个定时器主要还是用来放刷新函数的,然后刷新频率可以自己设置定时器初值进行修改!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第13张图片

2. 对应的定时器0的中断函数如下,同上一个点阵类似,中断内只放了一个刷新函数!剩下的是行消隐,不然会有重影!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第14张图片

3. IO口初始化,STC15系列,最好要对IO口初始化一下!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第15张图片

4. 主要的显示函数,同8*16点阵一样,采用两个数组替换的方式,大概思路都没变。第一行送数组的偶数个数,接下来第二行送数组奇数个数,然后数组列  K_column = row/2,则是选中第几列,如果 row = 0 或者 row = 1 在除以2之后是0,也就是选中了第一列,然后 row 依次加2,则是因为有两行,这个应该很好理解,以后再大点的点阵也是这个思路,最后在函数结尾要对 row 的值进行一个判断。

注意:函数每进一次中断时刷新一列的!因为进一次中断运行一次显示函数,然后 row = row + 2! 

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第16张图片

 5. 截下来的时间函数,日期函数,星期函数,都差不多,我这个写法比较笨,是对数组每一个进行单独操作,这样的好处是可以理解的更透彻,但是写起来就特别麻烦!是一个缺点,等我以后慢慢学的更深了,在做改进!因此这个地方的函数就不再赘述。

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第17张图片

6. 按键处理函数焊接了5个按键,但是只有左边第一个,然后最右边两个用到!因此用这个函数得到一个返回值即可!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第18张图片

7. 按键修改函数,只说一个修改秒的,剩下的基本相同!判断得到的返回值是不是mode键,是的话就要就该时间,按下一次就是秒,因为下边每一个修改函数都是一个 while 死循环,知道一次跳出所有修改值才可以。然后再修改秒的while函数内,用了一个 Current_change()用来只显示当前修改的内容,这样更加方便一点,然后再循环内部,再次获取按键值,再次判断是加数还是减数,用了一个修改时间的函数!最后判断如果还是 mode 键就跳出这个循环,到下一个死循环里边~

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第19张图片

8. 只显示当前修改内容函数,写的是真的麻烦,不过我感觉这样能使自己更清楚,然后再慢慢简化代码,不然你原理都不清楚,何谈简化代码!这个只让秒显示的就是把其他位全部屏蔽掉了!其他的类似~~~

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第20张图片

9. 这个是修改时间函数,以修改秒为例,只需要更改 DS1302 子程序中的数组 TIME[ ]  的相应位即可,然后判断形参,进而更改模式以及控制加减等。

此句判断是因为 TIME 数组里边是按照BCD码的格式存储的,因此用求余16来判断是否需要进位(参考 0xff 每一位可以最大到 f 也就是16个数,然后如果求余16大于9,证明到了现实ABCDEF这几个字母的时候,这个时候让TIME[0] + 6,即可实现进位,同样还是BCD格式显示),这点是我自己理解的,可能还不是太清楚,有错误还望及时指正!

然后需要判断一个上限一个下限值,及时复位即可,比如秒是 0~59 ,则要在加的时候判断是否大于59,大于的话要清零,在减的时候判断是否等于0,如果已经等于0,再减就要复位为59!

接下来一定要加 DS1302Init() 初始化,这样才能把修改的值送进去!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第21张图片

10. 主函数,这个文件是测试文件,因此把切换显示注释掉了,想做的话可以参考注释部分,这个比较简单,花样不是很多,主要是我现在还不是太会,等慢慢学习吧!

点阵之路_STC15单片机+16*24点阵+DS1302时钟_第22张图片


附录一下

1. 点阵阳极没有加驱动电路,导致亮度不是很够,可以改进!

2. 感觉最重要的一点就是,程序不够简洁,太复杂了,这个跟我自身能力也有关系,我会努力提升的!

3. 整个板子都是自己跳线焊接出来的,因此干扰比较大,也比较麻烦,当然这个也仅仅是用来测试一下,还有部分原因是因为,自己小点阵买多了,想赶紧用掉~~~哈哈

4. 有错误的地方还望多多指正,然后不懂得可以评论,大家共同学习!

你可能感兴趣的:(#,51_STM-32)