零基礎學(xué)FPGA(十七)新人必進(jìn),1602動(dòng)態(tài)電子可調時(shí)鐘設計,練一下代碼風(fēng)格吧
之所以取這個(gè)標題名呢~感覺(jué)這個(gè)實(shí)驗還是蠻重要的,當初我在學(xué)單片機的時(shí)候也是通過(guò)這個(gè)實(shí)驗來(lái)鞏固了一下自己的代碼風(fēng)格,當然這個(gè)實(shí)驗涉及的東西還是挺多的,如果是新手,想要自己設計出來(lái)還是有點(diǎn)難度的,當然這個(gè)設計目前對我來(lái)說(shuō)不算難了應該,寫(xiě)這篇文章的目的呢就是想鞏固一下自己的代碼風(fēng)格,因為以前學(xué)習大多是先看懂別人的代碼之后,然后根據自己的理解再敲上一遍,這次不同,這次的代碼是小墨同學(xué)沒(méi)有參考任何其他教程的情況下,用自己腦子里的東西寫(xiě)的,自我感覺(jué)條理還算清楚,估計新手看起來(lái)應該還是比較容易上手的,不過(guò)由于小墨同學(xué)資歷尚淺,對于資源,速度的問(wèn)題考慮的過(guò)少,沒(méi)有對這個(gè)設計進(jìn)行優(yōu)化,但是想想,以一種直白的方式交給剛入門(mén)的同學(xué),避免了優(yōu)化代碼帶來(lái)的一些迷惑,這便是這篇文章的目的了。這篇文章只介紹電子時(shí)鐘設計部分,至于1602的其他用法希望各位自行學(xué)習~
本文引用地址:http://dyxdggzs.com/article/271868.htm現在已經(jīng)進(jìn)入了12月,也就是考試月了,對于我這么一個(gè)大三的學(xué)生來(lái)說(shuō),專(zhuān)業(yè)課鋪天蓋地可以說(shuō),再說(shuō)我們通信專(zhuān)業(yè)也不是什么好學(xué)的科目,估計未來(lái)一個(gè)月文章會(huì )更新的慢一點(diǎn)。希望大家多多支持~下面我們開(kāi)始是今天的教學(xué)
這次我們要做的是一個(gè)電子時(shí)鐘,動(dòng)態(tài)可調并在1602上顯示,那我們就先來(lái)了解一下1602.其實(shí)液晶這部分感覺(jué)都差不多,大家要是會(huì )了1602,那么上手12864也不成問(wèn)題了
1、操作時(shí)序

1602要用到的管腳也就是4個(gè),即
1、rs數據命令選擇端
2、wr讀寫(xiě)控制端
3、lcden使能信號
4、8位的數據端口
而且1602的讀功能我們用不到,所以wr一直置0即可,要控制的就是rs端,數據端和lcden端
2、寫(xiě)時(shí)序
由于讀操作我們用不到,直接來(lái)看寫(xiě)操作好了

由上圖得,我們如果要寫(xiě)命令的話(huà),就要在rs為低電平的時(shí)候給數據端送8位命令數據,然后等一段時(shí)間后有一個(gè)lcden的高脈沖即可使數據有效,注意這個(gè)lcden的高脈沖要掩飾一點(diǎn)時(shí)間
3、初始化設置

這里我們要顯示一個(gè)2行,16位的液晶,5x7點(diǎn)陣,8位數據接口,不顯示光標
故初始化的時(shí)候我們要進(jìn)行的操作是送1602這兩個(gè)命令,好下面我們開(kāi)始寫(xiě)程序
4、程序設計
有些人會(huì )問(wèn),1602的時(shí)序圖上的延時(shí)怎么操作?這個(gè)問(wèn)題已經(jīng)有好幾位網(wǎng)友問(wèn)過(guò)我了,這里,我們需要用到狀態(tài)機。由于我們的時(shí)鐘是50Mhz,一個(gè)周期為20ns,對于1602來(lái)說(shuō)這個(gè)頻率太高了,因此我們需要分頻。再看看1602的datasheet里的延時(shí)參數,這里我們設置供1602的時(shí)鐘

