矩陣鍵盤控制接口電路(完整版)實(shí)用資料_第1頁
矩陣鍵盤控制接口電路(完整版)實(shí)用資料_第2頁
矩陣鍵盤控制接口電路(完整版)實(shí)用資料_第3頁
矩陣鍵盤控制接口電路(完整版)實(shí)用資料_第4頁
矩陣鍵盤控制接口電路(完整版)實(shí)用資料_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

矩陣鍵盤控制接口電路(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)

矩陣鍵盤控制接口電路(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)電子信息工程專業(yè)年月日實(shí)驗(yàn)名稱矩陣鍵盤控制接口電路指導(dǎo)教師姓名年級學(xué)號成績預(yù)習(xí)部分實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)基本原理主要儀器設(shè)備(含必要的元器件、工具)實(shí)驗(yàn)原理:掃描信號為BCOM[8..1],在BCOM[8..1]前已接有一個3-8譯碼器,3-8譯碼器的輸入為SEL0~SEL3。當(dāng)3-8譯碼器的輸入為“000”時,即BCOM1為‘0’,其他位為‘1’,我們按下第一排第一鍵,此時KIN0輸出‘0’,KIN1~KIN3輸出全為‘1’,按下第二排第二鍵時,KIN1輸出‘0’,其他輸出‘1’;當(dāng)3-8譯碼器輸入為001時,即BCOM2為‘0’,我們按下第一排第二鍵,此時KIN0輸出‘0’,KIN1~KIN3輸出全為‘1’,同理其他鍵依此類推。鍵盤上的每個按鍵就是一個開關(guān),當(dāng)某鍵被按下時,該按鍵的接點(diǎn)會呈現(xiàn)‘0’狀態(tài),反之為‘1’。掃描信號為SEL[2..0]進(jìn)入3-8譯碼器,再從譯碼器輸出到鍵盤,所以第一次只能掃描一排,依此周而復(fù)始。按鍵位置與數(shù)碼的關(guān)系如表40-1所示。若從KIN[3..0]輸出的皆為‘1’時,表示沒有按鍵按下,代表該列沒有按鍵被按下,則不進(jìn)行按鍵編碼的操作,反之,如果有被按下時,則應(yīng)將KIN[3..0]讀出的值送到譯碼電路進(jìn)行編碼。表40-1按鍵位置與數(shù)碼關(guān)系SEL2~SEL0KIN3~KIN0對應(yīng)的按鍵00011100110161011LAST0111CTRL00111101110171011STEP0111EMPTY1010111021101REG1011C0111EMPTY2011111031101EXEC1011D0111EMPTY31001110MEM1011E0111EMPTY41011E0111EMPTY41011110ESC110191011F0111SHIFT110111041101A1011NEXT0111NONE111111051101B1011ENTER0111NONE實(shí)驗(yàn)內(nèi)容:按鍵的去抖:消抖動電路:時鐘產(chǎn)生:libraryieee;useieee.std_logic_1164.all;entitydivisport(clr,clk:inbit;q:bufferbit);enddiv;architectureartofdivisbeginprocess(clr,clk)variablecount:integerrange0to12499;beginif(clk='1'andclk'event)thenifclr='1'thencount:=0;elsifcount=12499thencount:=0;q<=notq;elsecount:=count+1;endif;endif;endprocess;endart;(2)仿真圖鍵盤掃描譯碼電路:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitykeyboard4_4isport(rst:instd_logic;clk:instd_logic;keyin:instd_logic_vector(3downto0);scan:outstd_logic_vector(3downto0);leds:outstd_logic_vector(3downto0));endkeyboard4_4;architecturekeyboard4_4_archofkeyboard4_4issignalclkfrq:std_logic;signalcntscn:std_logic_vector(1downto0);signalscnlin:std_logic_vector(3downto0);signalcntfrq:std_logic_vector(14downto0);--signalcntfrq:std_logic_vector(3downto0);signallednum:std_logic_vector(7downto0);beginprocess(rst,clk,clkfrq)beginifrst='0'thenclkfrq<='0';cntfrq<=(others=>'0');elsifclk'eventandclk='1'then--ifcntfrq="1111"thencntfrq<=(others=>'0');clkfrq<=notclkfrq;elsecntfrq<=cntfrq+1;endif;endif;endprocess;process(rst,clkfrq)beginifrst='0'thencntscn<="00";elsifclkfrq'eventandclkfrq='1'thenifcntscn="11"thencntscn<="00";elsecntscn<=cntscn+1;endif;casecntscniswhen"00"=>scnlin<="0001";when"01"=>scnlin<="0010";when"10"=>scnlin<="0100";when"11"=>scnlin<="1000";whenothers=>null;endcase;endif;endprocess;process(rst,clkfrq)beginif(rst='0')thenleds<="1111";elsifclkfrq'eventandclkfrq='0'thencaselednumiswhen"00010001"=>leds<="0000";when"00010010"=>leds<="0001";when"00010100"=>leds<="0010";when"00011000"=>leds<="0011";when"00100001"=>leds<="0100";when"00100010"=>leds<="0101";when"00100100"=>leds<="0110";when"00101000"=>leds<="0111";when"01000001"=>leds<="1000";when"01000010"=>leds<="1001";when"01000100"=>leds<="1010";when"01001000"=>leds<="1011";when"10000001"=>leds<="1100";when"10000010"=>leds<="1101";when"10000100"=>leds<="1110";when"10001000"=>leds<="1111";whenothers=>null;endcase;endif;endprocess;scan<=scnlin;lednum<=scnlin&keyin;endkeyboard4_4_arch;(4)按鍵顯示電路:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDELEDISPORT(SELTMP:INSTD_LOGIC_VECTOR(2DOWNTO0);BCDIN:INSTD_LOGIC_VECTOR(31DOWNTO0));SEGOUT:OUTSTD_LOGIC_VECTOR(6DOWNTO0)ENDDELED;ARCHITECTUREART1OFDELEDISSIGNALDB:STD_LOGIC_VECTOR(3DOWNTO0)SIGNALSEG:STD_LOGIC_VECTOR(6DOWNTO0)BEGINSEGOUT<=SEG;MULTIPLEXER:BLOCKBEGINDB<=BCDIN(3DOWNTO0)WHENSETMP=0ELSEBCDIN(7DOWNTO4)WHENSETMP=0ELSEBCDIN(11DOWNTO8)WHENSETMP=0ELSEBCDIN(15DOWNTO12)WHENSETMP=0ELSEBCDIN(19DOWNTO16)WHENSETMP=0ELSEBCDIN(23DOWNTO20)WHENSETMP=0ELSEBCDIN(27DOWNTO24)WHENSETMP=0ELSEBCDIN(31DOWNTO28);END;SEVEN_SEGMENT:SEG<="1111110"whennum="0000"else"0110000"whennum="0001"else"1101101"whennum="0010"else"1111001"whennum="0011"else"0110011"whennum="0100"else"1011011"whennum="0101"else"1011111"whennum="0110"else"1110000"whennum="0111"else"1111111"whennum="1000"else"1111011"whennum="1001"else"0000000";ENDBLOCKSEVEN_SEGMENT;END;三、實(shí)驗(yàn)效果分析(包括儀器設(shè)備等使用效果)教師評語指導(dǎo)教師年月日實(shí)驗(yàn)七矩陣鍵盤控制接口一、實(shí)驗(yàn)要求設(shè)計(jì)并實(shí)現(xiàn)一個4×8鍵盤接口控制器,含有時序產(chǎn)生電路、鍵盤掃描電路、彈跳消除電路、鍵盤譯碼電路、按鍵碼存儲電路、顯示電路。要求:當(dāng)按下某一鍵時,在數(shù)碼管上顯示該鍵對應(yīng)的鍵值。二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)儀器中4×8矩陣鍵盤的電路原理圖如圖50-1所示。圖50-14×8矩陣鍵盤電路原理圖掃描信號為BCOM[8..1],在BCOM[8..1]前已接有一個3-8譯碼器,3-8譯碼器的輸入為SEL0~SEL3。當(dāng)3-8譯碼器的輸入為“000”時,即BCOM1為‘0’,其他位為‘1’,我們按下第一排第一鍵,此時KIN0輸出‘0’,KIN1~KIN3輸出全為‘1’,按下第二排第二鍵時,KIN1輸出‘0’,其他輸出‘1’;當(dāng)3-8譯碼器輸入為001時,即BCOM2為‘0’,我們按下第一排第二鍵,此時KIN0輸出‘0’,KIN1~KIN3輸出全為‘1’,同理其他鍵依此類推。鍵盤上的每個按鍵就是一個開關(guān),當(dāng)某鍵被按下時,該按鍵的接點(diǎn)會呈現(xiàn)‘0’狀態(tài),反之為‘1’。掃描信號為SEL[2..0]進(jìn)入3-8譯碼器,再從譯碼器輸出到鍵盤,所以第一次只能掃描一排,依此周而復(fù)始。按鍵位置與數(shù)碼的關(guān)系如表50-1所示。若從KIN[3..0]輸出的皆為‘1’時,表示沒有按鍵按下,代表該列沒有按鍵被按下,則不進(jìn)行按鍵編碼的操作,反之,如果有被按下時,則應(yīng)將KIN[3..0]讀出的值送到譯碼電路進(jìn)行編碼。表50-1按鍵位置與數(shù)碼關(guān)系光靠矩陣鍵盤是無法正確地完成輸入工作的,另外還需搭配以下幾個電路模塊:1、時鐘產(chǎn)生電路當(dāng)一個系統(tǒng)中使用不同操作頻率的脈沖波形時,最方便的方法就是利用一個自由計(jì)數(shù)器來產(chǎn)生各種頻率。本電路中就使用三種不同頻率的工作脈沖波形。它們分別是:系統(tǒng)時鐘(它是系統(tǒng)內(nèi)部所有時鐘的提供者,頻率最高)、彈跳消除取樣信號、鍵盤掃描信號和七段顯示器掃描信號。在很多的電路設(shè)計(jì)中,鍵盤掃描信號和七段顯示器掃描信號可以使用相同的時鐘信號,本設(shè)計(jì)也采用此方法。具體做法:●先建立一個N位的計(jì)數(shù)器,N的大小由電路的需求所定。N的值越大,分頻的次數(shù)就越多,但所占用的空間也越大。●若要得到一個脈沖波形信號,可以只取計(jì)數(shù)器中一個值,如使用CLK<=Q(4)語句,其值變化為0-1-0-1-1???!袢粢玫矫}沖波形序列,可以取計(jì)數(shù)器中的幾個值,如使用CLK<=Q(4DOWNTO3)語句,其值變化為00-01-10-11-00-01??。2、鍵盤掃描電路掃描電路的作用是用來提供鍵盤掃描信號(表50-1中的SEL2~SEL0)的電路,掃描信號的變化的順序依次為000-001-010-011-100-101-110-111??依次的周而復(fù)始。掃描時依序分別掃描八列按鍵,當(dāng)掃描信號為000時,掃描0這一列按鍵??每掃描一列按鍵,就檢查一次是否有按鍵按下,如果這排有按鍵按下,就馬上停止掃描,立即進(jìn)行按鍵編碼動作,存儲鍵碼,如果沒有按鍵按下,則繼續(xù)掃描下一列。3、彈跳消除電路因?yàn)榘存I大多是機(jī)械式開關(guān)結(jié)構(gòu),在開關(guān)切換的瞬間會在接觸點(diǎn)出現(xiàn)來回彈跳的現(xiàn)象,對于激活關(guān)閉一般電器并不會有何影響,但對于靈敏度較高的電路,卻有可能產(chǎn)生誤動作而出錯。彈跳現(xiàn)象產(chǎn)生的原因可從圖50-2說明。雖然只是按下按鍵一次然后放掉,然而實(shí)際產(chǎn)生的按鍵信號卻不只跳動一次,經(jīng)過取樣的檢查后將會造成誤判,以為按鍵兩次。按鍵信號抽樣信號抽樣結(jié)果圖50-2彈跳現(xiàn)象產(chǎn)生錯誤的抽樣結(jié)果如果調(diào)整抽樣頻率(如圖50-3),可以發(fā)現(xiàn)彈跳現(xiàn)象獲得了改善。按鍵信號抽樣信號抽樣結(jié)果圖50-3調(diào)整抽樣頻率后得到的抽樣結(jié)果因此必須加上彈跳消除電路,避免誤操作信號的發(fā)生。注意,彈跳消除電路所使用脈沖信號的頻率必須比其它電路使用的脈沖信號的頻率更高;通常將掃描電路或LED顯示電路的工作頻率定在24HZ左右,兩者的工作頻率是通常的4倍或更高。4、鍵盤譯碼電路上述鍵盤中的按鍵可分為數(shù)字鍵和功能鍵。數(shù)字鍵主要用來輸入數(shù)字,但從表50-2中發(fā)現(xiàn),鍵盤所產(chǎn)生的輸出KIN3~KIN0無法拿來直接使用;另外不同的數(shù)字按鍵也擔(dān)負(fù)不同的功能,因此必須由鍵盤譯碼電路來規(guī)劃第個按鍵的輸出形式,以便執(zhí)行相應(yīng)的動作。有了表50-2,要寫出鍵盤譯碼電路的VHDL程序就非常容易了,尤其針對有表可以對照的電路設(shè)計(jì),只要使用CASE-WHEN或WHNE-ELSE語句,便可輕松完成設(shè)計(jì)。表50-2鍵盤參數(shù)表譯碼電路負(fù)責(zé)的工作有:a)判別是否有鍵按下。b)若被按下的是數(shù)字鍵或字母鍵,則編碼成相對應(yīng)的16進(jìn)制編碼c)若被按下的是數(shù)字鍵,除進(jìn)行16進(jìn)制編碼外,同時還編碼成BCD碼。d)若按下是的功能鍵或其他按鍵,則編碼成16進(jìn)制編碼。5、按鍵碼存儲電路因?yàn)槊看螔呙钑a(chǎn)生新的按鍵數(shù)據(jù),可能會覆蓋前面的數(shù)據(jù),所以需要一個按鍵存儲電路,將整個鍵盤掃描完畢后記錄下來。按鍵存儲電路可以用移位寄存器構(gòu)成,在這里對移位寄存器就不再介紹,請參閱前面相關(guān)實(shí)驗(yàn)。鍵盤接口電路的引腳如圖50-4所示。圖50-4矩陣鍵盤接口模塊引腳圖三、實(shí)驗(yàn)連線將CLK時鐘接4~5MHZ時鐘輸入,KIN[3..0]分別接實(shí)驗(yàn)儀器的鍵盤輸出KIN[3..0],SEL[2..0]分別接實(shí)驗(yàn)儀器的掃描輸入SEL[2..0],SEGOUT[7..0]分別接7段顯示器輸入DP~A。矩陣式鍵盤案例89S51單片機(jī)的P1口用作鍵盤I/O口,P0口用作輸出口,用于輸出所按鍵的鍵號(0~F)。矩陣式鍵盤連接電路圖鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0~P1.3設(shè)置為輸入線,行線P1.4~P1.7設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。(1)檢測當(dāng)前是否有鍵被按下:檢測的方法是P1.4~P1.7輸出全“0”,讀取P1.0~P1.3的狀態(tài),若P1.0~P1.3為全“1”,則無鍵閉合,否則有鍵閉合。(2)去除鍵抖動:當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。(3)若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。對鍵盤的行線進(jìn)行掃描。P1.4~P1.7按下述4種組合依次輸出:P1.71110P1.61101P1.51011P1.40111在每組行輸出時讀取P1.0~P1.3,若全為“1”,則表示為這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。建立有效標(biāo)志計(jì)算鍵值閉合鍵釋放建立無效標(biāo)志建立有效標(biāo)志計(jì)算鍵值閉合鍵釋放建立無效標(biāo)志返回找到閉合鍵NYNY鍵盤掃描有鍵閉合延時去抖動掃描鍵盤NY#include<reg51.h>unsignedcharseg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(unsignedchar);unsignedcharkey_scan();voidmain(){unsignedcharval_key;while(1){val_key=key_scan();if(val_key!=0xff)P0=seg[val_key];}}voiddelay(unsignedchart){unsignedchari,j;for(i=0;i<t;i++)for(j=0;j<200;j++);}unsignedcharkey_scan(){unsignedcharkdata,vkey,keyNo;圖9-8鍵盤掃描程序流程圖bitiskey=0;//標(biāo)志,在確定具體哪一個鍵按下時,如果檢測到有一個鍵按下則該標(biāo)志置1P1=0x0f;//行線送“0kdata=P1;//讀取列線值kdata&=0x0f;if(kdata==0x0f)return0xff;//無鍵按下,建立無效標(biāo)志(0xff為無鍵按下的無效標(biāo)志)else//若列線均為“1”{delay(25);//有鍵按下,去除抖動kdata=0xef;while(!iskey)//掃描鍵盤{vkey=P1=kdata;//送掃描碼至P1口行線,并將掃描碼保存到vkey中kdata=P1;//讀取列線值kdata&=0x0f;if(kdata==0x0f){kdata=vkey;//若沒有鍵盤按下,則取出行掃描碼kdata<<=1;//換掃描下一行的掃描碼(循環(huán)向左移一位kdata|=1;}else//若有鍵按下則鍵處理{kdata^=0x0f;//為計(jì)算列值的方便,將列線P1.3~P1.0分別與1異或即按位取反switch(kdata)//計(jì)算列值{case1:keyNo=0;break;case2:keyNo=1;break;case4:keyNo=2;break;case8:keyNo=3;break;}iskey=1;}}vkey=vkey>>4;//取行掃描碼vkey^=0x0f;//將行掃描碼取反switch(vkey){case1:keyNo+=0;break;//把行值加到列值中case2:keyNo+=4;break;case4:keyNo+=8;break;case8:keyNo+=12;break;}do{kdata=P1;kdata&=0x0f;}while(kdata!=0x0f);//判斷鍵釋放}returnkeyNo;}矩陣鍵盤是單片機(jī)編程中所使用的鍵盤.0b

