專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

三個(gè)I/O口實(shí)現(xiàn)的3*4矩陣按鍵程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年03月26日   【字體:
自以為是神馬卻怎奈是一片浮云,卻想知道,倒底是神馬還是浮云。——劉翔。

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;}
關(guān)閉窗口

相關(guān)文章