接线:
GPIOA Pin4-Pin7 输出
GPIOB Pin4-Pin7 输入
unsigned char Key_Scan()
{
for(int i=0;i<4;i++)//X扫描
{
GPIOA->ODR=~(1<<(4+i));
Delay_ms(10);
switch((GPIOB->IDR&0x00f0))
{
case 0x00e0:return i*4+1; //0000 0000 1110 0000
case 0x00d0:return i*4+2;
case 0x00b0:return i*4+3;
case 0x0070:return i*4+4;
}
}
return 0;
}
GPIOA->ODR=~(1<<(4+i));
将输出依次拉低。
for(int i=0;i<4;i++)
for循环:X轴扫描
switch((GPIOB->IDR&0x00f0))
将GPIO的16位取出,经行Y轴扫描,&(0x00f0),只读取GPIO的Pin4-Pin7
case 0x00e0:return i*4+2;
如果是0x00e0,也就是0x0000 0000 1110 0000 ,第5位为低电平,看接线,GPIO的Pin4是否接的是按键Y轴扫描的第一根线