矩阵案件原理图:
示例代码:
下列代码是检测矩阵按键的示例,可以检测到是哪一列哪一行的按键被按下。
void Delay10ms(unsigned int c)
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void KeyScan(void)
{
char a = 0;
GPIO_Write(GPIOx,0x0f);
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms(1);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//列
GPIO_Write(GPIOx,0x0f);
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
//第一列有按键被按下
case(0X0b): KeyValue=4;break;
//第二列有按键被按下
case(0X0d): KeyValue=8;break;
//第三列有按键被按下
case(0X0e): KeyValue=12;break;
//第亖列有按键被按下
}
//行
GPIO_Write(GPIOx,0xf0);
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+1;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+3;break;
case(0Xe0): KeyValue=KeyValue+4;break;
}
//消除按键抖动
while((a<50) && (GPIO_KEY!=0xf0))
{
Delay10ms(1);
a++;
}
}
}
}