任務(wù)3-按鍵計分模塊_第1頁
任務(wù)3-按鍵計分模塊_第2頁
任務(wù)3-按鍵計分模塊_第3頁
任務(wù)3-按鍵計分模塊_第4頁
任務(wù)3-按鍵計分模塊_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

學(xué)習(xí)情境2籃球計時計分控制系統(tǒng)的設(shè)計任務(wù)3按鍵計分模塊籃球計時計分控制系統(tǒng)中實時記錄兩隊的比分是系統(tǒng)的主要功能之一,正式的系統(tǒng)還會記錄每一個對員的得分情況。在本任務(wù)中,我們把功能簡化,只記錄兩隊的得分。同時,由于比賽時兩隊都會得分,所以需要按鍵,計時員通過按鍵來改變兩隊的得分情況。任務(wù)設(shè)計要求和設(shè)計原理最后我們設(shè)計籃球控制系統(tǒng)中按鍵計分模塊的設(shè)計,本模塊主要包括各種按鍵的處理、以及分數(shù)顯示模塊。根據(jù)籃球比賽的特點,設(shè)計時使用了6個數(shù)碼管,用來實時顯示籃球比賽時兩個參賽隊伍的得分情況。比賽時比分的增減通過按鍵來實現(xiàn),設(shè)計了6個加分按鍵,分別為+1分、+2分、和+3分的按鍵,計時員難免會按錯按鍵,所以還設(shè)計了兩個減分按鍵。為了和前面幾個任務(wù)的按鍵統(tǒng)一起來,本任務(wù)的按鍵使用了矩陣鍵盤按鍵。硬件電路設(shè)計和前一任務(wù)的硬件電路比較,本任務(wù)除單片機最小系統(tǒng)電路之外,電路也是由按鍵電路和數(shù)碼顯示電路組成。按鍵電路由矩陣鍵盤電路構(gòu)成。數(shù)碼顯示電路則由2個三位一體的數(shù)碼管組成。具體電路如下圖所示:圖3-1按鍵計分模塊軟件設(shè)計在軟件設(shè)計方面,在這個電路模塊里,主要是矩陣鍵盤處理子程序的設(shè)計和數(shù)碼顯示模塊的設(shè)計。而其中的關(guān)鍵就是矩陣鍵盤處理子程序的設(shè)計,其具體設(shè)計思想為:利用線掃描法得到健值,再利用得到的按鍵值進行相應(yīng)的加分和減分程序的設(shè)計。線翻轉(zhuǎn)掃描法的具體思路為:先給行線(P1.4-P1.7)置零,低4位置1,即P1=0X0F;此時按鍵后,低4位的4個1中必有1個為0,其余的3個仍然為1。如,P1=00001111B,假設(shè)按下了5號?。ǜ鶕?jù)電路圖,5號鍵在P1.1所在列)。則P1=00001101B;然后我們可以利用異或指令得到列的鍵值,存放在一個變量Key_Num中,如P1和0X0F異或運算后得:00000010,此時我們可以讓Key_Num=1;其次,給列線(P1.0-P1.3)置零,高4位置1,即P1=0XF0;按鍵后,高4位的4個1中必有一個為0,其余的3個仍為1,如,P1=11110000B,剛才按下5號鍵,則P1=11010000B(根據(jù)電路圖,5號鍵在P1.1所在列),為得到鍵的行值,需把P1向低位移4位得到P1=00001101,然后P1和0x0f進行異或運算,得到00000010,此時我們可以讓Key_Num=4,最后把行值和列值相加得到鍵值,Key_Num=4。下面為具體的矩陣鍵盤掃描程序:/*矩陣鍵盤掃描子程序*/voidKey_Scan(){ucharkey_temp; P1=0x0f; //高4位置1,放入4行 delay(1); //按鍵后00001111將變成0000XXXX,X中有1個為0,其余3個仍能為1. key_temp=P1^0x0f;//判斷按鍵發(fā)生在0~3列中的哪一列。 switch(key_temp) { case1:Key_Num=0;break; case2:Key_Num=1;break; case4:Key_Num=2;break; case8:Key_Num=3;break; default:Key_Num=16;//說明沒有按鍵按下 } P1=0xf0;//低四位置零,放入四列 delay(1); //按鍵后11110000將變成XXXX0000,X中有1個為0,其余3個仍能為1. key_temp=P1>>4^0x0f;//將高4位移到低4位,并將其中唯一的0變?yōu)?,其余為0 switch(key_temp) { case1:Key_Num+=0;break; //對0~3行分別附加起始值0,4,8,12 case2:Key_Num+=4;break; case4:Key_Num+=8;break; case8:Key_Num+=12; }}得到了鍵值后,可以根據(jù)鍵值設(shè)計加分和減分程序,具體設(shè)計如下:/*加分按鍵處理子程序*/voidAdd_point(){//bitkey; Key_Scan(); switch(Key_Num){ case12:delay(200); if(Key_Num==12) {game_point1++; } break; case13:delay(200); if(Key_Num==13) {game_point1=game_point1+2;} break; case14:delay(200); if(Key_Num==14) {game_point1+=3; } break; case10:delay(200); if(Key_Num==10) {game_point2++;} break; case11:delay(200); if(Key_Num==11) {game_point2+=2;} break; case15:delay(200); if(Key_Num==15) {game_point2+=3;} break; }}/*減分按鍵處理子程序*/voidDec_point(){ Key_Scan(); switch(Key_Num) { case8:delay(200); if(Key_Num==8) {game_point1--;} break; case9:delay(200); if(Key_Num==9) {game_point2--;} break; }}數(shù)碼顯示模塊的設(shè)計相對較簡單。設(shè)計時采用了動態(tài)顯示技術(shù),編程時主要注意字形碼的輸入和位選碼的輸入。需要考慮硬件電路的連接情況。具體程序如下所示:/*顯示子程序*/voidDisplay(){ intj; ucharGroup1_ge,Group1_shi,Group1_bai,Group2_ge,Group2_shi,Group2_bai; Group1_bai=game_point1/100; Group1_shi=game_point1%100/10; Group1_ge=game_point1%100%10; Group2_bai=game_point2/100; Group2_shi=game_point2%100/10; Group2_ge=game_point2%100%10; for(j=0;j<10;j++) { P2=0x0f;//位選,選中百位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_bai];//段選,把百位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x01;//位選,選中十位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_shi];//段選,把十位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x02;//位選,選中個位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_ge];//段選,把個位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x03;//位選,選中百位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_bai];//段選,把百位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x04;//位選,選中十位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_shi];//段選,把十位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x05;//位選,選中個位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_ge];//段選,把個位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); }}除此之外,還有延時子程序(此處略),可用于按鍵消抖,動態(tài)顯示等,為使主程序結(jié)構(gòu)簡單,我們把一些變量的初值賦予工作全部放在初始化程序里。這兩個程序的具體設(shè)計如下所示:/*初始化子程序*/voidInitialization(){game_point1=100; game_point2=100; }小貼士:小貼士:表達式語句表達式語句表達式語句是最基本的一種語句。不同的程序設(shè)計語言都會有不一樣的表達式語句,如VB就是在表達式后面加入回車就構(gòu)成了VB的表達式語句,而在51單片機的C語言中則是加入分號“;”構(gòu)成表達式語句。舉例如下:b=b*10;Count++;X=A;Y=B;Page=(a+b)/a-1;以上的都是合法的表達式語句。在C語言中有一個特殊的表達式語句,稱為空語句,它僅僅是由一個分號“;”組成。有時候為了使語法正確,那么就要求有一個語句,但這個語句又沒有實際的運行效果那么這時就要有一個空語句??照Z句通常用會以下兩種用法。(1)while,for構(gòu)成的循環(huán)語句后面加一個分號,形成一個不執(zhí)行其它操作的空循環(huán)體。我們可以用它來寫等待事件發(fā)生的程序。大家要注意的是“;”號作為空語句使用時,要與語句中有效組成部分的分號相區(qū)分,如for(;a<50000;a++);第一個分號也應(yīng)該算是空語句,它會使a賦值為0(但要注意的是如程序前有a值,則a的初值為a的當(dāng)前值),最后一個分號則使整個語句行成一個空循環(huán)。若此時a=0,那么for(;a<50000;a++);就相當(dāng)于for(a=0;a<50000;a++);(2)在程序中為有關(guān)語句提供標(biāo)號,標(biāo)記程序執(zhí)行的位置,使相關(guān)語句能跳轉(zhuǎn)到要執(zhí)行的位置。這會用在goto語句中。復(fù)合語句和條件語句在C語言中是有不少的括號,如{},[],()等,確實會讓一些初入門的朋友不解。在VB等一些語言中同一個()號會有不同的作用,它可以用于組合若干條語句形成功能塊,可以用做數(shù)組的下標(biāo)等,而在C中括號的分工較為明顯,{}號是用于將若干條語句組合在一起形成一種功能塊,這種由若干條語句組合而成的語句就叫復(fù)合語句。復(fù)合語句之間用{}分隔,而它內(nèi)部的各條語句還是需要以分號“;”結(jié)束。復(fù)合語句是允許嵌套的,也是就是在{}中的{}也是復(fù)合語句。復(fù)合語句在程序運行時,{}中的各行單語句是依次順序執(zhí)行的。C語言中可以將復(fù)合語句視為一條單語句,也就是說在語法上等同于一條單語句。對于一個函數(shù)而言,函數(shù)體就是一個復(fù)合語句,也許大家會因此知道復(fù)合語句中不單可以用可執(zhí)行語句組成,還可以用變量定義語句組成。要注意的是在復(fù)合語句中所定義的變量,稱為局部變量,所謂局部變量就是指它的有效范圍只在復(fù)合語句中,而函數(shù)也算是復(fù)合語句,所以函數(shù)內(nèi)定義的變量有效范圍也只在函數(shù)內(nèi)部。下面用一段簡單的例子簡單說明復(fù)合語句和局部變量的使用。#include<at89x51.h>#include<stdio.h>voidmain(void){unsignedinta,b,c,d;//這個定義會在整個main函數(shù)中?SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器1定時方式2TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//啟動定時器a=5;b=6;c=7;d=8;//這會在整個函數(shù)有效printf("0:%d,%d,%d,%d\n",a,b,c,d);{//復(fù)合語句1unsignedinta,e;//只在復(fù)合語句1中有效a=10,e=100;printf("1:%d,%d,%d,%d,%d\n",a,b,c,d,e);{//復(fù)合語句2unsignedintb,f;//只在復(fù)合語句2中有效b=11,f=200;printf("2:%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f);}//復(fù)合語句2結(jié)束printf("1:%d,%d,%d,%d,%d\n",a,b,c,d,e);}//復(fù)合語句1結(jié)束printf("0:%d,%d,%d,%d\n",a,b,c,d);while(1);}運行結(jié)果:0:5,6,7,81:10,6,7,8,1002:10,11,7,8,100,2001:10,6,7,8,1000:5,6,7,8通過前面的學(xué)習(xí)我們對條件語句這個概念有了一定的認識吧?是的,就如學(xué)習(xí)語文中的條件語句一樣,C語言也一樣是“如果XX就XX”或是“如果XX就XX否則XX”。也就是當(dāng)條件符合時就執(zhí)行語句。條件語句又被稱為分支語句,也有人會稱為判斷語句,其關(guān)鍵字是由if構(gòu)成,這和大多數(shù)的高級語言中都是基本相同的。C語言提供了3種形式的條件語句:1、if(條件表達式)語句當(dāng)條件表達式的結(jié)果為真時,就執(zhí)行語句,否則就跳過。如if(a==b)a++;當(dāng)a等于b時,a就加12、if(條件表達式)語句1else語句2當(dāng)條件表達式成立時,就執(zhí)行語句1,否則就執(zhí)行語句2。如if(a==b)a++;elsea--;當(dāng)a等于b時,a加1,否則a-1。3、if(條件表達式1)語句1elseif(條件表達式2)語句2elseif(條件表達式3)語句3elseif(條件表達式m)語句nelse語句m。這是由ifelse語句組成的嵌套,用來實現(xiàn)多方向條件分支,使用應(yīng)注意if和else的配對使用,要是少了一個就會語法出錯,記住else總是與最臨近的if相配對。一般條件語句只會用作單一條件或少數(shù)量的分支,如果多數(shù)量的分支時則更多的會用到開關(guān)語句。如果使用條件語句來編寫超過3個以上的分支程序的話,會使程序變得不是那么清晰易讀。3.4軟件硬件的仿真調(diào)試1、首先利用ISIS-Professional軟件設(shè)計好硬件電路圖。2、其次,利用KEIL軟件建立工程項目,把用C語言編好的程序通過該軟件平臺進行編譯,直至把C程序修改無錯誤為止,并生成HEX文件。3、在ISIS-Professional軟件平臺下導(dǎo)入由KEIL軟件生成的HEX文件,進行仿真,仔細觀察產(chǎn)生的現(xiàn)象和效果,根據(jù)仿真的效果,邊修改邊調(diào)試,直到仿真效果與我們對項目的要求一致為止。至此,我們分別設(shè)計好了計時模塊(24秒計時和單節(jié)時間計時)和計分模塊,把各個模塊綜合起來就構(gòu)成了籃球計時計分控制系統(tǒng)。因為各個子模塊都經(jīng)過了調(diào)試,軟件和硬件都沒有什么問題,在整合這些子模塊時只需做些簡單的修改。3.5知識拓展-MCS-51單片機擴展存儲器(二)程序存儲器的擴展MCS-51的程序存儲器尋址空間為64KB,其中片內(nèi)包含4K的ROM/EPROM。當(dāng)片內(nèi)ROM不夠而需要擴展程序存儲器時,MCS-51的EA管腳應(yīng)接地??捎米贤饩€擦除、由電編程的只讀存儲器EPROM芯片常用作MCS-51應(yīng)用系統(tǒng)的外部程序存儲器。常用的EPROM芯片有2716、2732、2764、27128、27256、27512等,這些芯片的窗口在專門的紫外線燈光照射下,經(jīng)20min后,存儲器所有單元的信息全部變?yōu)?,從而擦去了程序指令代碼。用戶可用專門的EPROM編程(寫入)電路將程序固化在這些EPROM芯片之中。一、外部程序存儲器擴展概述目前單片機有ROM型、EPROM型和無ROM型芯片。不管使用哪種芯片,當(dāng)片內(nèi)程序存儲器容量滿足不了要求時,均需進行系統(tǒng)擴展。擴展時要注意以下幾點:(1)程序存儲器有單獨的地址編號(0000H~FFFFH),可尋址64KB范圍。雖然與數(shù)據(jù)存儲器地址重疊,但不會被占用。程序存儲器與數(shù)據(jù)存儲器共用地址總線和數(shù)據(jù)總線。(2)對片內(nèi)有ROM(EPROM)的單片機,片內(nèi)EPROM與片外EPROM采用相同的操作指令,片內(nèi)與片外程序存儲器的選擇靠硬件結(jié)構(gòu)實現(xiàn),即由的高低電平來選擇。(3)程序存儲器使用單獨的控制信號和指令,其數(shù)據(jù)讀取控制及指令不用數(shù)據(jù)存儲器的信號和MOVX指令,而是由控制,讀取數(shù)據(jù)用MOVC查表指令。(4)隨著大規(guī)模集成電路的發(fā)展,單片程序存儲器的容量越來越大,構(gòu)成系統(tǒng)時所使用的EPROM芯片數(shù)量越來越少,因此地址選擇大多采用線選法,而不用地址譯碼法。MCS-51系列單片機外部EPROM擴展原理如圖3-2所示。圖3-2外部EPROM擴展原理由圖可見,P0口和P2口提供16位地址碼。其中P0口作為分時復(fù)用的地址/數(shù)據(jù)總線。當(dāng)從外部EPROM取指令時,從P0口輸出低8位地址,由ALE地址鎖存允許信號的下降沿將低8位地址碼打入地址鎖存器,它的輸出與存儲器的低8位地址A7~A0相連。存儲器的8位數(shù)據(jù)線D7~D0與P0口相連,以便輸入讀取的指令代碼。在一個只讀存儲器讀周期中,P0口前半周期輸出低8位地址碼,后半周期輸入讀取的指令代碼。由P2口輸出高8位地址碼。由于P2口輸出由鎖存功能,而且在整個讀指令周期內(nèi)不作它用,故直接與存儲器的高8位地址A15~A8相連。主機的為外部程序存儲器選通信號,它與存儲器的(指令代碼輸出選通)信號相連。EPROM芯片的片選端如何連接,與單片機系統(tǒng)的地址分配和硬件結(jié)構(gòu)有關(guān)。可以直接接地;可以與P2口某位以線選法直接將來;也可以通過譯碼器的輸出進行相連,應(yīng)視具體設(shè)計情況而定。目前常用于單片機的程序存儲器為紫外線可擦除的只讀存儲器EPROM,這種存儲器在斷電狀態(tài)下能保存所寫入的數(shù)據(jù),在需要寫入新程序代碼之前,需要使用紫外線對芯片上石英玻璃窗口進行光照,將原有程序擦除,再寫入新程序即可。需要說明的是,對于EPROM型的存儲器,要寫入程序數(shù)據(jù)時,應(yīng)使用專門的寫入器。這類芯片在單片機應(yīng)用系統(tǒng)中以2716、2732、2764、27128、27256使用較多。二、8051/8751的程序存儲器擴展8051/8751是片內(nèi)有ROM/EPROM的供應(yīng)狀態(tài)。一般來說,采用8051/8751的單片機應(yīng)用系統(tǒng)中,很少再用到外部程序存儲器擴展,這是因為同時使用片內(nèi)、片外程序存儲器時會失去選用8051/8751的優(yōu)點,不如轉(zhuǎn)而采用單純的外部程序存儲器的8031應(yīng)用系統(tǒng)。8051/8751外部擴展4kEPROM程序存儲器的應(yīng)用系統(tǒng)如圖3-3所示。在有外部程序存儲器的8051/8751系統(tǒng)中,程序存儲器的選擇線的輸入電平會影響程序存儲器的結(jié)構(gòu)。當(dāng)圖中為高電平時,該系統(tǒng)具有8K字節(jié)程序存儲器。8051/8751內(nèi)部4k字節(jié)ROM/EPROM程序存儲器地址為0000H~0FFFH;外部4k字節(jié)2732EPROM程序存儲器地址為1000H~1FFFH。當(dāng)程序計數(shù)器PC值在0000H~0FFFH時,指向片內(nèi)程序存儲器,當(dāng)PC值大于0FFFH時,則指向片外程序存儲器。當(dāng)為低電平時,8051/8751內(nèi)部程序存儲器無效,系統(tǒng)只有外部程序存儲器4k字節(jié),其地址為0000H~0FFFH。此時,8051/8751相當(dāng)于8031。圖3-3擴展4k字節(jié)EPROM的8051/8751三、8031的程序存儲器擴展圖3-4為使用一片EPROM27256和鎖存器74LS373構(gòu)成的8031程序存儲器擴展電路。圖中8031的無關(guān)電路部分均未畫出。圖3-4一片27256的EPROM的擴展電路對于需要較大程序存儲器容量的單片機應(yīng)用系統(tǒng)則要進行片外存儲器的進一步擴展。擴展時,可以采用多個小容量存儲芯片組合擴展方式或者直接選用大容量存儲芯片進行擴展。接下來我們結(jié)合單片機時序圖簡單分析擴展電路的工作原理。圖3-5存儲器擴展時單片機引腳時序圖單片機取指令是各個部件相互協(xié)調(diào)工作的一個過程.主要是以下幾步.第一步,送16位地址,指明要取的指令的存放位置。高8位地址通過P2送到27256的A8-A14和片選端\CE。低8位地址由P0口提供,是通過373連接到27256的A7-A0上的。這里要注意:高8位地址是由A8-A14和片選端\CE共同組成的。片選端\CE為最高位。真正的地址范圍為0000H-7FFFH.第二步,等待ALE第一次有效(高電平)。此時,373通道被打開,低8位地址被送入A7-A0。與此同時,\PSEN為高電平,因此27256的數(shù)據(jù)輸出端還未打開,即數(shù)據(jù)沒有送出。第三步,ALE出現(xiàn)下降沿。此時,373的門被關(guān)?。ㄦi存數(shù)據(jù)),與此同時,\PSEN出現(xiàn)低電平,27256的數(shù)據(jù)輸出端被打開,要取的指令代碼通過O0-O7端口送入數(shù)據(jù)總線。第四步,ALE第二次有效,此時,總線上的代碼通過P0口讀入單片機。雖然此時373被打開,但是由于此時\PSEN為高電平,把27256關(guān)掉了。因此,即使剛才的代碼通過373被送到A7-A0,也不會送入27256中。附錄:完整程序代碼#include<reg51.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint/*數(shù)碼管顯示代碼*/ucharcodeshuma[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF};//共陽//ucharcodeshuma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//共陰ucharKey_Num=16;uchark_count,s_count;sbitattack_pause=P3^1;// 暫停按鍵K2sbitset_point=P3^3;bitk2,k4,ka,kb;//定義一些標(biāo)志位uintgame_point1,game_point2;//比賽比分變量/*子程序聲明*/voiddelay(uintK);//延時子程序voidDisplay();//顯示子程序voidInitialization();//初始化子程序voidKey_Scan();//矩陣鍵盤掃描子程序voidAdd_point(); // 加分按鍵處理子程序voidDec_point();//減分按鍵處理子程序//*主程序*/voidmain(void){Initialization();while(1) { Display();//顯示子程序 Key_Scan(); // 矩陣鍵盤掃描子程序 Add_point(); // 加分按鍵處理子程序 Dec_point(); //減分按鍵處理子程序 } }/*延時子程序*/voiddelay(uintK){uinti,j;for(i=K;i>0;i--)for(j=120;j>0;j--);}/*顯示子程序*/voidDisplay(){ intj; ucharGroup1_ge,Group1_shi,Group1_bai,Group2_ge,Group2_shi,Group2_bai; Group1_bai=game_point1/100; Group1_shi=game_point1%100/10; Group1_ge=game_point1%100%10; Group2_bai=game_point2/100; Group2_shi=game_point2%100/10; Group2_ge=game_point2%100%10; for(j=0;j<10;j++) { P2=0x0f;//位選,選中百位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_bai];//段選,把百位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x01;//位選,選中十位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_shi];//段選,把十位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x02;//位選,選中個位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group1_ge];//段選,把個位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x03;//位選,選中百位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_bai];//段選,把百位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x04;//位選,選中十位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_shi];//段選,把十位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); P2=0x05;//位選,選中個位數(shù)對應(yīng)的那個數(shù)碼管 P0=shuma[Group2_ge];//段選,把個位數(shù)的字形碼送到上面選通的數(shù)碼管中 delay(1); }}/*初始化子程序*/voidInitialization(){ game_point1=100; game_point2=100;}/*矩陣鍵盤掃描子程序*/voidKey_Scan(){ucharkey_temp; P1=0x0f; //高4位置1,放入4行 delay(1);//按鍵后00001111將變成0000XXXX,X中有1個為0,其余3個仍能為1. key_temp=P1^0x0f;//判斷按鍵發(fā)生在0~3列中的哪一列。 switch(key_temp) { case1:Key_Num=0;break; case2:Key_Num=1;break; case4:Key_Num=2;break; case8:Key_Num=3;break; default:Key_Num=16;//說明沒有按鍵按下 } P1=0xf0;//低四位置零,放入四列 delay(1);//按鍵后11110000將變成XXXX0000,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論