利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵及鍵值轉(zhuǎn)換詳解_第1頁(yè)
利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵及鍵值轉(zhuǎn)換詳解_第2頁(yè)
利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵及鍵值轉(zhuǎn)換詳解_第3頁(yè)
利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵及鍵值轉(zhuǎn)換詳解_第4頁(yè)
利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵及鍵值轉(zhuǎn)換詳解_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、利用反轉(zhuǎn)法進(jìn)行矩陣式按鍵掃描及鍵值轉(zhuǎn)換詳解/*/工 程 名:鍵盤(pán)實(shí)驗(yàn) */工程描述: 在實(shí)驗(yàn)板上連接小鍵盤(pán)接口的連線,采用反轉(zhuǎn)法(查詢方式)識(shí)別小鍵盤(pán)上按下的各鍵,/ 并將其對(duì)應(yīng)的按鍵狀態(tài)用八個(gè)發(fā)光二極管來(lái)顯示,并在超級(jí)終端上顯示。 /注 意:本程序?qū)崿F(xiàn)的硬件平臺(tái)為MC9S12XDP512應(yīng)用開(kāi)發(fā)平臺(tái)。應(yīng)用開(kāi)發(fā)平臺(tái)使用16MHZ的有源晶振 */說(shuō) 明:程序使用的片上系統(tǒng)時(shí)鐘頻率,總線時(shí)鐘由鎖相環(huán)產(chǎn)生,總線時(shí)鐘為片上系統(tǒng)時(shí)鐘的/ 一半,其換算的公式為:fpllclk=2 * fosclk *(SYNR+1)/(REFDV+1)/ 其中fosclk為振蕩器頻率,SYNR為時(shí)鐘合成寄存器的值,REF

2、DV為時(shí)鐘分頻寄存器的值/*/#include /* common defines and macros */#include /* derivative information */#pragma LINK_INFO DERIVATIVE mc9s12xdp512void SCI_Init(void);void dely(void);unsigned char KeyDecoe(unsigned char i);void put_char(unsigned char c);void MCUInit(void) asm sei SYNR = 0x02; /時(shí)鐘合成寄存器 REFDV = 0x0

3、1; /時(shí)鐘分頻寄存器 /鎖相環(huán)產(chǎn)生的時(shí)鐘頻率f=2*foscclk*(SYNR+1)/(REFDV+1) /對(duì)于S12XDP512 16MHz外部晶體振蕩器,總線時(shí)鐘為24MHz /片內(nèi)系統(tǒng)時(shí)鐘為48MHz /*等待鎖相環(huán)頻率鎖定*/ while(CRGFLG & 0x08) !=0x08); CLKSEL |= 0x80; /時(shí)鐘選擇寄存器 asm clivoid main(void) unsigned char x,y,k; unsigned char KB_Value; MCUInit(); /初始化系統(tǒng)時(shí)鐘 SCI_Init(); DDRB=0XFF; PORTB=0XFF; for

4、(;) DDRA=0xff; /將A口設(shè)置為輸出狀態(tài) PORTA=0x0f;/PA7.PA4輸出0,PA3.PA0輸出1 /這時(shí)按鍵的電平狀態(tài) / | | | | / | 1 |2 |3 |4 / 0 PA4-|-|-|-|- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16 / 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 DDRA=0X0f; /PA7.PA4設(shè)置為輸入,PA3.PA0設(shè)置為輸出 asm NOP /空指令 延時(shí)用 a

5、sm NOP /空指令 延時(shí)用 x=PORTA; /取按鍵值(行值) /例如: / 下圖 A B C D 任意位置有按下下的按鍵,也就是PA4和PA0或PA1或PA2或PA3接一塊了, / 又因?yàn)镻A7.PA4為輸入,那么,這時(shí)PA0或PA1或PA2或PA3輸出的1就被PA4讀入, / 也就是說(shuō)單片機(jī)能夠判斷出:PA4這一條橫線上有按鍵按下; / | | | | / | 1 |2 |3 |4 / 0 PA4-A-B-C-D- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16

