何小映
(西安航空學(xué)院 電子工程學(xué)院,陜西西安,710077)
2019 年底,爆發(fā)了新冠疫情,受此影響,疫情地區(qū)的學(xué)校授課轉(zhuǎn)為線上[1],與線下授課不同,線上授課學(xué)生和教師大部分分散在不同地點,不像在學(xué)校,大家集中在一起上課,有計時系統(tǒng)計時,到時自動打鈴[2]。網(wǎng)課期間,師生只能自己記下學(xué)校作息時間,自己通過看手機等計時工具,自己提醒自己造成一定的困擾。針對這一問題,設(shè)計了作息時間顯示系統(tǒng)。
該系統(tǒng)包括時鐘模塊、矩陣式鍵盤、單片機、液晶顯示器,系統(tǒng)的整體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)整體結(jié)構(gòu)圖
時間由時鐘模塊提供,矩陣式鍵盤用來輸入時間和日期、星期的初始值,作息時間將會在液晶顯示器LCD12864B 上相應(yīng)的位置進行顯示。
時鐘模塊主要由DS1302、晶振組成、紐扣電池,DS1302 是美國DALLAS 公司的產(chǎn)品,具有涓細(xì)電流充電能力,采用串行方式傳輸數(shù)據(jù)。晶振頻率為32.768kHz,是一種高性能、低功耗、帶RAM的實時時鐘[3]。具有年、月、日、星期、時、分、秒寄存器,具有閏年補償功能,工作電壓為2.0V ~5.5V[4]。采用三線接口與單片機進行通信,單片機可以給它不同的寄存器寫入數(shù)據(jù),也可以從它不同的寄存器讀取數(shù)據(jù),其接口如圖2所示。
圖2 DS1302 接口
其中,VCC1 為后備電源,等于系統(tǒng)電源5V,VCC2 為主電源,等于3.6V,當(dāng)系統(tǒng)上電時,因為Vcc1>Vcc2,由Vcc1 供電,當(dāng)系統(tǒng)斷電時,由VCC2 供電[5],DS1302 繼續(xù)計時。/RST 是復(fù)位/片選線,SCLK 為時鐘輸入端,I/O 為雙向串行數(shù)據(jù)輸入輸出端。
DS1302的矯正日期、星期、時間值的輸入采用矩陣式鍵盤實現(xiàn)[6],由4×4 鍵盤構(gòu)成[7],電路如圖3所示。
圖3 矩陣式鍵盤
行線連接到P2.0~P2.3,列線連接到P2.4~P2.7,一共有0~9 共10個數(shù)字鍵,另有四個功能鍵,分別表示左移、右移、確認(rèn)、退出,括號中為該鍵的鍵值(16 進制)。按鍵的分析采用行列反轉(zhuǎn)法,P2口先輸出0xF0,再讀取P2口的值,讀取的值保留高四位,然后P2口輸出0X0F,再次讀取P2口的值并保留低四位,所得結(jié)果與前次保留的結(jié)果進行或運算,就能得出每個鍵分別按下時的鍵值,再根據(jù)鍵值就可以判斷該鍵的類型,如果是數(shù)字鍵,則此值即為要設(shè)置的時間參數(shù)的高位或低位(由程序進行判斷)。如果是功能鍵,就執(zhí)行相應(yīng)的功能。
顯示器采用LCD12864B, 該顯示器的控制器為ST7920,可以顯示常用漢字,數(shù)字,英文字符及圖形,與單片機的接口電路如圖4所示[8]。
圖4 LCD12864B 與單片機接口
圖中GND為電源負(fù)極,接地。VCC 為電源正極,接+5V,VO 為對比度調(diào)節(jié)端,接電位器。RS=1 時,表示傳輸?shù)氖菙?shù)據(jù),RS=0 時,表示傳輸?shù)氖强刂浦噶?。R/W=1時,單片機從LCD12864 讀出數(shù)據(jù),R/W=0 時,單片機寫入數(shù)據(jù)到LCD12864B,E 為使能端,D0~D7 為8位數(shù)據(jù),PSB=1 時,采用并行模式,PSB=0 時,采用串行模式,/RESET 為復(fù)位端,低電平有效。Vout 為模塊驅(qū)動電壓輸出端,A 為背光電源正極,接+5V,K 為背光電源負(fù)極,接地。
當(dāng)顯示的日期時間與當(dāng)前日期時間不一致時,需要進行矯正,矯正請求方式采用單片機外部中斷0,接口電路如圖5所示。
圖5 時間日期矯正請求
在主程序中,設(shè)置EA=1,允許總中斷。EX0=1,允許外部中斷0 中斷,當(dāng)需要矯正日期時間時,按圖5 中的按鍵,程序進入外部中斷0 中斷函數(shù),進行初始值設(shè)置。
硬件整體電路圖如圖6所示。
圖6
軟件包括主函數(shù)和中斷處理函數(shù)及其他函數(shù)。采用C51語言編寫。
主函數(shù)程序流程圖如圖7所示。
圖7 主函數(shù)程序流程圖
圖中xjc 表示節(jié)次,因為每節(jié)課的時間區(qū)間是固定的,比如第一節(jié)課是08:30-09:15,如果當(dāng)前時間是08:40, 則xjc=1。 如 果xjc!=0,表示當(dāng)前為上課時間,則顯示該節(jié)課所處的節(jié)次、起始時間、進度條、截止時間。
上課期間,使用進度條可以顯示當(dāng)前上課時間進度,此時需要將顯示模式切換為擴展模式,用來顯示圖形,進度條顯示在第四行中間位置,占6個字節(jié)位置,一行48個點,共16 行,當(dāng)給某點送“1”時點亮該點,送“0”時該點熄滅,通過點亮、熄滅某些點就能顯示進度條。一節(jié)課45 分鐘,一行多出3個點,所以第一分鐘每行點亮最左邊3個點,后面每1 分鐘每行就向右多點亮一個點,進度條顯示程序流程如圖8所示。
圖8 進度條顯示流程圖
圖8中,thl 為每行需點亮的點數(shù),計算方法是:當(dāng)前時間的小時和分鐘折合成分鐘減去該節(jié)課的起始時間的小時和分鐘折合成的分鐘數(shù)再加3,例如第一節(jié)課時間是08:30-09:15,如果當(dāng)前時間是09:10,則thl的值如公式(1)所示。
qcthl 為上次每行需點亮的點數(shù),初始值為0,則thl>qcthl 成立,執(zhí)行qcthl=thl 來控制進度條更新的頻率,因為thl 每分鐘更新一次,在一分鐘之內(nèi)qcthl=thl 始終成立,所以為進度條每分鐘更新一次,另外,qcthl的值需要在休息時間程序段中再次清0,否則一節(jié)課結(jié)束,qcthl為最大值,后面上課時間的進度條不會顯示。jsjdt(thl)函數(shù)計算進度條數(shù)組jdt[ ]的值,jdt[ ]數(shù)組共7個數(shù),此處jdt[0]=0,jdt[1]=jdt[2]=jdt[3]=jdt[4]=jdt[5]=0xFF;jdt[6]=0xE0,共43個“1”,對應(yīng)一行共43個點點亮,第一個值jdt[0]=0是因為進度條在08:30 后面顯示,而顯示圖形時,1個列號包含兩個字節(jié),08:30 是5個字節(jié),進度條從第二個列號開始顯示,故第一字節(jié)被起始時間08:30的最后一個數(shù)字“0”占據(jù),所以該字節(jié)所在的八個點為0,否則起始時間分值的個位會被占據(jù)無法正常顯示。dis(48,2,7,16,jdt)表示將jdt[]數(shù)組中的點陣數(shù)據(jù)從第48 行,第2 列號開始顯示出來,共16 行,7個字節(jié)數(shù)據(jù),實際每行顯示點陣的為6個字節(jié),如前所述。
如果xjc=0,則當(dāng)前為休息時間,先使qcthl=0(如前述),然后清屏第三四行內(nèi)容,再在第四行顯示“休息到XX:XX”,因為休息時間至少十分鐘,所以由變量控制僅在休息時間的第一分鐘清屏三、四行。
矩陣式鍵盤用來設(shè)置初始值,當(dāng)日期、星期、時間不正確時需要進行矯正,此時按圖5 中的按鍵,程序進入外部中斷0 服務(wù)程序,該程序的流程圖如圖9所示。
圖9 中斷0 服務(wù)程序流程圖
圖9流程圖中,sethang 確定要設(shè)置的兩位數(shù)字的行地址,setlie 確定要設(shè)置的兩位數(shù)字的列地址,12864B 一共有四行,第一行到第四行的地址分別為:0x80,0x90,0x88,0x98。本系統(tǒng)中要設(shè)置的參數(shù)位于第一二行,其中年、月、日、星期在第一行設(shè)置,sethang=0x80,對應(yīng)的setlie 分別為:0x00,0x02,0x04,0x06,時、分、秒在第二行顯示,sethang=0x90,對應(yīng)的setlie=0x02,0x04,0x06,gbwz 變量表示七個要設(shè)置的變量,其值為0~6,分別對應(yīng)年、月、日、星期、時、分、秒。szjax 變量是數(shù)字鍵按下標(biāo)志位,當(dāng)數(shù)字鍵按下時其值為1,certn 是確認(rèn)鍵按下標(biāo)志,只有先按下數(shù)字鍵,再按確認(rèn)鍵時,certn的值才變化。由流程圖可知,如果第一次就按功能鍵,不會影響閃動位置處的值。
圖10為第一節(jié)課前、課中、課后的時間信息顯示。
從圖10可以看出,該系統(tǒng)能夠顯示日期,星期,時間,當(dāng)當(dāng)前時間為上課時間,則顯示當(dāng)前節(jié)次及該節(jié)課起始時間、進度條、截止時間,如果當(dāng)前為休息時間,則顯示休息到下節(jié)課上課時間,滿足了網(wǎng)課期間作息時間的提示要求。
圖10 作息時間顯示實例