一、矩阵键盘原理图
二、编程原理
定义[keyleft1 keyleft2 keyleft3]
1、首先[keyleft1 keyleft2 keyleft3]=【0 0 0] 延时 以第一列为例
2、检测keyline1的状态,if == 0 此时按键可能为1 4 7 使得[keyleft1 keyleft2 keyleft3]=【1 0 0] 延时 再次检测keyline1的状态,if == 0,为按键1,如果不为0 ,使得[keyleft1 keyleft2 keyleft3]=【0 1 0] 延时 再次检测keyline1的状态,以此类推
输出模式最好用set clear 用data写入好像存在问题
unsigned int keymatrix(unsigned int z)
{
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;
if((Keyline1==0)||(Keyline2==0)||(Keyline3==0))
{
// the first line
DELAY_US(30000);
if(Keyline1==0)
{
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline1==0)
{
z=1;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline1==0)
{
z=4;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline1==0)
{
z=7;
}
else
{
z=0;
}
}
}
}
//the second line
else if(Keyline2==0)
{
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline2==0)
{
z=2;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline2==0)
{
z=5;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline2==0)
{
z=8;
}
else
{
z=0;
}
}
}
}
//the third line
else if(Keyline3==0)
{
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline3==0)
{
z=3;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
GpioDataRegs.GPASET.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline3==0)
{
z=6;
}
else
{
GpioDataRegs.GPASET.bit.GPIO12 = 1;
GpioDataRegs.GPASET.bit.GPIO13 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;
DELAY_US(10000);
if(Keyline3==0)
{
z=9;
}
else
{
z=0;
}
}
}
}
}
else
{
z=0;
}
return z;
}
keystatus = keymatrix();
void Key_initial(void)
{
EALLOW;
/* TZ1 GPIO12 TZ2 GPIO13 TZ3 GPIO14*/
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
GpioCtrlRegs.GPADIR.bit.GPIO12=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
GpioCtrlRegs.GPADIR.bit.GPIO13=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
GpioCtrlRegs.GPADIR.bit.GPIO14=1;
/* ECAP5 GPIO48 ECAP6 GPIO49 EQAP1A GPIO50*/
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
// GpioCtrlRegs.GPBQSEL2.bit.GPIO48=2;
GpioCtrlRegs.GPBDIR.bit.GPIO48=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;
GpioCtrlRegs.GPBPUD.bit.GPIO49=0;
// GpioCtrlRegs.GPBQSEL2.bit.GPIO49=2;
GpioCtrlRegs.GPBDIR.bit.GPIO49=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;
GpioCtrlRegs.GPBPUD.bit.GPIO50=0;
// GpioCtrlRegs.GPBQSEL2.bit.GPIO50=2;
GpioCtrlRegs.GPBDIR.bit.GPIO50=0;
EDIS;
}
unsigned int keymatrix(unsigned int z)
{
Keyleft1=0;
Keyleft2=0;
Keyleft3=0;
if((Keyline1==0)|(Keyline2==0)|(Keyline3==0))
{
// the first line
DELAY_US(30000);
if(Keyline1==0)
{
Keyleft1=0;
Keyleft2=1;
Keyleft3=1;
DELAY_US(10000);
if(Keyline1==0)
{
z=1;
}
else
{
Keyleft1=1;
Keyleft2=0;
Keyleft3=1;
DELAY_US(10000);
if(Keyline1==0)
{
z=4;
}
else
{
Keyleft1=1;
Keyleft2=1;
Keyleft3=0;
DELAY_US(10000);
if(Keyline1==0)
{
z=7;
}
else
{
z=0;
}
}
}
}
//the second line
else if(Keyline2==0)
{
Keyleft1=0;
Keyleft2=1;
Keyleft3=1;
DELAY_US(10000);
if(Keyline2==0)
{
z=2;
}
else
{
Keyleft1=1;
Keyleft2=0;
Keyleft3=1;
DELAY_US(10000);
if(Keyline2==0)
{
z=5;
}
else
{
Keyleft1=1;
Keyleft2=1;
Keyleft3=0;
DELAY_US(10000);
if(Keyline2==0)
{
z=8;
}
else
{
z=0;
}
}
}
}
//the third line
else if(Keyline3==0)
{
Keyleft1=0;
Keyleft2=1;
Keyleft3=1;
DELAY_US(10000);
if(Keyline3==0)
{
z=3;
}
else
{
Keyleft1=1;
Keyleft2=0;
Keyleft3=1;
DELAY_US(10000);
if(Keyline3==0)
{
z=6;
}
else
{
Keyleft1=1;
Keyleft2=1;
Keyleft3=0;
DELAY_US(10000);
if(Keyline3==0)
{
z=9;
}
else
{
z=0;
}
}
}
}
}
else
{
z=0;
}
return z;
}