6、/ 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 /這樣檢測(cè)到PA4有按鍵按下了,即PA4=1; PA5=0;PA6=0;PA7=0; x&=0Xf0;/判斷取的按鍵是否取到值(即是否有鍵按下) /這時(shí)x=0x10; (即二進(jìn)制的 0001 0000) if(x)/如果行上檢測(cè)到有按鍵按下了,再進(jìn)去檢測(cè)按下的按鍵在哪一列上 dely();/經(jīng)過(guò)一個(gè)小延時(shí),再進(jìn)行檢測(cè) DDRA=0xff; /將A口設(shè)置為輸出狀態(tài) PORTA=0Xf0;/PA7.PA4輸出1,PA3.PA0輸出0 /這時(shí)按鍵的電平狀態(tài) / | | | | / | 1 |2 |3 |4 /

7、1 PA4-|-|-|-|- / | 5 |6 |7 |8 / 1 PA5-|-|-|-|- / | 9 |10 |11 |12 / 1 PA6-|-|-|-|- / |13 |14 |15 |16 / 1 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 0 0 0 0 DDRA=0Xf0;/PA7.PA4設(shè)置為輸出,PA3.PA0設(shè)置為輸入 asm NOP /空指令 延時(shí)用 asm NOP /空指令 延時(shí)用 asm NOP /空指令 延時(shí)用 asm NOP /空指令 延時(shí)用 /例如: / 下圖 A 位置的按鍵按下,也就是PA4和PA0接一塊了, / 又因?yàn)镻A3.PA0為輸

8、入,那么,這時(shí)PA4輸出的1就被PA0讀入, / 也就是說(shuō)單片機(jī)能夠判斷出:PA0這一條縱線上有按鍵按下; / | | | | / | 1 |2 |3 |4 / 0 PA4-A-|-|-|- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16 / 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 y=PORTA; /取按鍵值(列值) /這樣檢測(cè)到PA3有按鍵按下了,即PA0=1; PA1=0;PA2=0;PA3=0; y=y&0x0f; /判

9、斷取的按鍵是否取到值(即是否有鍵按下) /這時(shí)y=0x01; (即二進(jìn)制的 0000 0001) if(y) KB_Value=y|x; /(列行合成的值) /x與y相或之后,得到的 KB_Value=0x10 | 0x01 = 0x11;(即 0001 0001)/ PORTB=KB_Value; /對(duì)應(yīng)燈亮 k=KeyDecoe(KB_Value);/鍵值轉(zhuǎn)換 /運(yùn)行完上面這個(gè)函數(shù),回來(lái)的值就是 k=1;即判斷到A處的1號(hào)按鍵按下。 /OK,其他案件同理可得。 /自己分析下吧。 PORTB=k; /對(duì)應(yīng)燈亮 put_char(k); /鍵值顯示,在超級(jí)終端上的顯示 put_char( );

10、 else else void SCI_Init(void) unsigned char t; /定義波特率Bt=9600,SCI0BD=fBUS/(16*Bt) SCI0BDL = 0x9c; /須先給低8位賦值 SCI0BDH = 0x00; /再給高8位賦值 SCI0CR1 = 0x00; /設(shè)置允許SCI,正常碼輸出,8位數(shù)據(jù),無(wú)校驗(yàn) t = SCI0DRL; /讀數(shù)據(jù)寄存器(清0) t = SCI0SR1; /讀狀態(tài)寄存器(清0) SCI0CR2 = 0x2C; /允許SCI0接收和發(fā)送 查詢方式void put_char(unsigned char c) /母板鍵盤(pán)上輸入while

11、 (SCI0SR1 & 0X80)=0);/當(dāng)D7=1時(shí),說(shuō)明要發(fā)送的數(shù)據(jù)已經(jīng)移入移位寄存器 /數(shù)據(jù)寄存器為空,可以發(fā)送新的數(shù)據(jù)SCI0DRL=c;void dely(void) /延時(shí) int i,k; for(i=1;i900;i+) for(k=1;k600;k+) unsigned char KeyDecoe(unsigned char KB_Value) /鍵碼轉(zhuǎn)換 unsigned char KeyPress; KeyPress=0x00; switch(KB_Value) case(0X11): KeyPress=0x01;break; case(0X12): KeyPress=

12、0x02;break; case(0X14): KeyPress=0x03;break; case(0X18): KeyPress=0x04;break; case(0X21): KeyPress=0x05;break; case(0X22): KeyPress=0x06;break; case(0X24): KeyPress=0x07;break; case(0X28): KeyPress=0x08;break; case(0X41): KeyPress=0x09;break; case(0X42): KeyPress=0x0A;break; case(0X44): KeyPress=0x0B;break; case(0X48): KeyPress=0

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論