原创 零基础学FPGA(十九)新人必进,1602动态电子可调时钟设计,练一下代码风格吧

2014-12-6 20:44 3200 10 20 分类: FPGA/CPLD 文集: FPGA/CPLD

     之所以取这个标题名呢~感觉这个实验还是蛮重要的,当初我在学单片机的时候也是通过这个实验来巩固了一下自己的代码风格,当然这个实验涉及的东西还是挺多的,如果是新手,想要自己设计出来还是有点难度的,当然这个设计目前对我来说不算难了应该,写这篇文章的目的呢就是想巩固一下自己的代码风格,因为以前学习大多是先看懂别人的代码之后,然后根据自己的理解再敲上一遍,这次不同,这次的代码是小墨同学没有参考任何其他教程的情况下,用自己脑子里的东西写的,自我感觉条理还算清楚,估计新手看起来应该还是比较容易上手的,不过由于小墨同学资历尚浅,对于资源,速度的问题考虑的过少,没有对这个设计进行优化,但是想想,以一种直白的方式交给刚入门的同学,避免了优化代码带来的一些迷惑,这便是这篇文章的目的了。这篇文章只介绍电子时钟设计部分,至于1602的其他用法希望各位自行学习~

      现在已经进入了12月,也就是考试月了,对于我这么一个大三的学生来说,专业课铺天盖地可以说,再说我们通信专业也不是什么好学的科目,估计未来一个月文章会更新的慢一点。希望大家多多支持~下面我们开始是今天的教学

 

     这次我们要做的是一个电子时钟,动态可调并在1602上显示,那我们就先来了解一下1602.其实液晶这部分感觉都差不多,大家要是会了1602,那么上手12864也不成问题了

 

1、操作时序

360桌面截图20141206185349.jpg
 
       1602要用到的管脚也就是4个,即
               1、rs数据命令选择端
               2、wr读写控制端
               3、lcden使能信号
               4、8位的数据端口
 
而且1602的读功能我们用不到,所以wr一直置0即可,要控制的就是rs端,数据端和lcden端
 
2、写时序
 
由于读操作我们用不到,直接来看写操作好了
 
360桌面截图20141206190308.jpg
 
由上图得,我们如果要写命令的话,就要在rs为低电平的时候给数据端送8位命令数据,然后等一段时间后有一个lcden的高脉冲即可使数据有效,注意这个lcden的高脉冲要掩饰一点时间
 
 
3、初始化设置
 
360桌面截图20141206190711.jpg
 
这里我们要显示一个2行,16位的液晶,5x7点阵,8位数据接口,不显示光标
故初始化的时候我们要进行的操作是送1602这两个命令,好下面我们开始写程序
 
4、程序设计
 
      有些人会问,1602的时序图上的延时怎么操作?这个问题已经有好几位网友问过我了,这里,我们需要用到状态机。由于我们的时钟是50Mhz,一个周期为20ns,对于1602来说这个频率太高了,因此我们需要分频。再看看1602的datasheet里的延时参数,这里我们设置供1602的时钟
 
360桌面截图20141206191512.jpg
 
做好了时钟我们就可以来写状态机了,首先我们需要把RS拉低,因为我们要对1602进行初始化,然后给1602送初始化数据,即0x38,延时一个时钟周期之后将使能端拉高。注意这里的一个时钟周期是我们之前的分频后的时钟,大约1ms,然后再等待一个时钟周期后将lcden拉低,并送光标显示数据0x3c
360桌面截图20141206192538.jpg
 
接着,按照上述方法设置1603写一个字符后地址指针加1和显示清零命令,即0x06和0x01
 
360桌面截图20141206192819.jpg
 
然后我们需要确定我们的时钟的时间显示地址
360桌面截图20141206193110.jpg
 
例如,我想把时钟的小时的十位写在04的位置上,这样我们就需要写命令给1602,告诉它我们要写的地址为 0x80 +4 = 0x84,故要给1602送0x84
360桌面截图20141206193328.jpg
 
 
这样我们的初始化就结束了,初始化结束之后,我们需要写数据了。与写指令不同的是,这里仅需将RS拉高,其他时序不变,下面我们来写时间,我的思路是先将时分秒写进去,再利用状态机循环刷新
360桌面截图20141206195248.jpg
 
分钟和秒钟的书写规则和小时相同,写完后要回到刚开始写的地址处进行循环,即0x84
360桌面截图20141206195443.jpg
 
 
静态时钟写完了,这个时候如果把程序下到板子里,液晶屏上应该显示“00:00:00”,下面我们让这个时钟动起来,这就需要我们令开启一个进程,专门用来进行时钟计数,这里要用到分频电路,这次要分频1秒钟
360桌面截图20141206195912.jpg
 
计数完成之后我们需要将时分秒进行处理,因为我们往1602里写数据一次只能写1位,故,我们需要把时分秒的十位和各位分开来再送到1602,这里就用到了求模求余算法了
 
360桌面截图20141206200146.jpg
 
 
这样的话我们的时钟应该就可以动起来了,这里再说一下求模求余算法,例如分钟是45分,45对10求模即4,送到相应的10位上去,45对10求余,即5,送到相应的个位上去即可。
 
