专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

三个I/O口实现的3*4矩阵按键程序

作者:佚名   来源:本站原创   点击数:  更新时间: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;
//先读三个接地按键
P6CR|=0xe0;//PORT端口控制寄存器
delay8nop();
keybuf1=PORT6&0xe0;
if(keybuf1!=0xe0)gnd=1;//有接地按键按下
else{
//正向导通测试
//测试Z12,12正向导通测试
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正向导通

//测试Z23,23正向导通
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口正向导通
 
//测试Z31,31正向导通
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正向导通

//反向导通测试
//测试F12,12反向导通
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反向导通

//测试F23,23反向导通
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反向导通

//测试F31,31反向导通
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反向导通
}
//按键识别
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://测试Z12,12正向导通测试
       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://测试Z23,23正向导通
       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://测试Z31,31正向导通
       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://测试F12,12反向导通
       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://测试F23,23反向导通
       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://测试F31,31反向导通
       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://测试Z12,12正向导通测试
       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;
       //测试F12,12反向导通
       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: //测试Z23,23正向导通
       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;
       //测试F23,23反向导通
       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://测试Z31,31正向导通
       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;
       //测试F23,23反向导通
       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;}
关闭窗口

相关文章