|
------------------------------------ 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; } |