|;}7[1m9M

z

1.矩陣式鍵盤的結(jié)構(gòu)與工作原理0c;J-@/M"O)y"X/|6}7k

在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。+D3p1l5K0_5j

矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程方法如下所述。3?8h4S"s;W5r

2、矩陣式鍵盤的按鍵識別方法

確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

i$I4W,J!v&C

行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

2、判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

c9n6O.u6S

e

],t:^

下面給出一個具體的例子:6L'G#^:c$t

圖仍如上所示。8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源+5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。

1、檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

2、去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

3、若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:

P1.71110

P1.61101.L2m5?4g1r

P1.51011

P1.40111

在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值2O;w4w0C#}5[)D

4、為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。3u#\3u!Y!D"{5m

鍵盤掃描程序:

從以上分析得到鍵盤掃描程序的流程圖如圖2所示。程序如下

SCAN:MOVP1,#0FH

MOVA,P1

ANLA,#0FH!p*h

[4v&^&k

CJNEA,#0FH,NEXT1

SJMPNEXT3

NEXT1:ACALLD20MS$K9s*{)?"n/S$f2\

MOVA,#0EFH

NEXT2:MOVR1,A

MOVP1,A3`,h8q&}-P:]

C,_9X2C

MOVA,P1&Z/K-_)B8e'q

H7K

ANLA,#0FH

CJNEA,#0FH,KCODE;

MOVA,R1&{,J$\)x$t$|0m

SETBC

RLCA

JCNEXT2

NEXT3:MOVR0,#00H

RET

KCODE:MOVB,#0FBH

NEXT4:RRCA2v6E(W6A&L'o&T

INCB

JCNEXT40L8d/b

C:y,U"{;?8G'g

MOVA,R1

SWAPA8F2v%`"k"f

?5L;|(Y"n

NEXT5:RRCA

INCB8Q/C1x9x5e

INCB*j6I'b+n/I8z

INCB(r(]0N/b#~

INCB7j&t7T+G9a8L,{&m

JCNEXT5

NEXT6:MOVA,P18`/e0u3J9O$?*c3\#c%a!|

ANLA,#0FH

CJNEA,#0FH,NEXT6"^

o:r9k3J;R

MOVR0,#0FFH

RET6H2f&N3x+Y$D!R

鍵盤處理程序就作這么一個簡單的介紹,實(shí)際上,鍵盤、顯示處理是很復(fù)雜的,它往往占到一個應(yīng)用程序的大部份代碼,可見其重要性,但說到,這種復(fù)雜并不來自于單片機(jī)的本身,而是來自于操作者的習(xí)慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當(dāng)?shù)乃惴ū硎境鰜?,最后再去寫代碼,這樣,才能快速有效地寫好代碼。.E-J7k8K"v,Q:u

鍵盤是由一組規(guī)則排列的按鍵組成,一個按鍵實(shí)際上是一個開關(guān)元件,也就是說鍵盤是一組規(guī)則排列的開關(guān)。1i"_/D1l/z%\)N

鍵盤工作原理

1.按鍵的分類7V6B8E$k&t:m*i

按鍵按照結(jié)構(gòu)原理可分為兩類,一類是觸點(diǎn)式開關(guān)按鍵,如機(jī)械式開關(guān)、導(dǎo)電橡膠式開關(guān)等;另一類是無觸點(diǎn)開關(guān)按鍵,如電氣式按鍵,磁感應(yīng)按鍵等。前者造價低,后者壽命長。目前,微機(jī)系統(tǒng)中最常見的是觸點(diǎn)式開關(guān)按鍵。

按鍵按照接口原理可分為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區(qū)別是識別鍵符及給出相應(yīng)鍵碼的方法。編碼鍵盤主要是用硬件來實(shí)現(xiàn)對鍵的識別,非編碼鍵盤主要是由軟件來實(shí)現(xiàn)鍵盤的定義與識別。

全編碼鍵盤能夠由硬件邏輯自動提供與鍵對應(yīng)的編碼,此外,一般還具有去抖動和多鍵、竄鍵保護(hù)電路,這種鍵盤使用方便,但需要較多的硬件,價格較貴,一般的單片機(jī)應(yīng)用系統(tǒng)較少采用。非編碼鍵盤只簡單地提供行和列的矩陣,其它工作均由軟件完成。由于其經(jīng)濟(jì)實(shí)用,較多地應(yīng)用于單片機(jī)系統(tǒng)中。下面將重點(diǎn)介紹非編碼鍵盤接口。

2.鍵輸入原理

在單片機(jī)應(yīng)用系統(tǒng)中,除了復(fù)位按鍵有專門的復(fù)位電路及專一的復(fù)位功能外,其它按鍵都是以開關(guān)狀態(tài)來設(shè)置控制功能或輸入數(shù)據(jù)。當(dāng)所設(shè)置的功能鍵或數(shù)字鍵按下時,計(jì)算機(jī)應(yīng)用系統(tǒng)應(yīng)完成該按鍵所設(shè)定的功能,鍵信息輸入是與軟件結(jié)構(gòu)密切相關(guān)的過程。'["s9b8f)@9o5]

對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以采用查詢或中斷方式了解有無將鍵輸入并檢查是哪一個鍵按下,將該鍵號送入累加器ACC,然后通過跳轉(zhuǎn)指令轉(zhuǎn)入執(zhí)行該鍵的功能程序,執(zhí)行完后再返回主程序。

3.按鍵結(jié)構(gòu)與特點(diǎn)

微機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換成為電氣上的邏輯關(guān)系。也就是說,它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便與通用數(shù)字系統(tǒng)的邏輯電平相容。

機(jī)械式按鍵再按下或釋放時,由于機(jī)械彈性作用的影響,通常伴隨有一定時間的觸點(diǎn)機(jī)械抖動,然后其觸點(diǎn)才穩(wěn)定下來。其抖動過程如圖7.2所示,抖動時間的長短與開關(guān)的機(jī)械特性有關(guān),一般為5~10ms。7b2n0J*s'U&J

在硬件上可采用在鍵輸出端加R-S觸發(fā)器(雙穩(wěn)態(tài)觸發(fā)器)或單穩(wěn)態(tài)觸發(fā)器構(gòu)成去抖動電路,圖7.3是一種由R-S觸發(fā)器構(gòu)成的去抖動電路,當(dāng)觸發(fā)器一旦翻轉(zhuǎn),觸點(diǎn)抖動不會對其產(chǎn)生任何影響。)}+e&M&f

`1l:p4V4|

電路工作過程如下:按鍵未按下時,a=0,b=1,輸出Q=1,按鍵按下時,因按鍵的機(jī)械彈性作用的影響,使按鍵產(chǎn)生抖動,當(dāng)開關(guān)沒有穩(wěn)定到達(dá)b端時,因與非門2輸出為0反饋到與非門1的輸入端,封鎖了與非門1,雙穩(wěn)態(tài)電路的狀態(tài)不會改變,輸出保持為1,輸出Q不會產(chǎn)生抖動的波形。當(dāng)開關(guān)穩(wěn)定到達(dá)b端時,因a=1,b=0,使Q=0,雙穩(wěn)態(tài)電路狀態(tài)發(fā)生翻轉(zhuǎn)。當(dāng)釋放按鍵時,在開關(guān)未穩(wěn)定到達(dá)a端時,因Q=0,封鎖了與非門2,雙穩(wěn)態(tài)電路的狀態(tài)不變,輸出Q保持不變,消除了后沿的抖動波形。當(dāng)開關(guān)穩(wěn)定到達(dá)b端時,因a=0,b=0,使Q=1,雙穩(wěn)態(tài)電路狀態(tài)發(fā)生翻轉(zhuǎn),輸出Q重新返回原狀態(tài)。由此右圖雙穩(wěn)態(tài)去抖電路5y9X;@0X4Q3c'y(H2v3v

可見,鍵盤輸出經(jīng)雙穩(wěn)態(tài)電路之后,輸出已變?yōu)橐?guī)范的矩形方波。'V1@1P.r(t#\.c

_

軟件上采取的措施是:在檢測到有按鍵按下時,執(zhí)行一個10ms左右(具體時間應(yīng)視所使用的按鍵進(jìn)行調(diào)整)的延時程序后,再確認(rèn)該鍵電平是否仍保持閉合狀態(tài)電平,若仍保持閉合狀態(tài)電平,則確認(rèn)該鍵處于閉合狀態(tài);同理,在檢測到該鍵釋放后,也應(yīng)采用相同的步驟進(jìn)行確認(rèn),從而可消除抖動的影響。

4.按鍵編碼

一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關(guān)狀態(tài)。根據(jù)鍵盤結(jié)構(gòu)的不同,采用不同的編碼。無論有無編碼,以及采用什么編碼,最后都要轉(zhuǎn)換成為與累加器中數(shù)值相對應(yīng)的鍵值,以實(shí)現(xiàn)按鍵功能程序的跳轉(zhuǎn)。

5.編制鍵盤程序/K4N4Y;H;o)g

一個完善的鍵盤控制程序應(yīng)具備以下功能:

(1)檢測有無按鍵按下,并采取硬件或軟件措施,消除鍵盤按鍵機(jī)械觸點(diǎn)抖動的影響。5h8[,B$D8G/@;c

(2)有可靠的邏輯處理辦法。每次只處理一個按鍵,其間對任何按鍵的操作對系統(tǒng)不產(chǎn)生影響,且無論一次按鍵時間有多長,系統(tǒng)僅執(zhí)行一次按鍵功能程序。

(3)準(zhǔn)確輸出按鍵值(或鍵號),以滿足跳轉(zhuǎn)指令要求。

獨(dú)立式按鍵

^+F/C7[:C5h6B#x7V-|

單片機(jī)控制系統(tǒng)中,往往只需要幾個功能鍵,此時,可采用獨(dú)立式按鍵結(jié)構(gòu)。

1.獨(dú)立式按鍵結(jié)構(gòu)9u+L

K5\*x)q%i

獨(dú)立式按鍵是直接用I/O口線構(gòu)成的單個按鍵電路,其特點(diǎn)是每個按鍵單獨(dú)占用一根I/O

左圖獨(dú)立式按鍵電路

口線,每個按鍵的工作不會影響其它I/O口線的狀態(tài)。獨(dú)立式按鍵的典型應(yīng)用如圖7.4所示。*X8f'y+Q,[7F-l

獨(dú)立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O口線,因此,在按鍵較多時,I/O口線浪費(fèi)較大,不宜采用。6Z#m

M*q,s2Y#e/z1F6p2S

圖7.4中按鍵輸入均采用低電平有效,此外,上拉電阻保證了按鍵斷開時,I/O口線有確定的高電平。當(dāng)I/O口線內(nèi)部有上拉電阻時,外電路可不接上拉電阻。

2.獨(dú)立式按鍵的軟件結(jié)構(gòu)1_*b$x

T/z5M2G#l:v&T

獨(dú)立式按鍵軟件常采用查詢式結(jié)構(gòu)。先逐位查詢每根I/O口線的輸入狀態(tài),如某一根I/O口線輸入為低電平,則可確認(rèn)該I/O口線所對應(yīng)的按鍵已按下,然后,再轉(zhuǎn)向該鍵的功能處理程序。圖7.4中的I/O口采用P1口,請讀者自行編制相應(yīng)的軟件。1^!@-w7o:r9}6s

7.1.3矩陣式按鍵

單片機(jī)系統(tǒng)中,若使按鍵較多時,通常采用矩陣式(也稱行列式)鍵盤。

1.矩陣式鍵盤的結(jié)構(gòu)及原理

矩陣式鍵盤由行線和列線組成,按鍵位于行、列線的交叉點(diǎn)上,其結(jié)構(gòu)如下圖所示。#d.n$m(g5G7S

由圖可知,一個4×4的行、列結(jié)構(gòu)可以構(gòu)成一個含有16個按鍵的鍵盤,顯然,在按鍵數(shù)量較多時,矩陣式鍵盤較之獨(dú)立式按鍵鍵盤要節(jié)省很多I/O口。

矩陣式鍵盤中,行、列線分別連接到按鍵開關(guān)的兩端,行線通過上拉電阻接到+5V上。當(dāng)無鍵按下時,行線處于高電平狀態(tài);當(dāng)有鍵按下時,行、列線將導(dǎo)通,此時,行線電平將由與此行線相連的列線電平?jīng)Q定。這是識別按鍵是否按下的關(guān)鍵。然而,矩陣鍵盤中的行線、列線和多個鍵相連,各按鍵按下與否均影響該鍵所在行線和列線的電平,各按鍵間將相互影響,因此,必須將行線、列線信號配合起來作適當(dāng)處理,才能確定閉合鍵的位置。2L%F$r:]'x0N

