何小映
(西安航空學院 電子工程學院,陜西西安,710077)
2019 年底,爆發了新冠疫情,受此影響,疫情地區的學校授課轉為線上[1],與線下授課不同,線上授課學生和教師大部分分散在不同地點,不像在學校,大家集中在一起上課,有計時系統計時,到時自動打鈴[2]。網課期間,師生只能自己記下學校作息時間,自己通過看手機等計時工具,自己提醒自己造成一定的困擾。針對這一問題,設計了作息時間顯示系統。
該系統包括時鐘模塊、矩陣式鍵盤、單片機、液晶顯示器,系統的整體結構如圖1所示。

圖1 系統整體結構圖
時間由時鐘模塊提供,矩陣式鍵盤用來輸入時間和日期、星期的初始值,作息時間將會在液晶顯示器LCD12864B 上相應的位置進行顯示。
時鐘模塊主要由DS1302、晶振組成、紐扣電池,DS1302 是美國DALLAS 公司的產品,具有涓細電流充電能力,采用串行方式傳輸數據。晶振頻率為32.768kHz,是一種高性能、低功耗、帶RAM的實時時鐘[3]。具有年、月、日、星期、時、分、秒寄存器,具有閏年補償功能,工作電壓為2.0V ~5.5V[4]。采用三線接口與單片機進行通信,單片機可以給它不同的寄存器寫入數據,也可以從它不同的寄存器讀取數據,其接口如圖2所示。

圖2 DS1302 接口
其中,VCC1 為后備電源,等于系統電源5V,VCC2 為主電源,等于3.6V,當系統上電時,因為Vcc1>Vcc2,由Vcc1 供電,當系統斷電時,由VCC2 供電[5],DS1302 繼續計時。/RST 是復位/片選線,SCLK 為時鐘輸入端,I/O 為雙向串行數據輸入輸出端。
DS1302的矯正日期、星期、時間值的輸入采用矩陣式鍵盤實現[6],由4×4 鍵盤構成[7],電路如圖3所示。

圖3 矩陣式鍵盤
行線連接到P2.0~P2.3,列線連接到P2.4~P2.7,一共有0~9 共10個數字鍵,另有四個功能鍵,分別表示左移、右移、確認、退出,括號中為該鍵的鍵值(16 進制)。按鍵的分析采用行列反轉法,P2口先輸出0xF0,再讀取P2口的值,讀取的值保留高四位,然后P2口輸出0X0F,再次讀取P2口的值并保留低四位,所得結果與前次保留的結果進行或運算,就能得出每個鍵分別按下時的鍵值,再根據鍵值就可以判斷該鍵的類型,如果是數字鍵,則此值即為要設置的時間參數的高位或低位(由程序進行判斷)。如果是功能鍵,就執行相應的功能。
顯示器采用LCD12864B, 該顯示器的控制器為ST7920,可以顯示常用漢字,數字,英文字符及圖形,與單片機的接口電路如圖4所示[8]。

圖4 LCD12864B 與單片機接口
圖中GND為電源負極,接地。VCC 為電源正極,接+5V,VO 為對比度調節端,接電位器。RS=1 時,表示傳輸的是數據,RS=0 時,表示傳輸的是控制指令。R/W=1時,單片機從LCD12864 讀出數據,R/W=0 時,單片機寫入數據到LCD12864B,E 為使能端,D0~D7 為8位數據,PSB=1 時,采用并行模式,PSB=0 時,采用串行模式,/RESET 為復位端,低電平有效。Vout 為模塊驅動電壓輸出端,A 為背光電源正極,接+5V,K 為背光電源負極,接地。
當顯示的日期時間與當前日期時間不一致時,需要進行矯正,矯正請求方式采用單片機外部中斷0,接口電路如圖5所示。

圖5 時間日期矯正請求
在主程序中,設置EA=1,允許總中斷。EX0=1,允許外部中斷0 中斷,當需要矯正日期時間時,按圖5 中的按鍵,程序進入外部中斷0 中斷函數,進行初始值設置。
硬件整體電路圖如圖6所示。

圖6
軟件包括主函數和中斷處理函數及其他函數。采用C51語言編寫。
主函數程序流程圖如圖7所示。

