1. 程式人生 > >點陣之路_STC15微控制器+16*24點陣+DS1302時鐘

點陣之路_STC15微控制器+16*24點陣+DS1302時鐘

程式碼是在工作室大神的指導下完成的,有bug的地方,還望多多包涵,開源給大家做一個參考~話不多說,先把程式碼奉上~~~

資料夾內容如下:

實物圖片如下,先有一個大概的圖片,然後才能給大家說一下下邊的原理~

這個是時間顯示:

這個是年份以及日期顯示:

這個是星期的顯示:

這個是最後面的圖:

側面圖:

硬體介紹及原理

1. 主控:STC15F2K60S2,或者IAP15W4K58S4均可,具體的晶片手冊可以到STC官網上去下載!

2. 點陣:採用型號為 788BS 的點陣,體積小但是解析度要更高一點

3. 驅動電路,用了74HC138譯碼器,然後再身邊大神給的原理圖基礎上,繼續改進了一下!下邊會給上原理圖以及實物圖,自己手工跳線焊接的,可能不太好看,但是使我自己對點陣瞭解了更多一線!這個是38譯碼器以及微控制器的介面圖:

原理簡單介紹一下:

        一共用了3塊38譯碼器,然後把6塊點陣分為兩行三列,每一列陰極並聯接一塊74HC138的輸出口,然後3塊譯碼器剛好夠用,接著把第一行的陽極並聯到一塊,接到微控制器的P0埠,再把第二行的陽極並聯到一塊,接到微控制器的P1埠,這個是用微控制器直接驅動的,所以看著不是特別亮,這個也是一個缺點,但是由於是自己手工跳線焊接的,板子也不大,所以就沒想這麼麻煩,就想著這個亮度就好,然後就沒加三極體驅動電路,不過可以自己加驅動電路,顯示效果更好!

6塊點陣的陣列順序我自己寫了一下,可以參考一下:

一共有48個char型碼,在陣列中的圍著分別對應上圖,不懂得可以寫一下,這樣有助於理解!

4. 時鐘電路還是用的DS1302,從上邊圖片可以看到。然後就是程式中的介面可能換了,參考下圖,不過不礙事,埠可以自定義!

程式

程式內容參考此資料夾:

1. 初始化定時器0,這個定時器主要還是用來放重新整理函式的,然後重新整理頻率可以自己設定定時器初值進行修改!

2. 對應的定時器0的中斷函式如下,同上一個點陣類似,中斷內只放了一個重新整理函式!剩下的是行消隱,不然會有重影!

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

4. 主要的顯示函式,同8*16點陣一樣,採用兩個陣列替換的方式,大概思路都沒變。第一行送陣列的偶數個數,接下來第二行送陣列奇數個數,然後陣列列  K_column = row/2,則是選中第幾列,如果 row = 0 或者 row = 1 在除以2之後是0,也就是選中了第一列,然後 row 依次加2,則是因為有兩行,這個應該很好理解,以後再大點的點陣也是這個思路,最後在函式結尾要對 row 的值進行一個判斷。

注意:函式每進一次中斷時重新整理一列的!因為進一次中斷執行一次顯示函式,然後 row = row + 2! 

 5. 截下來的時間函式,日期函式,星期函式,都差不多,我這個寫法比較笨,是對陣列每一個進行單獨操作,這樣的好處是可以理解的更透徹,但是寫起來就特別麻煩!是一個缺點,等我以後慢慢學的更深了,在做改進!因此這個地方的函式就不再贅述。

6. 按鍵處理函式焊接了5個按鍵,但是隻有左邊第一個,然後最右邊兩個用到!因此用這個函式得到一個返回值即可!

7. 按鍵修改函式,只說一個修改秒的,剩下的基本相同!判斷得到的返回值是不是mode鍵,是的話就要就該時間,按下一次就是秒,因為下邊每一個修改函式都是一個 while 死迴圈,知道一次跳出所有修改值才可以。然後再修改秒的while函式內,用了一個 Current_change()用來只顯示當前修改的內容,這樣更加方便一點,然後再迴圈內部,再次獲取按鍵值,再次判斷是加數還是減數,用了一個修改時間的函式!最後判斷如果還是 mode 鍵就跳出這個迴圈,到下一個死迴圈裡邊~

8. 只顯示當前修改內容函式,寫的是真的麻煩,不過我感覺這樣能使自己更清楚,然後再慢慢簡化程式碼,不然你原理都不清楚,何談簡化程式碼!這個只讓秒顯示的就是把其他位全部遮蔽掉了!其他的類似~~~

9. 這個是修改時間函式,以修改秒為例,只需要更改 DS1302 子程式中的陣列 TIME[ ]  的相應位即可,然後判斷形參,進而更改模式以及控制加減等。

此句判斷是因為 TIME 數組裡邊是按照BCD碼的格式儲存的,因此用求餘16來判斷是否需要進位(參考 0xff 每一位可以最大到 f 也就是16個數,然後如果求餘16大於9,證明到了現實ABCDEF這幾個字母的時候,這個時候讓TIME[0] + 6,即可實現進位,同樣還是BCD格式顯示),這點是我自己理解的,可能還不是太清楚,有錯誤還望及時指正!

然後需要判斷一個上限一個下限值,及時復位即可,比如秒是 0~59 ,則要在加的時候判斷是否大於59,大於的話要清零,在減的時候判斷是否等於0,如果已經等於0,再減就要復位為59!

接下來一定要加 DS1302Init() 初始化,這樣才能把修改的值送進去!

10. 主函式,這個檔案是測試檔案,因此把切換顯示註釋掉了,想做的話可以參考註釋部分,這個比較簡單,花樣不是很多,主要是我現在還不是太會,等慢慢學習吧!

附錄一下

1. 點陣陽極沒有加驅動電路,導致亮度不是很夠,可以改進!

2. 感覺最重要的一點就是,程式不夠簡潔,太複雜了,這個跟我自身能力也有關係,我會努力提升的!

3. 整個板子都是自己跳線焊接出來的,因此干擾比較大,也比較麻煩,當然這個也僅僅是用來測試一下,還有部分原因是因為,自己小點陣買多了,想趕緊用掉~~~哈哈

4. 有錯誤的地方還望多多指正,然後不懂得可以評論,大家共同學習!