自以為是神馬卻怎奈是一片浮云,卻想知道,倒底是神馬還是浮云。——劉翔。 uchar buttion(void)//按鍵讀寫程序 {uchar keybuf1=0x00,keybuf2=0x00,keysta=0x00; bit zz=0,z12=0,z23=0,z31=0, ff=0,f12=0,f23=0,f31=0,gnd=0; //先讀三個(gè)接地按鍵 P6CR|=0xe0;//PORT端口控制寄存器 delay8nop(); keybuf1=PORT6&0xe0; if(keybuf1!=0xe0)gnd=1;//有接地按鍵按下 else{ //正向?qū)y(cè)試 //測(cè)試Z12,12正向?qū)y(cè)試 P6CR&=0x9f;//置23口為輸出口 10011111 P6CR|=0x80;//置1口為輸入口 10000000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P67==0){z12=1;zz=1;keysta+=0x01;}//12正向?qū)? //測(cè)試Z23,23正向?qū)?P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xdf;//3口清0 11011111 PORT6|=0x80;//1口置1 10000000 delay8nop(); if(P66==0){z23=1;zz=1;keysta+=0x02;}//23口正向?qū)? //測(cè)試Z31,31正向?qū)?P6CR&=0x3f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x40;//2口置1 01000000 delay8nop(); if(P65==0){z31=1;zz=1;keysta+=0x04;}//31正向?qū)? //反向?qū)y(cè)試 //測(cè)試F12,12反向?qū)?P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P66==0){f12=1;ff=1;keysta+=0x08;}//12反向?qū)? //測(cè)試F23,23反向?qū)?P6CR&=0x9f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P65==0){f12=1;ff=1;keysta+=0x10;}//23反向?qū)? //測(cè)試F31,31反向?qū)?P6CR&=0x9f;//置23口為輸出口 10011111 P6CR|=0x80;//置1口為輸入口 10000000 PORT6&=0xdf;//3口清0 11011111 PORT6|=0x20;//2口置1 delay8nop(); if(P67==0){f31=1;ff=1;keysta+=0x20;}//31反向?qū)?} //按鍵識(shí)別 if(gnd==1) {P6CR|=0xe0;//PORT端口控制寄存器 delay8nop(); keybuf2=PORT6&0xe0; if(keybuf1==keybuf2) {switch(keybuf1) {case 0x80:return 0x01;break; case 0x40:return 0x04;break; case 0x20:return 0x08;break; default:return 0xff; } } else return 0xff;//接地三鍵按下 } else//接地按鍵沒有按下 {switch(keysta) {case 0x01://測(cè)試Z12,12正向?qū)y(cè)試 P6CR&=0x9f;//置23口為輸出口 10011111 P6CR|=0x80;//置1口為輸入口 10000000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P67==0)return 0x02; else return 0xff;break; case 0x02://測(cè)試Z23,23正向?qū)? P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xdf;//3口清0 11011111 PORT6|=0x80;//1口置1 10000000 delay8nop(); if(P66==0)return 0x05; else return 0xff;break; case 0x04://測(cè)試Z31,31正向?qū)? P6CR&=0x3f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x40;//2口置1 01000000 delay8nop(); if(P65==0)return 0x08; else return 0xff;break; case 0x08://測(cè)試F12,12反向?qū)? P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P66==0)return 0x03; else return 0xff;break; case 0x10://測(cè)試F23,23反向?qū)? P6CR&=0x9f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P65==0)return 0x06; else return 0xff; case 0x20://測(cè)試F31,31反向?qū)? P6CR&=0x9f;//置23口為輸出口 10011111 P6CR|=0x80;//置1口為輸入口 10000000 PORT6&=0xdf;//3口清0 11011111 PORT6|=0x20;//2口置1 delay8nop(); if(P67==0)return 0x09; else return 0xff; case 0x09://測(cè)試Z12,12正向?qū)y(cè)試 z12=0; P6CR&=0x9f;//置23口為輸出口 10011111 P6CR|=0x80;//置1口為輸入口 10000000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P67==0)z12=1; //測(cè)試F12,12反向?qū)? f12=0; P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P66==0)f12=1; if((z12==1)&(f12==1))return 0x0a; else return 0xff;break; case 0x12: //測(cè)試Z23,23正向?qū)? z23=0; P6CR&=0x5f;//置13口為輸出口 01011111 P6CR|=0x40;//置2口為輸入口 01000000 PORT6&=0xdf;//3口清0 11011111 PORT6|=0x80;//1口置1 10000000 delay8nop(); if(P66==0)z23=1; //測(cè)試F23,23反向?qū)? f23=0; P6CR&=0x9f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P65==0)f23=1; if((z23==1)&(f23==1))return 0x00; else return 0xff; case 0x24://測(cè)試Z31,31正向?qū)? z31=0; P6CR&=0x3f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//1口清0 01111111 PORT6|=0x40;//2口置1 01000000 delay8nop(); if(P65==0)z31=1; //測(cè)試F23,23反向?qū)? P6CR&=0x9f;//置12口為輸出口 00111111 P6CR|=0x80;//置3口為輸入口 00100000 PORT6&=0xbf;//2口清0 10111111 PORT6|=0x20;//3口置1 00100000 delay8nop(); if(P65==0)f31=1; if((z31==1)&(f31==1))return 0x0b; else return 0xff; default:return 0xff;break; } } return 0xff;}