除了让时钟动起来之外,我们还可以再加一个功能,实现可调,这就需要用到按键,功能如下:
     1、键1按下时,时钟停止计时
     2、键2、3、4按下时,分别对时分秒进行调整
     3、键1再次按下时,时钟开始计时
 
     说到按键,就要用到按键消抖了,这就是前面的知识了,这里不做重复,详细见源代码,这里提供部分代码
 
360桌面截图20141206200743.jpg
 
 
接着对相应位进行操作即可
 
360桌面截图20141206200847.jpg
360桌面截图20141206200856.jpg
 
 
 
这样我们的时钟算是设计完成了,至于其他功能,大家可以另行拓展,在这里小墨同学就给大家布置一项作业吧,实现多功能电子时钟设计,功能如下:
 
1、 实现年月日显示,并按照平年闰年,大月小月计数
2、实现定时报警功能,即闹钟
3、让显示的时间上电的时候从右面慢慢滑进来
 
下面是实验结果测试图片
 
360桌面截图20141206202036.jpg
 
 
 
 以后小墨同学的文章将在EDNchina和北京至芯科技官方技术论坛同时更新,至芯科技的官方技术论坛也有很多的资料供大家下载,里面也有小墨的专题板块,希望广大网友和爱好者的大力支持~
小墨同学专版网址
下面是至芯科技官方网站,夏宇闻教授和那里的老师都超好的~有意愿接受FPGA培训的可以找工作人员咨询
       以后小墨同学的教程会跟这款开发板配套,想跟小墨同学一起学习,一起进步的的可以考虑一下购买一块开发板,毕竟学习要舍得投资嘛,下面是开发板淘宝链接
 
 

文章评论10条评论)

登录后参与讨论

用户1870125 2016-2-1 19:26

NB!!!

用户1850535 2015-8-30 04:24

hao

用户1740962 2015-3-9 17:21

好,学习

用户1708481 2014-12-16 13:27

代码思路很清晰 值得学习一下

用户1758662 2014-12-15 10:36

我也来练一下

用户1711475 2014-12-12 15:31

不错,好东西!代码很规范。

用户1081529 2014-12-11 16:30

好,学习之

584642877_350004634 2014-12-10 12:15

好的,谢谢你,我会继续学习的

用户1816569 2014-12-10 10:10

良好的代码风格,状态机一般是三段式书写,这样便于维护而且综合容易实现!

用户1816569 2014-12-10 10:01

分频模块分频后的时钟周期应为2ms而不是1ms,理由如下:源时钟频率f=50Mhz所以周期T=1/50*10^6s,计数到N=50000时生成时钟翻转一次,所以生成时钟半周期T0=N*T=1ms,因此其周期T=2*T0=2ms
相关推荐阅读
小墨同学 2015-09-10 10:28
零基础学FPGA( 三十二) 写在京城,多级FIR半带滤波器的FPGA实现
        每次到京城来总不能忘了出去逛逛吧,偌大的北京城去哪呢?炙热的大太阳烤的哪都不想去了,幸好这次有亲戚来北京旅游,搭个顺风车便出去转了一下。这次的闲逛可没有上次那么感叹,上次主要是去的...
小墨同学 2015-08-29 15:19
零基础学FPGA(三十三)多相结构抽取滤波器笔记
        前两篇文章已经介绍过了,在多速率信号处理中,CIC滤波器和FIR半带滤波器应用的非常广泛,由于CIC滤波器的特殊结构,使得它非常适合采样速率远远大于信号速率的情况时的抽取跟内插滤波...
小墨同学 2015-08-29 15:18
零基础学FPGA(三十一)写在京城,Hogenauer CIC抽取滤波器的FPGA实现笔记
         实习完还没几天,突然接到北京至芯雷总的电话,让我赶往北京来做一些事情,就这样,我的又一趟北京之旅开始了。         上次来北京还是今年1月份,冬天嘛,京城光秃秃的一片,...
小墨同学 2015-08-05 20:50
【博客大赛】零基础学FPGA (二十六)必会! 从静态时序分析到SDRAM时序收敛(上篇)
    好像小墨有这么一个习惯啊,就是每篇文章的开头总喜欢叨叨几句啊~既然这样,那我们今天也聊几句好了,总感觉直接就开始学习专业知识有点让人看不进去~     今天我们就说说生活吧~时间很快啊,...
小墨同学 2015-07-26 21:57
[博客大赛]零基础学FPGA(三十) IIR数字滤波器的FPGA实现笔记
      然而暑假已经过了快一半,想想也是挺快的,前一段时间学校安排实习,在长沙待了一段时间,说是实习,感觉却是像是度假,住着酒店,100多号人,想想都觉的热闹。实习搞得是Java安卓,当然我也...
小墨同学 2015-06-17 09:50
[博客大赛] 零基础学FPGA (二十九)滤波器开篇,线性相位FIR滤波器的FPGA实现
        也是有一段时间不写博客了啊,主要是这学期的实验课太多,每天都是在写预习报告,实验报告中度过,也快到考试月了啊,感觉又要忙起来了,今天就抽点时间来开个头,开什么头呢?对!就如标题所示...
我要评论
10
10
关闭 站长推荐上一条 /2 下一条