2.矩陣式鍵盤按鍵的識別

識別按鍵的方法很多,其中,最常見的方法是掃描法。下面以圖7.5中8號鍵的識別為例來說明掃描法識別按鍵的過程。

按鍵按下時,與此鍵相連的行線與列線導(dǎo)通,行線在無鍵按下時處在高電平,顯然,如果讓所有的列線也處在高電平,那么,按鍵按下與否不會引起行線電平的變化,因此,必須使所有列線處在低電平,只有這樣,當(dāng)有鍵按下時,該鍵所在的行電平才會由高電平變?yōu)榈碗娖?。CPU根據(jù)行電平的變化,便能判定相應(yīng)的行有鍵按下。8號鍵按下時,第2行一定為低電平,然而,第2行為低電平時,能否肯定是8號鍵按下呢?回答是否定的,因?yàn)?、10、11號鍵按下同樣使第2行為低電平。為進(jìn)一步確定具體鍵,不能使所有列線在同一時刻都處在低電平,可在某一時刻只讓一條列線處于低電平,其余列線均處于高電平,另一時刻,讓下一列處在低電平,依此循環(huán),這種依次輪流每次選通一列的工作方式稱為鍵盤掃描。采用鍵盤掃描后,再來觀察8號鍵按下時的工作過程,當(dāng)?shù)?列處于低電平時,第2行處于低電平,而第1、2、3列處于低電平時,第2行卻處在高電平,由此可判定按下的鍵應(yīng)是第2行與第0列的交叉點(diǎn),即8號鍵。

