- UID
- 852722
|
三个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;} |
|