首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

三个I/O口矩阵按键源程序

三个I/O口矩阵按键源程序

三个I/O口矩阵按键源程序
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;}
返回列表