3.鍵盤的編碼2D,z&z,\:I.T1s1H2W*H9g

對于獨(dú)立式按鍵鍵盤,因按鍵數(shù)量少,可根據(jù)實(shí)際需要靈活編碼。對于矩陣式鍵盤,按鍵的位置由行號和列號唯一確定,因此可分別對行號和列號進(jìn)行二進(jìn)制編碼,然后將兩值合成一個字節(jié),高4位是行號,低4位是列號。如圖7.5中的8號鍵,它位于第2行,第0列,因此,其鍵盤編碼應(yīng)為20H。采用上述編碼對于不同行的鍵離散性較大,不利于散轉(zhuǎn)指令對按鍵進(jìn)行處理。因此,可采用依次排列鍵號的方式對安排進(jìn)行編碼。以圖7.5中的4×4鍵盤為例,可將鍵號編碼為:01H、02H、03H…0EH、0FH、10H等16個鍵號。編碼相互轉(zhuǎn)換可通過計(jì)算或查表的方法實(shí)現(xiàn)。"a1c/r1R0c+?7d(w)g)n"F

4.鍵盤的工作方式.k3d1W/p#}!N$Z,N1n

在單片機(jī)應(yīng)用系統(tǒng)中,鍵盤掃描只是CPU的工作內(nèi)容之一。CPU對鍵盤的響應(yīng)取決于鍵盤的工作方式,鍵盤的工作方式應(yīng)根據(jù)實(shí)際應(yīng)用系統(tǒng)中CPU的工作狀況而定,其選取的原則是既要保證CPU能及時響應(yīng)按鍵操作,又不要過多占用CPU的工作時間。通常,鍵盤的工作方式有三種,即編程掃描、定時掃描和中斷掃描。

