單片機鍵盤輸入編程
序號7:如變量n大于等于30,則m、n清零。
序號8:P3.7置0,準備讀取按鍵輸入。
序號9:P1口置全1,準備讀取按鍵輸入。
序號10:如果P1口不等于全1,說明4個按鍵中有鍵按下。
序號11:進入if(P1!=0xff)語句范圍。
序號12:如果n等于0,進入if(n==0)語句,m置1。
序號13:如果n等于1,進入if(n==1)語句,同時進行下面的具體判斷按鍵語句。作用效果為:開始時m、n均賦0,一旦有鍵按下,第一次中斷產生時m賦1;第二次中斷產生時n遞增。當n等于1時(第二次中斷產生)進入下面的具體判斷按鍵語句。若持續(xù)按下鍵,則第三次中斷產生~第三十一次中斷產生時,程序不進入具體的判斷按鍵語句過程(因這時n不等于1)。由于中斷每10mS產生一次,這樣可實現每0.31秒(31x10=0.31秒)進行一次加法或移位的操作,與人眼的視覺特性相吻合。
序號14:進入具體判斷按鍵語句范圍。
序號15:如果P1.0等于0(即電路中的set鍵按下),變量set遞增,變量left清0。說明:set、left是為了判斷模式設定及左移而在整個程序開始時定義的無符號字符型全局變量。
序號16:如果set大于等于4,則set清0。說明:set值只能在0~3間變化,只有4種工作模式(走時及輸出控制模式、走時調整模式、定時1調整模式、定時2調整模式)。
序號17:在set等于1時,向RAM區(qū)標志變量flag寫入55H。說明:flag是在整個程序開始時定義的無符號字符型全局變量,用作判斷RAM區(qū)是否受干擾的依據。
序號18:如果P1.1等于0(即電路中的left鍵按下),變量left遞增。
序號19:如果left大于等于4,則left清0。說明:left值只能在0~3間變化,LED數碼管只有4位顯示。
序號20:如果P1.2等于0(即電路中的up鍵按下),進入if(P1_2==0)語句,變量up遞增。說明:up是為了判斷數值增量而在整個程序開始時定義的無符號字符型全局變量。
序號21:隨即進入switch(left)開關語句。
序號22:switch(left)開關語句開始。
序號23:left值為0時,如果up大于等于10,則up清0。隨即退出。說明:電子鐘的個位可在0~9之間調整。
序號24:left值為1時,如果up大于等于6,則up清0。隨即退出。說明:電子鐘的十位可在0~5之間調整。
序號25:left值為2時,如果up大于等于10,則up清0。隨即退出。說明:電子鐘的百位可在0~9之間調整。
序號26:left值為3時,如果up大于等于3,則up清0。隨即退出。說明:電子鐘的千位可在0~2之間調整。
序號27:若left為其它值,也退出。
序號28:switch(left)開關語句結束。
序號29:if(P1_2==0)語句結束。
序號30:如果P1.2等于0(即電路中的up鍵按下時),進入if(P1_2==0)語句,同時進入switch(set)開關語句。
序號31:switch(set)開關語句開始。
序號32:set值為0時,退出。
序號33:set值為1時,將此時up值送入X數組的第left位。隨即退出。說明:X數組是顯示走時緩存區(qū)。
序號34:set值為2時,將此時up值送入Y數組的第left位。若此時P1.3等于0(即電路中的on/off鍵按下),則定時1啟停標志位o_f1取反(啟動/關閉)。隨即退出。說明:Y數組是定時1記憶緩存區(qū)。o_f1是為了判斷定時1啟動/關閉而在整個程序開始時定義的位標志。
序號35:set值為3時,將此時up值送入Z數組的第left位。若此時P1.3等于0(即電路中的on/off鍵按下),則定時2啟停標志位o_f2取反(啟動/關閉)。隨即退出。說明:Z數組是定時2記憶緩存區(qū)。o_f2是為了判斷定時2啟動/關閉而在整個程序開始時定義的位標志。
序號36:若set為其它值,也退出。
序號37:switch(set)開關語句結束。if(P1_2==0)語句結束。
序號38:else語句開始。
序號39:又進入switch(set)開關語句。說明:上一個switch(set)開關語句是將按鍵產生的up值送入X、Y、Z數組存放,現在這個switch(set)開關語句是調出X、Y、Z數組內容至變量up,以便在原來的基礎上遞增。例如:原來的X[0]值為5,則在調整時個位LED數碼管顯示就從5開始往上調,而不會產生從0或其它值開始上調的情況,適合人的一般直覺。
序號40:set值為0時,退出。
序號41:set值為1時,將此時X數組的第left位值送入變量up。隨即退出。
序號42:set值為2時,將此時Y數組的第left位值送入變量up。若此時P1.3等于0(即電路中的on/off鍵按下),則定時1啟停標志位o_f1取反(啟動/關閉)。隨即退出。
序號43:set值為3時,將此時Z數組的第left位值送入變量up。若此時P1.3等于0(即電路中的on/off鍵按下),則定時2啟停標志位o_f2取反(啟動/關閉)。隨即退出。
序號44:若set為其它值,也退出。
序號45:switch(set)開關語句結束。else語句結束。
序號46:if(n==0)語句結束。if(P1!=0xff)語句結束。
序號47:本次定時中斷快結束時,將暫存于i,j的當時P1口、P3口狀態(tài)還原。
序號48:定時1中斷函數結束。
上面為按鍵輸入程序設計的詳細解釋,按鍵輸入時需將當時狀態(tài)實時顯示出來,我們將顯示走時、顯示調整走時、顯示調整定時1、顯示調整定時2做成四個子程序,分別由set為0、1、2、3時散轉后的“顯示走時并判斷定時1、2到否程序”、“顯示調整走時程序”、“顯示調整定時1程序”、“顯示調整定時2程序”進行調用。為達到需輸入的某位顯示最亮(穩(wěn)定顯示),而其它三位顯示較暗(有閃爍感)的視覺效顯,讓三位需顯示較暗的數碼管每位點亮3mS,而顯示最亮的那位數碼管點亮36mS即可。限于篇幅,具體程序就不進行詳解了,讀者朋友可自行編寫。
評論