這是我做的使用LCD1602顯示的電子時鐘的設計,從編程到制作實物花了不少的時間。程序使用純匯編語言編寫,在proteus中仿真驗證,并完成了實物的制作,調試完全通過,功能包括時間、日期,鬧鈴,整點提示等功能,使用LCD1602顯示清晰。
題 目: 基于52單片機電子時鐘的設計
學 院: 物理與機電工程學院
專 業: 電子信息科學與技術
作者姓名:
指導教師: *** 職稱: 講師
基于52單片機電子時鐘的設計
摘要
本次設計的多功能時鐘系統采用STC89C52單片機為核心器件,利用其定時器/計數器定時和記數的原理,結合液晶顯示電路、時鐘芯片DS1302電路、電源電路以及按鍵電路來設計計時器。將軟硬件有機地結合起來,使得系統能夠實現液晶顯示,顯示有年、月、日、時、分、秒以及星期,還可以設置鬧鐘和整點報時。其中軟件系統采用單片機匯編語言編寫程序,包括顯示程序、鬧鐘程序、中斷、延時程序,按鍵消抖程序等,并在keil中調試運行,硬件系統利用PROTEUS強大的功能來實現,簡單且易于觀察,在仿真中就可以觀察到實際的工作狀態。
1 設計任務及要求分析 1.1 設計任務:基于單片機的電子時鐘設計 1.2 要求: 1.2.1 用LCD液晶作為顯示設備 1.2.2 可以分別設定小時、分鐘和秒,復位后時間為 00 00 00 1.2.3 能實現日期的設置年、月、日 1.3 擴展要求:如鬧鐘功能、顯示星期、整點音樂報時等 2 系統方案 2.1 系統整體方案的論證 電路原理設計是基于小系統板包括電源電路、復位電路、按鍵電路、DS1302時鐘電路、液晶顯示驅動電路、輸出控制電路。電源部分是用電池來提供的3v-5v,晶體振蕩器采用的是12MHz的石英晶體振蕩器。 整個系統用單片機為中央控制器,由單片機執行采集時鐘芯片的時間信號并通過顯示模塊來輸出信號及相關的控制功能。時鐘芯片產生時鐘信號,利用單片機的I/O口傳給單片機;并通過I/O口實現LCD的顯示。系統設有4個獨立式按鍵可以對時間年、月、日和星期進行調整,還可以設置鬧鐘。具體如圖2.1所示: 圖2.1 系統整體框圖
3 硬件設計與實現 3.1單片機最小系統 STC89C52是一款非常適合單片機初學者學習的單片機,它完全兼容傳統的8051,8031的指令系統,他的運行速度要比8051快最高支持達33MHz的晶體震蕩器,在此系統中使用12MHz的晶振。 AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統可編程Flash存儲器。使用Atmel公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。STC89C52具有以下標準功能:8k字節Flash,256字節RAM,32 位I/O 口線,看門狗定時器,2 個數據指針,三個16位定時器/計數器。一個6向量2級中斷結構,全雙工串行口及時鐘電路。另外,STC89C52 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。 3.2振蕩電路的工作原理 STC89C52單片機內部有一個高增益反相放大器,用于構成振蕩器,但要形成時鐘,外部還需附加電路。XTAL1引腳為反相放大器和時鐘發生電路的輸入端,XTAL2引腳為反相放大器的輸出端。振蕩電路如圖3.1所示: 
圖3.1 振蕩電路圖 3.2時鐘電路的工作原理 片內時鐘發生器實質是個2分頻的觸發其輸入來自振蕩器的fosc,輸出為2相時鐘信號,即節拍信號P1、P2,器頻率為fosc\2。2個節拍為1個狀態時鐘S。狀態時鐘再3分頻后為ALE信號,其頻率為fosc\6,狀態時鐘6分頻后為機器周期信號,器頻率為fosc\12。特殊功能寄存器PCON的PD位可以控制振蕩器的工作,當PD=0時,振蕩器停止工作,單片機進入低功耗工作狀態,復位后,PD=0,振蕩器正常工作。時鐘電路如圖3.2所示: 
圖3.2時鐘電路圖 3.3單片機最小系統電路圖 
圖3.3單片機最小系統電路圖 3.4 時鐘芯片 (1)DS1302是一種可編程的實時時鐘芯片,具有計算2100年前的時間的能力,包括時鐘/日歷寄存器和31字節(8位)的數據暫存寄存器,數據通信權通過一條串行輸出口。時鐘/日歷提供包括秒、分、時、日期、月份和年份信息。閏年可自行調整,以串行方式向單片機傳送單字節或多字節的秒、分、時、日、月、年等實時時間數據;只通過三根線進行數據的控制和傳遞:RST、I/O、SCLK;其在電路的功能是還具有在出現主電源斷電時備用電源可繼續保持時鐘的連續運行。時鐘引腳圖如圖3.4所示: 
圖3.4時鐘引腳圖
(2)DS1302芯片內部寄存器讀寫地址及位定義格式如表3-1:
表3-1 DS1302芯片內部寄存器讀寫地址及位定義 如果單片機要對DS1302內部寄存器進行讀寫操作,必須先將與寄存器對應的位操作地址傳送給DS1302,然后再進行讀寫數據的操作。控制寄存器是用來決定能否對DS1302進行讀寫操作,當控制字的最高位WP=0時,允許進行讀寫操作;當WP=1時,禁止讀寫操作。所以單片機對DS1302進行讀寫操作時,必須先將控制字00H寫入到DS1302的控制寄存器中。 3.5 液晶顯示電路 LCD顯示器能顯示數碼管不能顯示的其他字符、文字和圖形,是十分重要的顯示終端,LCD1602是字符點陣液晶顯示模塊。利用LCD1602,所用的時間年、月、日、星期可同時可見,一目了然,采用雙行顯示,讓電子鐘能夠更直觀的顯示。其實圖如圖3.5、顯示電路圖如圖3.6、引腳功能如表3-2所示: 
圖3.5 液晶顯示器實圖 
圖3.6 液晶顯示電路圖
| | | | | | | | | | | | | | 數據和指令選擇控制端,RS=0:命令/狀態RS=1:數據 | | | 讀寫控制線,R/W=0:寫操作,R/W=1:讀操作 | | | 數據讀寫操作控制位,E線向LCD模塊發送一個脈沖,LCD模塊與單片機之間將進行一次數據轉換 | | | 數據線,可以用8位連接,也可以用高四位連接,節約資源 | | | | | | |
表3-2 LCD液晶顯示器引腳功能 3.6 輸出控制電路 在P2.0端口接一個蜂鳴器,用于整點報時和響鬧鈴。具體如圖3.7所示: 
圖3.7輸出控制電路圖 3.7按鍵電路 本次設計采用按鍵電平復位,按鍵電平復位相當于按復位鍵后,復位端通過電阻與Vcc電源接通,按鍵電路圖如圖3.8所示: 
圖3.8按鍵電路圖
4 軟件設計與實現 4.1軟件總體設計方案 4.1.1 軟件設計目標 軟件部分總體上是模塊化的設計思想,通過子程序調用設計方式 ,將所有的模塊綜合到一起,使程序可讀性較高。 4.1.2 總體架構說明 該時鐘程序設計思路如下: (1)在程序頭將設計中的一些固定空間進行分配并注釋。 (2)初始化程序,如設定時鐘初始顯示“2016年6月30日,星期四,00:00”以便一開始就能進入整點報時狀態,顯示該功能;設定使用定時器1;將一些未到時鐘設計功能的功能端口關閉等。 (3)開始主程序進行程序掃描,先掃描拆字子程序,將分配好的時分秒等高地位的數字調入到顯示子程序中。→顯示子程序通過分配的空間對應口將拆字子程序的內容在液晶顯示器上顯示相應的時分秒,再調用走時程序使時鐘進行讀秒等工作。→進入按鍵掃描,判斷按鍵是否有變動,若有就根據設計程序對相應的按鍵按入次數而進行實現相應的功能。如進入時間調整、鬧鐘設置、鬧鐘開啟與否等。→進入鬧鐘的判斷,在時分上與設置的鬧鈴時間吻合的話就做相對應的判斷,再依據是否有開啟鬧鐘而進行響鈴與否,如果有響鈴則設置其一直響鈴知道有人為按取消按鍵取消鬧鈴。→進入整點報時掃描,判斷是否在時分上都進入了整點,如果是就報時,然后就退出整點報時,等到下一個整點的到來。→最后返回主程序頭重新依次掃描。顯示過程設有消隱,按鍵設有去抖。 (4)子程序部分。在主程序的調用下依據不同的子程序工能而編寫子程序,有多級嵌套。這些子程序包括拆字子程序、延時子程序、走時間子程序、整點報時子程序、按鍵處理子程序、調時間子程序、鬧鐘設置子程序、鬧鐘子程序、鬧鐘開啟子程序。主流程圖如圖4.1所示:
子程序詳解表如表4-1所示: | | | | | | | | | | | | | | | | | | | | | | | | | | KeyCode、sec、min、hour、day、month、IsSheZhi | | | | | | | | | | | | | | 讀出秒,分,時,日,月,星期,年讀出秒,分,時,日,月,星期,年 | | | | | | | | | | | | | | | |
| | |
| | | | | | | | | | | |
| | | | | | | | | | | | | | | | | |
| | |
| | |
| | |
| | |
|
表4-1 子程序詳解表 4.2按鍵模塊設計 設計系統中的按鍵模塊僅占用四個I/O口,從89s52芯片p1.0、p1.1、p1.2、p1.3四個引腳接入進行控制。當沒有按鍵按下時,均為高電平,有按鍵按下時相應I/O口為低電平,但并沒有立即執行相應的程序,延時5ms后若再為低電平,等I/O口恢復高電平,即按鍵松開時,才執行相應的程序,此時按鍵才起作用。這樣該按鍵模塊具有去抖動,且按鍵按下一次僅作用一次,起到精確判斷的作用。 4.2.1 按鍵1的說明 按鍵1有四種功能,分別為下面4個子程序: (1)子程序0的功能為:進入設置當前時間狀態,且令keycode=2; (2)子程序1的功能為:進入設置鬧鐘時間狀態,且令keycode=3; (3)子程序2的功能為:把所設置的時間作為當前時間,且令keycode=0; (4)子程序3的功能為:把所設置的時間作為鬧鐘時間,且令keycode=0; 每次按下按鍵1,按鍵1程序根據的KeyCode內容轉入各對應的子程序中(因為當KeyCode值不同時,經過計算得到dptr的值不同,然后經過jmp @a+dptr指令就可跳轉到不同的子程序中,具體程序說明),從而實現不同的功能。 從各按鍵的功能可知,每次按下按鍵1,都會改變KeyCode內容,使按鍵1的功能發生改變。 4.2.2 按鍵2的說明 按鍵2有兩種不同的功能:對應于設置狀態為加1;對應于非設置狀態為切換屏幕。所以按鍵2程序開頭就先判斷鬧鐘是否處于設置狀態。 當鬧鐘處于非設置狀態時,keycode等于0或1;處于設置狀態時,keycode等于2或3;所以可用如下語段判斷鬧鐘是否處于設置狀態: 當鬧鐘處于設置狀態,keycode值大于2,c等于0 當鬧鐘處于非設置狀態,keycode值小于2,c等于1 4.2.3 其他按鍵的說明 剩下3、4按鍵都于按鍵2類似,先判斷是否處于設置狀態,然后轉入不同的語句,不再說明。 4.2.4 報時功能的說明: 當報時功能開啟,即bs=0時,LCD上會出現相應的標示符號 ,此時主程序將掃描zhengshi子程序。 zhengshi子程序能判斷當前時間是否為整點,若為整點將使cxbs=0,且把hour由BCD碼化為二進制存儲在字節shengshu(為報時聲數,將在baoshi子程序中使用)中,之后主程序將掃描baoshi子程序,即開始報時。 chuzhi=0, 由baoshi子程序可知,鬧鐘從0秒開始報時,當報時完畢將自動令cxbs=1。 4.2.5 鬧鐘功能的說明: 當鬧鐘功能開啟,即bj=0時,LCD上會出現相應的標示符號 此時,主程序將掃描zhengshi子程序。zhengshi子程序對當前時間和鬧鐘時間進行比較,當它們的分、時全相等時開啟中斷sub1,否則關閉中斷sub1。這樣就可實現鬧鐘鬧鈴一分鐘后自動停止鳴叫的要求。 4.2.6 加1、移位功能的說明: 將年份前兩位與年(year)、月(month)、星期(week)、日(day)、時(hour)、分(min)、秒(sec)拆字后分別存儲在DspBuf-2、DspBuf-1、DspBuf+0、DspBuf+1、DspBuf+2、DspBuf+3等13個字節中。而把它們的每一為在LCD上的顯示位置地址放在如下表中: tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h; 當前時間各編輯位在LCD上的位置表。然后執行mov r1,#DspBuf+12; inc @r1就可實現對秒個位加1。執行:dec r1和子程序www就可實現移位功能. 4.3 時鐘模塊設計 單片機要先從DS1302芯片中讀取時鐘數據,然后通過LCD顯示出來。在讀取DS1302的時間和日期之前,先要對DS1302進行賦初始時間并開啟時鐘。時鐘被啟動后若未接收到新的賦時間指令,其內部的時鐘將一直不停的運行,以保證時間的實時性和準確性;期間單片機可隨時讀取DS1302內部時間和日期寄存器中的數值。 4.4 液晶顯示模塊設計 本設計液晶時鐘顯示系統設計上由液晶顯示器顯示、時鐘芯片DS1302提供時間,可為使用者提供完整的時間信息。由于LED數碼管只能顯示數字而無法顯示其他中英文字符,并對成本及功能考慮,因此從設計的成本及功能的角度考慮,采用LCD一1602顯示模塊,它可以顯示年、月、日、星期等中文字目。LCD一1602驅動電路簡單,可以由單片機直接輸出命令驅動。 5 實物調試及測試 5.1 實物圖 
圖5.1 實物圖 5.2 實物調試 
圖5.2 K1鍵功能圖 - 按下2鍵有加1和顯示調節鬧鐘界面的功能
- 按下K3鍵進入光標移動功能,選擇調節年、月、日和時間等
- 按下K4顯示出整點報時圖標