1)編程掃描方式&i$U*H4g4P0Y0l%y

編程掃描方式是利用CPU完成其它工作的空余調(diào)用鍵盤掃描子程序來響應(yīng)鍵盤輸入的要求。在執(zhí)行鍵功能程序時,CPU不再響應(yīng)鍵輸入要求,直到CPU重新掃描鍵盤為止。'c%h$H)}:{9}

鍵盤掃描程序一般應(yīng)包括以下內(nèi)容:

(1)判別有無鍵按下。/B#g"c$B*e:T:C0B/Y

(2)鍵盤掃描取得閉合鍵的行、列值。

(3)用計(jì)算法或查表法得到鍵值。4e0j!h0X9`2Y4b;L

(4)判斷閉合鍵是否釋放,如沒釋放則繼續(xù)等待。.I7s%{0r*`'v4j(Q0u,{

(5)將閉合鍵鍵號保存,同時轉(zhuǎn)去執(zhí)行該閉合鍵的功能。:^'}+\&v&D8o1l

圖7.68155擴(kuò)展I/O口組成的矩陣鍵盤#@4\*v&T5H:j'h+Q$^

圖7.6是一個4×8矩陣鍵盤電路,由圖可知,其與單片機(jī)的接口采用8155擴(kuò)展I/O芯片,鍵盤采用編程掃描方式工作,8155C口的低4位輸入行掃描信號,A口輸出8位列掃描信號,二者均為低電平有效。8155的IO/與P2.0相連,與P2.1相連,、分別與單片機(jī)的、相連。由此可確定8155的口地址為:*m,P)Z0j#M)Q-t9g:L#F

命令/狀態(tài)口:0100H(P2未用口線規(guī)定為0)

A口:0101H$j:O!w)X9y(x9y/Z5K'G+t

B口:0102H)c$g8G)}

Q'N&b

C口:0103H

圖7.6中,A口為基本輸出口,C口為基本輸入口,因此,方式命令控制字應(yīng)設(shè)置為43H。在編程掃描方式下,鍵盤掃描子程序應(yīng)完成如下幾個功能:2x#`*u.~9A#{%m

(1)判斷有無鍵按下。其方法為:A口輸出全為0,讀C口狀態(tài),若PC0~PC3全為1,則說明無鍵按下;若不全為1,則說明有鍵按下。

(2)消除按鍵抖動的影響。其方法為:在判斷有鍵按下后,用軟件延時的方法延時10ms后,再判斷鍵盤狀態(tài),如果仍為有鍵按下狀態(tài),則認(rèn)為有一個按鍵按下,否則當(dāng)作按鍵抖動來處理。

(3)求按鍵位置。根據(jù)前述鍵盤掃描法,進(jìn)行逐列置0掃描。圖7.6中,32個鍵的鍵值分布如下(鍵值由4位16進(jìn)制數(shù)碼組成,前兩位是列的值,即A口數(shù)據(jù),后兩位是行的值,即C口數(shù)據(jù),X為任意值):

FEXEFDXEFBXEF7XEEFXEDFXEBFXE7FXE

FEXDFDXDFBXDF7XDEFXDDFXDBFXD7FXD

