三个I/O口实现的3*4矩阵按键程序
时间:08-24
来源:互联网
点击:
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=PORT60xe0;
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=PORT60xe0;
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;}
{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=PORT60xe0;
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=PORT60xe0;
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;}
- STM32F0 驱动GPIO口输出(12-02)
- STC单片机I/O口控制程序(两个不同的跑马灯效果)(12-01)
- 基于avr单片机I/O口输出SPWM程序(11-30)
- 单片机I/O口的红外遥控软件调制技术(11-30)
- 单片机IO口模拟rs232串口通讯C51程序(11-30)
- 通过按键控制IO口操作(11-30)