圖5.3 K4鍵功能圖
5.3 測試結果及分析 表5-1 測試結果分析表 5.4仿真結果圖如下所示 
圖5.4 K4仿真結果圖 6 不足與展望 6.1 設計不足之處 - 沒有停止鬧鐘的硬件功能
- 沒有實現按鍵減1,只能加1調節時鐘
- 沒有實現音樂整點報時
- 沒有安裝三極管,蜂鳴器聲音很小
6.2 設計的展望 (2)實現陰歷和陽歷的轉化 7設計心得 本文的電子鐘系統是以單片機(STC89C52)為核心,時鐘芯片DS1302、LED1602顯示等部分組成。具體應用Keil2軟件調試程序以及Proteus軟件進行基于單片機的電子鐘設計與仿真。實現了硬件軟化的目的。 經過一段時間的課程設計,我們發現對于書上很多知識還不能靈活運用,有很多知識還要我們去學習。此次電子時鐘的設計給我們奠定了一個實踐的基礎,很是受益匪淺。讓我們認識到學習不但要立足于書本,而且要注重實踐,要以解決理論和實際教學中的實際問題為目的。通過自己的手來解決問題比用腦子解決問題更加深刻。學習就應該采取理論與實踐結合的方式,這種做法既有助于完成理論知識的鞏固,而且可以加強我們的動手和解決實際問題的能力。
單片機源程序如下:
- ;初始化
- P_Lcd equ P0 ;液晶lcd數據總線
- pq equ p1 ;按鍵接口
- pf bit p2.0 ;蜂鳴器接口
- led bit p2.1 ;led燈指示接口
- lcdrs bit p2.5 ;lcdrs=1選擇數據寄存器,lcdrs=0選擇指令寄存器
- lcdrw bit p2.6 ;lcdrw=1進行讀操作,lcdrw=0進行寫操作
- lcde bit p2.7 ;lcdep由1-->0 時,液晶模塊執行命令
- sclk bit p3.5 ;時鐘芯片時鐘線引腳
- io bit p3.6 ;時鐘芯片數據傳輸線引腳
- rst bit p3.7 ;時鐘芯片復位線引腳
- IsSheZhi bit 30h ;設置狀態標示位
- BJ bit 31h ;比較標示位
- QH bit 32h ;切換標示位
- bs bit 33h ;報時功能標示位
- cxbs bit 34h ;執行報時標志位
- sec equ 50h
- min equ 51h
- hour equ 52h
- day equ 53h
- week equ 54h
- month equ 55h
- year equ 56h
- KeyCode equ 57h ;按鍵1功能子程序序號存儲地址
- jiepai equ 58h ;存放報時聲音的節拍常數
- chuzhi equ 59h ;報時開始秒時間常數
- shengshu equ 5ah ;存放報時聲數
- DspBuf equ 60h ;當前時間拆字后存儲首地址
- dspba equ 70h ;鬧鐘時間首地址
- org 0h
- ljmp main
- org 00bh
- ljmp sub1
- org 01bh
- ljmp sub2
- org 30h
- ;主程序
- main:
- clr IsSheZhi
- clr QH
- setb BJ
- setb bs
- setb cxbs
- mov KeyCode,#00h
- mov sp ,#30h
- mov year,#16h ;為當前時間賦初值
- mov month,#06h
- mov week,#4h
- mov day,#30h
- mov hour,#00h
- mov min,#00h
- mov sec,#00h
- mov DspBuf-1,#0h
- mov DspBuf-2,#02h
- mov jiepai,#80h ;設置節拍常數
- mov chuzhi,#00h ;設置1秒時開始報時
- mov dspba+0,#00h ;為鬧鐘時間賦初值
- mov dspba+1,#09h
- mov dspba+2,#0h
- mov dspba+3,#0h
- mov TH0,#0ffh
- mov TL0,#0ffh
- mov TH1,#0ffh
- mov TL1,#0ffh
- mov IE,#8aH
- mov TMOD,#11h
- setb pf
- acall lcd_init ;調LCM的初始化程序
- lcall word ;把自創字符寫入CGRAM的子程序
- lcall set1302 ;DS1302初始化
- mainloop:
- jb IsSheZhi, SheZhi ;判斷是否處于設置狀態,處于設置狀態則跳轉
- lcall get1302 ;調讀時間子程序
- lcall chaizi
- lcall display ;調顯示子程序,顯示當前時間與溫度
- SheZhi:
- jb BJ,xq ;判斷鬧鐘功能是否開啟,未開啟則跳轉
- lcall bijiao ;調比較子程序,比較當前時間與鬧鐘時間
- xq:
- lcall anjian ;按鍵掃描
- jb bs,bs_1
- lcall zhengshi ;判斷當前時間是否是整時,即能否報時
- bs_1:
- jb cxbs,cx_1
- lcall baoshi ;執行報時功能
- cx_1:
- sjmp mainloop
- ;液晶顯示初始化設定
- lcd_init:
- mov a,#01h ;清除LCD的顯示內容(清屏)
- acall LcdWrCmd
- mov a,#10 ;10ms延時
- acall delay
- mov a,#38h ;顯示模式設置(使用8位數據,顯示兩行,使用5*7的字型)
- acall LcdWrCmd
- mov a,#10
- acall delay
- mov a,#0ch ;顯示開及光標設置(顯示器開,光標關,字符不閃爍)
- acall LcdWrCmd
- mov a,#10
- acall delay
- mov a,#06h ;顯示光標移動設置(字符不動,光標自動右移)
- acall LcdWrCmd
- mov a,#10
- acall delay
- ret
- ;LCM命令嵌入
- LcdWrCmd:
- clr LCDRW
- clr LCDRS
- mov P_Lcd, A
- mov a,#6
- acall delay
- setb LcdE
- clr LcdE
- ret
- ;LCM數據輸入
- LcdWrDat:
- setb LCDRS
- clr LCDRW
- mov P_Lcd, A
- mov a,#6
- acall delay
- setb LcdE
- clr LcdE
- ret
- ;延時子程序
- delay:
- mov r7,a ;設置a為自定義變量,可省去其他延時程序的編寫
- d2: mov r6,#250 ;設置1ms延時
- d1:
- nop
- nop
- djnz r6,d1
- djnz r7,d2
- ret
- ;ds1302初始化程序set1302
- set1302:
- mov a,#8eh ;寫ds1302控制寄存器地址
- mov b,#00h ;允許寫操作,將WP位設置為低電平
- lcall clockwr
- mov a,#8ch ;寫年初值
- mov b,year
- lcall clockwr
- mov a,#88h ;寫月初值
- mov b,month
- lcall clockwr
- mov a,#8ah ;寫星期初值
- mov b,week
- lcall clockwr
- mov a,#86h ;寫日期初值
- mov b,day
- lcall clockwr
- mov a,#84h ;寫時初值
- mov b,hour
- lcall clockwr
- mov a,#82h ;寫分初值
- mov b,min
- lcall clockwr
- mov a,#80h ;寫秒初值
- mov b,sec
- lcall clockwr
- ret
- ;讀時間子程序get1302
- get1302:mov a,#81h ;讀秒
- lcall clockrd
- mov sec,a
- mov a,#83h ;讀分
- lcall clockrd
- mov min,a
- mov a,#85h ;讀時
- lcall clockrd
- mov hour,a
- mov a,#87h ;讀日
- lcall clockrd
- mov day,a
- mov a,#8bh ;讀星期
- lcall clockrd
- mov week,a
- mov a,#89h ;讀月
- lcall clockrd
- mov month,a
- mov a,#8dh ;讀年
- lcall clockrd
- mov year,a
- ret
- ;ds1302讀子程序
- clockrd:clr rst ;rst先設置低電平,再設置高電平,起到去亂碼作用
- clr sclk ;sclk置為低電平
- setb rst ;rst置為高電平,選通DS1302
- mov r7,#8 ;串行移位傳送次數
- rds1:
- rrc a
- mov io,c ;輸出一位寄存器讀地址
- setb sclk ;發串行脈沖
- nop
- nop
- clr sclk ;sclk置為低電平
- djnz r7,rds1
- nop ;延時,防后面串行讀數據丟失
- nop
- setb io ;8位地址輸出完畢,IO設置為輸入端口
- mov r7,#8
- rds2:
- mov c,io ;讀入一位數據
- rrc a
- setb sclk ;發串行脈沖
- nop
- nop
- clr sclk
- djnz r7,rds2
- clr rst
- setb sclk
- ret
- ;ds1302寫數據子程序
- clockwr:
- push acc ;設置堆棧,入棧
- push b
- clr rst
- clr sclk
- setb rst ;選通DS1302
- mov r7,#8
- wrs1:
- rrc a
- mov io,c ;輸出一位寄存器寫地址
- clr sclk ;發串行輸出脈沖
- setb sclk
- djnz r7,wrs1
- nop
- mov a,b ;將待寫入數據送A
- mov r7,#8
- wrs2:
- rrc a
- mov io,c ;經IO輸出一位數據
- clr sclk
- setb sclk
- djnz r7,wrs2
- pop b ;出棧
- pop acc
- ret
- ;顯示設置—— 分配時間顯示空間
- chaizi:
- mov a,year ;拆年
- mov r0,#60h
- acall hex2bcd
- mov a,month ;拆月
- mov r0,#62h
- acall hex2bcd
- mov a,day ;拆日期
- mov r0,#64h
- lcall hex2bcd
- mov a,week;
- mov 66h,a
- mov a,hour ;拆時
- mov r0,#67h
- lcall hex2bcd
- mov a,min
- mov r0,#69h ;拆分
- lcall hex2bcd
- mov a,sec
- mov r0,#6bh ;拆秒
- acall hex2bcd
- ret
- ;顯示設置—— 采用除法指令實現的拆字子程序
- hex2bcd:
- mov b,a
- anl a,#0f0h
- swap a
- mov @r0,a
- mov a,b
- anl a,#0fh
- inc r0
- mov @r0,a
- ret
- ;顯示設置——連續顯示相鄰的兩字節
- LcdDspBuf:
- mov A, @R0
- orl a,#30h
- acall LcdWrDat
- inc R0
- djnz R2, LcdDspBuf
- ret
- ;顯示設置——自創字符寫入CGRAM的子程序
- word:
- mov a,#40h
- lcall LcdWrCmd
- mov r5,#40
- mov dptr,#tab1
- mov r4,#0
- nextt:
- mov a,r4
- movc a,@a+dptr
- lcall LcdWrDat
- inc r4
- djnz r5,nextt
- ret
- tab1:
- db 08h,0fh,12h,0fh,0ah,1fh,02h,00h;年
- db 0fh,09h,0fh,09h,0fh,09h,13h,00h;月
- db 0fh,09h,09h,0fh,09h,09h,0fh,00h;日
- db 06h,0fh,1fh,0fh,07h,1bh,19h,00h;顯示鬧鐘功能開啟標示符號
- db 15h,15h,04h,11h,1bh,1fh,0eh,00h;顯示報時功能開啟標示符號
- ;進入鬧鐘功能設置顯示
- display_nz:
- mov a,#0c2h
- acall LcdWrCmd ;確定鬧鐘時間的首地址
- mov R0, #dspba+0
- mov R2, #2
- acall LcdDspBuf ;顯示時
- mov a,#3ah ;顯示分隔符號
- acall LcdWrDat
- mov R0, #dspba+2
- mov R2, #2
- acall LcdDspBuf ;顯示時
- jb BJ,XT ;判斷鬧鐘功能是否開啟
- mov a,#0c0h
- acall LcdWrCmd
- mov a,#03h ;顯示鬧鐘功能開啟標示符號
- acall LcdWrDat
- XT: ret
- ;正常顯示設置
- display:
- mov a,#80h
- acall LcdWrCmd ;指明顯示的首地址
- mov R0, #DspBuf-2
- mov R2, #2
- acall LcdDspBuf ;顯示年份前兩位
- mov R0, #DspBuf+0
- mov R2, #2
- acall LcdDspBuf ;顯示年后兩位
- mov a,#00h ;顯示漢字年
- acall LcdWrDat
- mov R0, #DspBuf+2
- mov R2, #2
- acall LcdDspBuf ;顯示月份
- mov a,#01h ;顯示漢月字年
- acall LcdWrDat
- mov R0, #DspBuf+4
- mov R2, #2
- acall LcdDspBuf ;顯示日期
- mov a,#02h ;顯示漢日字年
- acall LcdWrDat
- mov a,#8ch ;w指明星期的首地址
- acall LcdWrCmd
- mov a,#57h
- acall LcdWrDat ;顯示w
- mov a,#3ah ;顯示分隔符號
- acall LcdWrDat
- mov a,66h ;顯示星期值
- orl a,#30h
- acall LcdWrDat
- jb bs,XtT ;判斷報時功能是否開啟
- mov a,#04h ;顯示報時功能開啟標示符號
- acall LcdWrDat
- XtT:
- mov a,#0c2h
- acall LcdWrCmd ;確定地址
- mov R0, #DspBuf+7
- mov R2, #2
- acall LcdDspBuf ;顯示時
- mov a,#3ah ;顯示分隔符號
- acall LcdWrDat
- mov R0, #DspBuf+9
- mov R2, #2
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (49.79 KB, 下載次數: 153)
下載附件
2018-5-15 03:09 上傳
所有資料51hei提供下載:
電子時鐘資料.rar
(555.89 KB, 下載次數: 550)
2018-5-14 15:20 上傳
點擊文件名下載附件
包含原理圖,論文,程序等 下載積分: 黑幣 -5
|