FEXBFDXBFBXBF7XBEFXBDFXBBFXB7FXB9`.g4]#p!J"^/q

FEX7FDX7FBX7F7X7EFX7DFX7BFX77FX79b$g9I#^-y,g0B

按鍵鍵值確定后,即可確定按鍵位置。相應(yīng)的鍵號可根據(jù)下述公式進(jìn)行計(jì)算:鍵號=行首鍵號+列號。圖7.6中,每行的行首可給以固定的編號0(00H),8(08H),16(10H),24(18H),列號依列線順序?yàn)?~7。

(4)判別閉合的鍵是否釋放。按鍵閉合一次只能進(jìn)行一次功能操作,因此,等按鍵釋放后才能根據(jù)鍵號執(zhí)行相應(yīng)的功能鍵操作。

鍵盤掃描程序流程圖請參閱實(shí)訓(xùn)7圖7.1中的主程序流程圖。

鍵盤掃描程序請參閱實(shí)訓(xùn)7源程序中的鍵盤查詢程序、鍵盤掃描程序和按鍵查詢子程序三部分。*P,E'e)a-O;g*|

實(shí)訓(xùn)7是矩陣式鍵盤的一種典型應(yīng)用,與圖7.6相比,8155入口地址不同,矩陣鍵盤列數(shù)不同,再就是為兼顧鍵盤和顯示,防抖所用的延時子程序由顯示子程序替代。

2)定時掃描方式:

定時掃描方式就是每隔一段時間對鍵盤掃描一次,它利用單片機(jī)內(nèi)部的定時器產(chǎn)生一定時間(例如10ms)的定時,當(dāng)定時時間到就產(chǎn)生定時器溢出中斷,CPU響應(yīng)中斷后對鍵盤進(jìn)行掃描,并在有鍵按下時識別出該鍵,再執(zhí)行該鍵的功能程序。定時掃描方式的硬件電路與編程掃描方式相同,程序流程圖如下圖所示。

圖中,標(biāo)志1和標(biāo)志2是在單片機(jī)內(nèi)部RAM的位尋址區(qū)設(shè)置的兩個標(biāo)志位,標(biāo)志1為去抖動標(biāo)志位,標(biāo)志2為識別完按鍵的標(biāo)志位。初始化時將這兩個標(biāo)志位設(shè)置為0,執(zhí)行中斷服務(wù)程序時,首先判別有無鍵閉合,若無鍵閉合,將標(biāo)志1和標(biāo)志2置0后返回;若有鍵閉合,先檢查標(biāo)志1,當(dāng)標(biāo)志1為0時,說明還未進(jìn)行去抖動處理,此時置位標(biāo)志1,并中斷返回。由于中斷返回后要經(jīng)過10ms后才會再次中斷,相當(dāng)于延時了10ms,因此,程序無須再延時。下次中斷時,因標(biāo)志1為1,CPU再檢查標(biāo)志2,如標(biāo)志2為0說明還未進(jìn)行按鍵的識別處理,這時,CPU先置位標(biāo)志2,然后進(jìn)行按鍵識別處理,再執(zhí)行相應(yīng)的按鍵功能子程序,最后,中斷返回。如標(biāo)志2已經(jīng)為1,則說明此次按鍵已做過識別處理,只是還未釋放按鍵,當(dāng)按鍵釋放后,在下一次中斷服務(wù)程序中,標(biāo)志1和標(biāo)志2又重新置0,等待下一次按鍵。

3)中斷掃描方式"B!m

k+u;A

采用上述兩種鍵盤掃描方式時,無論是否按鍵,CPU都要定時掃描鍵盤,而單片機(jī)應(yīng)用系統(tǒng)工作時,并非經(jīng)常需要鍵盤輸入,因此,CPU經(jīng)常處于空掃描狀態(tài),為提高CPU工作效率,可采用中斷掃描工作方式。其工作過程如下:當(dāng)無鍵按下時,CPU處理自己的工作,當(dāng)有鍵按下時,產(chǎn)生中斷請求,CPU轉(zhuǎn)去執(zhí)行鍵盤掃描子程序,并識別鍵號。

左圖是一種簡易鍵盤接口電路,該鍵盤是由8051P1口的高、低字節(jié)構(gòu)成的4×4鍵盤。鍵盤的列線與P1口的高4位相連,鍵盤的行線與P1口的低4位相連,因此,P1.4~P1.7是鍵輸出線,P1.0~P1.3是掃描輸入線。圖中的4輸入與門用于產(chǎn)生按鍵中斷,其輸入端與各列線相連,再通過上拉電阻接至+5V電源,輸出端接至8051的外部中斷輸入端。具體工作如下:當(dāng)鍵盤無鍵按下時,與門各輸入端均為高電平,保持輸出端為高電平;當(dāng)有鍵按下時,端為低電平,向CPU申請中斷,若CPU開放外部中斷,則會響應(yīng)中斷請求,轉(zhuǎn)去執(zhí)行鍵盤掃描子程序。.W0t!v+z1i.K4Z.^

這是初學(xué)時寫的最簡單、最詳細(xì)、效率最高的矩陣鍵盤掃描程序,只用了四條常用命令(MOV/送數(shù)、JB/高電平轉(zhuǎn)移、JMP/直接轉(zhuǎn)移、RET/子程序返回),保證初學(xué)者一看就懂!本程序已經(jīng)在本站電子實(shí)驗(yàn)板上驗(yàn)證通過,占用CPU時間少,效率高,被選作單片機(jī)的測試程序!.T9o0v5w/X7G2a

矩陣按鍵掃描程序是一種節(jié)省IO口的方法,按鍵數(shù)目越多節(jié)省IO口就越可觀,本程序的思路跟書上一樣:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫法上,站長采用了最簡單的方法,使得程序效率最高。

本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數(shù)需要,又能節(jié)省大量的CPU時間。另外,本人認(rèn)為鍵盤用延時程序來消除抖動,完全是浪費(fèi)時間。試想,如果不用中斷執(zhí)行(用中斷執(zhí)行需要更多的硬件資源)的方法來掃描鍵盤,每秒鐘掃描20-100次,每次都要延時10-20MS的話,我們的單片機(jī)還有多少時間做正事呢?0I!u3N*Q8z4Z,j

其實(shí),延時的這段時間,CPU可以做其它的事呀。所以,本鍵盤掃描程序的前面后面都可以加入少少代碼,既可以達(dá)到完美的消抖動效果,又可以擴(kuò)展其它的功能(例如按鍵封鎖、按鍵長按等按鍵功能復(fù)用?。?/p>

本鍵盤掃描子程序名叫key,每次要掃描時用callkey調(diào)用即可。以下子程序內(nèi)容:

key:movp0,#00001111b;上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下9E)V;P'U&v+n-j!p

jmpk10;跳到K10處開始掃描,這里可以改成其它條件轉(zhuǎn)移指令來決定本次掃描是否要繼續(xù),例如減1為0轉(zhuǎn)移或者位為1或0才轉(zhuǎn)移,這主要用來增加功能,確認(rèn)上一按鍵功能是否完成?是否相當(dāng)于經(jīng)過了延時?是否要封鎖鍵盤?

goend:jmpkend;如果上面判斷本次不執(zhí)行鍵盤掃描程序,則立即轉(zhuǎn)到程序尾部,不要浪費(fèi)CPU的時間1a:K0@6m!?3r(?

k10:jbp0.0,k20;掃描正式開始,先檢查列1四個鍵是否有鍵按下,如果沒有,則跳到K20檢查列2

k11:movp0,#11101111b;列1有鍵按下時,P0.0變低,到底是那一個鍵按下?現(xiàn)在分別輸出各行低電平5g$P;s0F#|1t8u

jbp0.0,k12;該行的鍵不按下時,p0.0為高電平,跳到到K12,檢查其它的行:x+W%R0z5Q+a#@6J%R!v

movr1,#1;如果正好是這行的鍵按下,將寄存器R0寫下1,表示1號鍵按下了%S8S&g3c;j!I

k12:movp0,#11011111b/g

x1t"P"G-V3b

jbp0.0,k13

movr1,#2;如果正好是這行的鍵按下,將寄存器R0寫下2,表示2號鍵按下了/g6Y#g/K;R,k&c

k13:movp0,#10111111b(d(b!}/|!i){

jbp0.0,k14

movr1,#3;如果正好是這行的鍵按下,將寄存器R0寫下3,表示3號鍵按下了)|#I-u/g.s-W7A7?

k14:movp0,#01111111b/Y"[)S5W5v!G

r9O'n

jbp0.0,kend;如果現(xiàn)在四個鍵都沒有按下,可能按鍵松開或干擾,退出掃描(以后相同)

movr1,#4如果正好是這行的鍵按下,將寄存器R0寫下4,表示4號鍵按下了

jmpkend;已經(jīng)找到按下的鍵,跳到結(jié)尾吧

k20:jbp0.1,k30;列2檢查為高電平再檢查列3、42F+J8V+J&U$Q%`

