![]() |
------------------------------------ P1.0 P1.1 P1.2 P1.3 p1.4 S1 S5 S9 S13 P1.5 S2 S6 S10 S14 P1.6 S3 S7 S11 S15 P1.7 S4 S8 S12 S16 ------------------------------------ 實現原理: 當高電平端口與低電平端口短接時,高電平端口會被拉成低電平 ------------------------ 算法分析: 1,檢查是否有鍵按下: P1=f0h (即0-3置1,4-7置0) 檢查P1口是否是0F0H 是,則無鍵按下 否,則有鍵按下 2,掃描按下的鍵值: 循環(依次將4至7口單獨置0) 檢查0-3口是否有低電平端 確定被按下的鍵 返回鍵值 3,鍵盤防抖: 抖動原因:鍵按下時,會產生電壓的波動,持續約10MS 去抖方法:10MS掃描一次,使前后兩次均有鍵按下 ********************************************************/ #include<ytc51.h> uchar jps,ks; //鍵盤緩存 /*鍵盤掃描程序1,檢查是否有按鍵*/ uchar keyfun() { uchar key_c; P2 = P2 & 0x03; P2 = P2 | 0x3c; key_c = P2; if((key_c & 0xfc) == 0x3c) return (0); else return(1); } /*鍵盤掃描程序2,確定按鍵數值*/ uchar keyscan() { uchar i,k; P2 = P2 & 0x03; P2 = P2 | 0xbc; if((P2 & 0x3c) != 0x3c) { i = 0; k = (~P2) & 0x3c; } else { P2 = P2 & 0x03; P2 = P2 | 0x7c; if((P2 & 0x3c) != 0x3c) { i = 1; k = (~P2) & 0x3c; } } k = k>>3; if( k==4 ) k=3; k=i*4+k+1; return(k); } /********************************************************************** 函數功能: 定時器中斷函數(掃描鍵盤)(10ms 16位定時) 入口參數: 無 出口參數: 無 ***********************************************************************/ void Time0_Func() interrupt 3 /*當定時器中斷時執行此函數*/ { TH1=(0xffff-9259)/256; /*T0初始化*/ TL1=(0xffff-9259)%256; WR = 1; if((ks == 0) && ( keyfun() )) { jps = keyscan(); } ks = keyfun(); } /********************************************************************** 函數功能: 上電初始化函數 入口參數: 無 出口參數: 無 ***********************************************************************/ void Power_Up(void) { TMOD = 0x10;/*Time0/1為16計數器*/ TH1=(0xffff-9216)/256;/*10ms*/ TL1=(0xffff-9216)%256;/*10ms*/ TR1=1; SCON = 0x00;//串口工作模式設置 IE=0x88; /*EA=1 ET1=1*/ P0=0xff; P2=0xff; } |