/******************************************************** * * 4*3矩阵按键读写函数 * ********************************************************/ //按键读写程序 //行1 P65//行2 P62//行3 P51//行4 P67 P5:1 P6:257 //列1 P63//列2 P64//列3 P66 //按键解码 //行4:0,1,2;行1:3,4,5;行3:6,7,8;行2:9,10,11; //*0# 123 789 456 const uchar key_rel[]={0x0a,0x00,0x0b,0x01,0x02, 0x03,0x07,0x08,0x09,0x04,0x05,0x06}; void scan_key(void) {uchar i; keybuf=0xff; get_bit=0; /*方法一:行输出,列输入,影响AT24C02,led闪烁 //睡眠唤醒,欠压检测,声光指示的端口方向不需改动 //行输出0 //P5CR&=0x0d;//0000 1101初始化P5全为输出口 P5CR=0xf0; P6CR&=0x5b;//0101 1011 //列输入1 P6CR|=0x58;//0101 1000/ //方法二:列输出,行输入,列1串10K,输出不了低电平可能识别不了 //不会影响AT24C02,led指示,其它操作需要从新定义端口方向 //列输出0 P6CR&=0xa7;//1010 0111 //行输入1 P5CR|=0x02;//0000 0010 P6CR|=0xa4;//1010 1000*/ /*方法三:先使用方法二扫描列,最后列1单独读写 //列1读写实验 P5CR=0xf0; P6CR&=0x5b;//0101 1011 //列输入1 P6CR|=0x58;//0101 1000/ KH1=0;KH2=0;KH3=0;KH4=0; if(KL1==0)keybuf=0x01;//列1有按键按下 while(KL1==0); //列23,读写*/ //按键读写程序终结版,低电平扫行2,行全拉低 //行输出0 P6CR&=0x5b;//0101 1011 //列输入1 P6CR|=0x58;//0101 1000/ for(i=0;i<4;i++) {switch(i) {//无AT24C02操作尽量不开启KH4给AT24C02供电 case 0:KH1=1;KH2=1;KH3=1;KH4=0;break;//扫描行四 case 1:KH1=0;KH2=1;KH3=1;KH4=0;break;//扫描行一 case 2:KH1=1;KH2=1;KH3=0;KH4=0;break;//扫描行三 //最后扫描红绿LED公共端,全部拉低,全扫描无LED点亮 case 3:KH1=0;KH2=0;KH3=0;KH4=0;break;//扫描行二 } delay(200); if(KL1==0){keybuf=0x00;get_bit=1;break;} if(KL2==0){keybuf=0x01;get_bit=1;break;} if(KL3==0){keybuf=0x02;get_bit=1;break;} } if(get_bit==1)//获取按键值 {get_bit=0; //延时去除抖动 //delay(250);// //扫描状态已经保存 switch(keybuf) {case 0x00:if(KL1==0)get_bit=1;;break; case 0x01:if(KL2==0)get_bit=1;;break; case 0x02:if(KL3==0)get_bit=1;;break; default:keybuf=0xff; } if(get_bit==1) {keybuf=i+i+i+keybuf;//解码按键 i=key_rel[keybuf];//解码按键 keybuf=i;//获取按键值 //按键声光指示 buzzer(); //等待按键弹起 KH1=0;KH2=0;KH3=0;KH4=0; delay(80); while((KL1&&KL2&&KL3)==0); } else keybuf=0xff; } else keybuf=0xff;//无效按键 //行2读写无效分析 //TCC引脚下CONT指令0x0* } /******************************************************** * * END key_scan * ********************************************************/