圖7 主函數程序流程圖
圖中xjc 表示節次,因為每節課的時間區間是固定的,比如第一節課是08:30-09:15,如果當前時間是08:40, 則xjc=1。 如 果xjc!=0,表示當前為上課時間,則顯示該節課所處的節次、起始時間、進度條、截止時間。
上課期間,使用進度條可以顯示當前上課時間進度,此時需要將顯示模式切換為擴展模式,用來顯示圖形,進度條顯示在第四行中間位置,占6個字節位置,一行48個點,共16 行,當給某點送“1”時點亮該點,送“0”時該點熄滅,通過點亮、熄滅某些點就能顯示進度條。一節課45 分鐘,一行多出3個點,所以第一分鐘每行點亮最左邊3個點,后面每1 分鐘每行就向右多點亮一個點,進度條顯示程序流程如圖8所示。

圖8 進度條顯示流程圖
圖8中,thl 為每行需點亮的點數,計算方法是:當前時間的小時和分鐘折合成分鐘減去該節課的起始時間的小時和分鐘折合成的分鐘數再加3,例如第一節課時間是08:30-09:15,如果當前時間是09:10,則thl的值如公式(1)所示。
qcthl 為上次每行需點亮的點數,初始值為0,則thl>qcthl 成立,執行qcthl=thl 來控制進度條更新的頻率,因為thl 每分鐘更新一次,在一分鐘之內qcthl=thl 始終成立,所以為進度條每分鐘更新一次,另外,qcthl的值需要在休息時間程序段中再次清0,否則一節課結束,qcthl為最大值,后面上課時間的進度條不會顯示。jsjdt(thl)函數計算進度條數組jdt[ ]的值,jdt[ ]數組共7個數,此處jdt[0]=0,jdt[1]=jdt[2]=jdt[3]=jdt[4]=jdt[5]=0xFF;jdt[6]=0xE0,共43個“1”,對應一行共43個點點亮,第一個值jdt[0]=0是因為進度條在08:30 后面顯示,而顯示圖形時,1個列號包含兩個字節,08:30 是5個字節,進度條從第二個列號開始顯示,故第一字節被起始時間08:30的最后一個數字“0”占據,所以該字節所在的八個點為0,否則起始時間分值的個位會被占據無法正常顯示。dis(48,2,7,16,jdt)表示將jdt[]數組中的點陣數據從第48 行,第2 列號開始顯示出來,共16 行,7個字節數據,實際每行顯示點陣的為6個字節,如前所述。
如果xjc=0,則當前為休息時間,先使qcthl=0(如前述),然后清屏第三四行內容,再在第四行顯示“休息到XX:XX”,因為休息時間至少十分鐘,所以由變量控制僅在休息時間的第一分鐘清屏三、四行。
矩陣式鍵盤用來設置初始值,當日期、星期、時間不正確時需要進行矯正,此時按圖5 中的按鍵,程序進入外部中斷0 服務程序,該程序的流程圖如圖9所示。

圖9 中斷0 服務程序流程圖
圖9流程圖中,sethang 確定要設置的兩位數字的行地址,setlie 確定要設置的兩位數字的列地址,12864B 一共有四行,第一行到第四行的地址分別為:0x80,0x90,0x88,0x98。本系統中要設置的參數位于第一二行,其中年、月、日、星期在第一行設置,sethang=0x80,對應的setlie 分別為:0x00,0x02,0x04,0x06,時、分、秒在第二行顯示,sethang=0x90,對應的setlie=0x02,0x04,0x06,gbwz 變量表示七個要設置的變量,其值為0~6,分別對應年、月、日、星期、時、分、秒。szjax 變量是數字鍵按下標志位,當數字鍵按下時其值為1,certn 是確認鍵按下標志,只有先按下數字鍵,再按確認鍵時,certn的值才變化。由流程圖可知,如果第一次就按功能鍵,不會影響閃動位置處的值。
圖10為第一節課前、課中、課后的時間信息顯示。
從圖10可以看出,該系統能夠顯示日期,星期,時間,當當前時間為上課時間,則顯示當前節次及該節課起始時間、進度條、截止時間,如果當前為休息時間,則顯示休息到下節課上課時間,滿足了網課期間作息時間的提示要求。

圖10 作息時間顯示實例