L;}

k21:movp0,#11101111b;列2有健按下時,P0.0會變低,到底是那一行的鍵按下呢?分別輸出行的低電平1q9O4\:m5a4u#C7v

jbp0.1,k22;該行的鍵不按下時p0.0為高電平,跳到到K22,檢查另外三行5m%^*n8_.Z:Z%d.R0o6s

movr1,#5;如果正好是這行的鍵按下,將寄存器R0寫下5,表示5號鍵按下了(以后相同,不再重復(fù)了)7C:q0q/C7`*|

k22:movp0,#11011111b

jbp0.1,k23!F4z0m6i3@*]!w#S(j&X

movr1,#62S"@5z4j!i*|5@

k23:movp0,#10111111b(T3T1r#?1b.U,E1o

jbp0.1,k241A9P:X"V!d4n0F:}

movr1,#7

k24:movp0,#01111111b.]9j$K"J-W4_-`

jbp0.1,kend1i

]0_$c;`"L*`

movr1,#8.g%g9e1b2D.D1D+b

jmpkend;已經(jīng)找到按下的鍵,跳到結(jié)尾吧(以后相同,不要重復(fù)了)!`'c2m5k4|;U

k30:jbp0.2,k40

k31:movp0,#11101111b

jbp0.2,k32

movr1,#9

k32:movp0,#11011111b;U0m2z;n4p;v*z

jbp0.2,k33

movr1,#10(l%D/Q*q*X5p'~0Z4Z

k33:movp0,#10111111b

jbp0.2,k34

movr1,#11

k34:movp0,#01111111b

jbp0.2,kend

movr1,#125y:p2B$K+l.z(c

jmpkend

k40:jbp0.3,kend,O&\,S3a:\

V

i

k41:movp0,#11101111b*r%c1a.J!h-k

jbp0.3,k42

movr1,#138R&A0A9_0`7h1@9a

k42:movp0,#11011111b*i&R'P

T-A-n

jbp0.3,k43

movr1,#14*_/Q#j)@3~7C3L

k43:movp0,#10111111b