做好了時(shí)鐘我們就可以來(lái)寫(xiě)狀態(tài)機了,首先我們需要把RS拉低,因為我們要對1602進(jìn)行初始化,然后給1602送初始化數據,即0x38,延時(shí)一個(gè)時(shí)鐘周期之后將使能端拉高。注意這里的一個(gè)時(shí)鐘周期是我們之前的分頻后的時(shí)鐘,大約1ms,然后再等待一個(gè)時(shí)鐘周期后將lcden拉低,并送光標顯示數據0x3c

接著(zhù),按照上述方法設置1603寫(xiě)一個(gè)字符后地址指針加1和顯示清零命令,即0x06和0x01

然后我們需要確定我們的時(shí)鐘的時(shí)間顯示地址

例如,我想把時(shí)鐘的小時(shí)的十位寫(xiě)在04的位置上,這樣我們就需要寫(xiě)命令給1602,告訴它我們要寫(xiě)的地址為 0x80 +4 = 0x84,故要給1602送0x84

這樣我們的初始化就結束了,初始化結束之后,我們需要寫(xiě)數據了。與寫(xiě)指令不同的是,這里僅需將RS拉高,其他時(shí)序不變,下面我們來(lái)寫(xiě)時(shí)間,我的思路是先將時(shí)分秒寫(xiě)進(jìn)去,再利用狀態(tài)機循環(huán)刷新

分鐘和秒鐘的書(shū)寫(xiě)規則和小時(shí)相同,寫(xiě)完后要回到剛開(kāi)始寫(xiě)的地址處進(jìn)行循環(huán),即0x84

靜態(tài)時(shí)鐘寫(xiě)完了,這個(gè)時(shí)候如果把程序下到板子里,液晶屏上應該顯示“00:00:00”,下面我們讓這個(gè)時(shí)鐘動(dòng)起來(lái),這就需要我們令開(kāi)啟一個(gè)進(jìn)程,專(zhuān)門(mén)用來(lái)進(jìn)行時(shí)鐘計數,這里要用到分頻電路,這次要分頻1秒鐘

計數完成之后我們需要將時(shí)分秒進(jìn)行處理,因為我們往1602里寫(xiě)數據一次只能寫(xiě)1位,故,我們需要把時(shí)分秒的十位和各位分開(kāi)來(lái)再送到1602,這里就用到了求模求余算法了

這樣的話(huà)我們的時(shí)鐘應該就可以動(dòng)起來(lái)了,這里再說(shuō)一下求模求余算法,例如分鐘是45分,45對10求模即4,送到相應的10位上去,45對10求余,即5,送到相應的個(gè)位上去即可。
除了讓時(shí)鐘動(dòng)起來(lái)之外,我們還可以再加一個(gè)功能,實(shí)現可調,這就需要用到按鍵,功能如下:
1、鍵1按下時(shí),時(shí)鐘停止計時(shí)
2、鍵2、3、4按下時(shí),分別對時(shí)分秒進(jìn)行調整
3、鍵1再次按下時(shí),時(shí)鐘開(kāi)始計時(shí)
說(shuō)到按鍵,就要用到按鍵消抖了,這就是前面的知識了,這里不做重復,詳細見(jiàn)源代碼,這里提供部分代碼

接著(zhù)對相應位進(jìn)行操作即可


這樣我們的時(shí)鐘算是設計完成了,至于其他功能,大家可以另行拓展,在這里小墨同學(xué)就給大家布置一項作業(yè)吧,實(shí)現多功能電子時(shí)鐘設計,功能如下:
1、 實(shí)現年月日顯示,并按照平年閏年,大月小月計數
2、實(shí)現定時(shí)報警功能,即鬧鐘
3、讓顯示的時(shí)間上電的時(shí)候從右面慢慢滑進(jìn)來(lái)
下面是實(shí)驗結果測試圖片

fpga相關(guān)文章:fpga是什么
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
評論