jbp0.3,k44%@1n:t!M8]!`*o3Y

movr1,#152c)@&h-H,G;^2J;R

k44:movp0,#01111111b,p%c/s:B*d

jbp0.3,kend

movr1,#161m6e"~/h7V*n$H%Z-{

kend:ret

鍵盤掃描結(jié)束了,寄存器R1的值就直接表示了是那個鍵按下的,根據(jù)不同的鍵值去執(zhí)行不同的程序,從而實(shí)現(xiàn)了十六個矩陣鍵盤掃描,同樣原理,最多可以識別255個按鍵的矩陣掃描。&P$]8u'}%^

?3\

我們可以每次鍵盤掃描開始時檢查R0的值是否為0,只有在為0才掃描鍵盤,不為0就證明剛剛掃描過鍵值,相應(yīng)的按鍵工作還沒有完成。但是必須記得,每個按鍵命令執(zhí)行完成后,要給R0寫上0,表示可以掃描鍵盤。

本鍵盤掃描程序的優(yōu)點(diǎn)在于:不用專門的按鍵延時程序,提高了CPU效率,也不用中斷來掃描鍵盤,節(jié)省了硬件資源。另外,本鍵盤掃描程序,每次掃描占用CPU時最短,不論有鍵按下或者無鍵按下都可以在很短的時間完成一次掃描。9月17日鍵盤是一組按鍵的組合,它是最常用的單片機(jī)輸入設(shè)備,操作人員可以通過鍵盤輸入數(shù)據(jù)或命令,實(shí)現(xiàn)簡單的人機(jī)對話。單片機(jī)使用的鍵盤是一種常開型的開關(guān),通常鍵的兩個觸點(diǎn)處于斷開狀態(tài),按下鍵時它們才閉合。鍵盤分編碼和非編碼鍵盤,鍵盤的識別可用軟件識別也可用專用芯片識別。

MCS-51單片機(jī)擴(kuò)展鍵盤接口的方法用很多,從硬件結(jié)構(gòu)上,可通過單片機(jī)I/0接口擴(kuò)展鍵盤,也可通過擴(kuò)展I/O接口設(shè)計(jì)鍵盤,還有些用的是專用鍵盤芯片。1.鍵盤的工作原理:

鍵盤從結(jié)構(gòu)上分為獨(dú)立式鍵盤與矩陣式鍵盤。一般按鍵較少時采用獨(dú)立式鍵盤,按鍵較多時采用矩陣式鍵盤。

(1)

獨(dú)立式鍵盤。

在由單片機(jī)組成的測控系統(tǒng)及智能化儀器中,用的最多的是獨(dú)立式鍵盤。這種鍵盤具有硬件與軟件相對簡單的特點(diǎn),其缺點(diǎn)是按鍵數(shù)量較多時,要占用大量口線。圖1是一個利用MCS-51單片機(jī)的P1口設(shè)計(jì)的非編碼鍵盤。

圖1

獨(dú)立式鍵盤

當(dāng)按鍵沒按下時,CPU對應(yīng)的I/O接口由于內(nèi)部有上拉電阻,其輸入為高電平;當(dāng)某鍵被按下后,對應(yīng)的I/O接口變?yōu)榈碗娖健V灰诔绦蛑信袛郔/O接口的狀態(tài),即可知道哪個鍵處于閉合狀態(tài)。以下是非編碼鍵盤鍵處理子程序。JNB

P1.0,

KEY00

;轉(zhuǎn)按鍵1處理程序JNB

P1.1,

KEY01

;轉(zhuǎn)按鍵1處理程序JNB

P1.2,

KEY02

;轉(zhuǎn)按鍵1處理程序JNB

P1.3,

KEY03

;轉(zhuǎn)按鍵1處理程序JNB

P1.4,

KEY04

;轉(zhuǎn)按鍵1處理程序JNB

P1.5,

KEY05

;轉(zhuǎn)按鍵1處理程序JNB

P1.6,

KEY06

;轉(zhuǎn)按鍵1處理程序JNB

P1.7,

KEY07

;轉(zhuǎn)按鍵1處理程序RET

;無鍵按下,返回

KEY00:

RET

KEY01:

RET

…(2)

矩陣式鍵盤。

矩陣式鍵盤使用于按鍵數(shù)量較多的場合,它由行線與列線組成,按鍵位于行、列的交叉點(diǎn)上。一個3*3的行列結(jié)構(gòu)可以構(gòu)成一個有9個按鍵的鍵盤。同理,一個4*4的行列可以構(gòu)成一個16按鍵的鍵盤。很明顯,在按鍵數(shù)量較多的場合,與獨(dú)立式鍵盤相比,矩陣式鍵盤要節(jié)省很多I/0接口。

2.鍵盤按鍵識別方法(1)掃描法。下面以圖2的K2鍵按下為例,說明此鍵是如何識別出來的。

圖2

8031與鍵盤連接

掃描法有行掃描和列掃描兩種,無論采用哪種,無論采用哪種,其效果是一樣的,只是在程序中的處理方法有所區(qū)別。下面以列掃描法為例來介紹掃描法識別按鍵的方法。首先在鍵處理程序中將P1.4-P1.7依次按位變低,P1.4-P1.7在某一時刻只有一個為低。在某一位為低時讀行線,根據(jù)行線的狀態(tài)即可判斷出哪一個按鍵被按下。如2號鍵按下,當(dāng)列線P1.5為低時,讀回的行線狀態(tài)中P1.0被拉低,由此可知K2鍵被按下。一般在掃描法中分兩步處理按鍵,首先是判斷有無鍵按下,如行線有一個為低,則有鍵按下。當(dāng)判斷有鍵按下時,使列線依次變低,讀行線,進(jìn)而判斷出具體哪個鍵被按下。(2)線反轉(zhuǎn)法。

掃描法是逐行或逐列掃描查詢,當(dāng)被按下的鍵處于最后一列時,要經(jīng)過多次掃描才能最后獲得此按鍵所處的行列值。而線反轉(zhuǎn)法則顯的簡練,無論被按的鍵處于哪列,均可經(jīng)過兩步即能獲得此按鍵所在的行列值,仍以圖4.38為例來介紹線反轉(zhuǎn)法。

首先將行線P1.0-P1.3作為輸入線,列線P1.4-P1.7作為輸出線,并且輸出線輸出全為低電平,讀行線狀態(tài),則行線中電平為低的是按鍵所在的行。然后將列線作為輸入線,行線作為輸出線,并將輸出線輸出為低電平,讀列線狀態(tài),則列線是電平為低的是按鍵所在的列。綜合上述兩步結(jié)果,確定按鍵所在的行和列,從而識別出所按下的鍵。

假設(shè)10號鍵被按下,在第一步P1.3-P1.0全為低電平時,讀P1.4-P1.7的值,則P1.5為低電平;在第二步P1.4-P1.7輸出全為低電平時,讀P1.3-P1.0時,P1.2為低電平。由此可判斷第3行第2列有鍵被按下,此鍵就是K10鍵。

3.鍵盤的接口電路

設(shè)計(jì)MCS-51單片機(jī)鍵盤時可根據(jù)單片機(jī)系統(tǒng)的實(shí)際情況來靈活處理。在使用內(nèi)部有程序存儲器的單片機(jī)時,如單片機(jī)的I/O接口夠用,可直接利用單片機(jī)的I/O接口連接鍵盤。如果I/O接口不夠用,可利用擴(kuò)展I/O接口連接鍵盤,有時也可使用專用的鍵盤接口芯片。

(1)

利用單片機(jī)的I/O接口連接鍵盤。

利用MCS-51單片機(jī)的I/O接口連接鍵盤時分兩種情況,一是當(dāng)P0、P1、P2、P3均為普通輸入/輸出時,可使用任意I/0接口連接鍵盤;二是當(dāng)單片機(jī)系統(tǒng)擴(kuò)展程序存儲器、數(shù)據(jù)存儲器、I/O時,由于P0、P2作為地址數(shù)據(jù)總線的使用,所以擴(kuò)展鍵盤時只能使用P1口、P3口。如圖2所示為利用MCS-51單片機(jī)的P1口設(shè)計(jì)的4*4矩陣鍵盤。注意如果用P0口設(shè)計(jì)鍵盤,要給P0口各口線提供上拉電阻,其大小一般為2-10kn。(2)

利用擴(kuò)展I/O接口設(shè)計(jì)鍵盤。

MCS-51單片機(jī)在總線擴(kuò)展凡是時由于P0口、P2口分別作為數(shù)據(jù)總線及地址總線,而P1口、P3口又有其他用途時,擴(kuò)展鍵盤可利用擴(kuò)展的I/O接口。利用8255的PC口設(shè)計(jì)的4*4矩陣鍵盤如圖3所示,利用8255的PC口設(shè)計(jì)的編碼鍵盤,PC0-PC3為行輸入,PC4-PC7為列輸出。

圖3

8255與鍵盤連接圖

(3)

按鍵去抖。

由于通常的按鍵所用的開關(guān)是機(jī)械開關(guān),當(dāng)開關(guān)閉合、斷開時并不是馬上穩(wěn)定地接通和斷開,而是在閉合與斷開瞬間均伴隨有一連串的抖動。為了確保CPU對鍵的一次閉合僅做一次處理,必須要在程序或硬件上進(jìn)行防抖處理。為節(jié)省硬件,通常在單片機(jī)系統(tǒng)中,一般不采用硬件方法消除鍵的抖動,而是用軟件消抖方法。即檢測鍵閉合后延時5-10ms,讓前延抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)真正有鍵按下。當(dāng)檢測到按鍵釋放后,也要給5-10ms的延時,待后延抖動消失后才轉(zhuǎn)入該鍵處理程序。以下是具有消抖功能的鍵程序,只有按鍵按下再放開后才做一次鍵處理。

KEY_00:

JB

P1.0,

KEY_01

;無鍵按下,查下一個鍵

LCALL

DELAY

;延時10ms

JNB

P1.0,

$

;鍵一直按下,等待

LCALL

DELAY

;鍵松開,延時10ms

JB

P1.0,

KEY_00

;一次按鍵完成,轉(zhuǎn)鍵盤處理程序KEY_01:…

RET(4)

鍵盤的編碼。

對于獨(dú)立式按鍵鍵盤,由于按鍵數(shù)目較少,可根據(jù)實(shí)際情況靈活編碼。對于矩陣式鍵盤,按鍵的位置由行號和列號唯一確定,所以分別對行號與列號進(jìn)行二進(jìn)制編碼,然后將兩值合成一個字節(jié),高4位是行號,低4位是列號。如10號鍵被按下時,列號讀回的值為1011,行號讀回的值為1101,此兩值合成為11011011=0DBH,據(jù)此值可轉(zhuǎn)到10號鍵處理程序。這種方式雖然簡單,但其離散性很大,在讀程序時必須要結(jié)合硬件電路。也可將讀回的鍵值按一定的方式運(yùn)算后,算出對應(yīng)的鍵值進(jìn)行散轉(zhuǎn),但這樣會增加程序的工作量,因而大多數(shù)單片機(jī)系統(tǒng)在鍵盤處理程序中只根據(jù)讀回的鍵值進(jìn)行散轉(zhuǎn)。

(5)

常用的專用鍵盤芯片。

無論是利用CPU的I/O接口擴(kuò)展鍵盤,還是利用擴(kuò)展I/O芯片擴(kuò)展鍵盤,由于均是用普通I/O接口擴(kuò)展,如果要在單片機(jī)的

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論