借鉴水友,并仿照,写的两种,保证已经实现。第一种其实也是4*4 只是将另外一行删除了 做成了4行3列
#include "KEY.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//áD
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//DD
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
int KEY_Scan(void)
{
u8 KeyVal=16;
GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x000f));
if((GPIOB->IDR & 0xf000)==0x0000)
return -1;
else
{
delay_ms(5);
if((GPIOB->IDR & 0xf000)==0x0000)
return -1;
}
GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0001));
switch(GPIOB->IDR & 0xf000)
{
case 0x1000: KeyVal=15; break;
case 0x2000: KeyVal=11; break;
case 0x4000: KeyVal=7; break;
case 0x8000: KeyVal=3; break;
}
while((GPIOB->IDR & 0xf000)!=0x0000);
GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0002));
switch(GPIOB->IDR & 0xf000)
{
case 0x1000: KeyVal=14; break;
case 0x2000: KeyVal=10; break;
case 0x4000: KeyVal=6; break;
case 0x8000: KeyVal=2; break;
}
while((GPIOB->IDR & 0xf000)!=0x0000);
GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0004));
switch(GPIOB->IDR & 0xf000)
{
case 0x1000: KeyVal=13; break;
case 0x2000: KeyVal=9; break;
case 0x4000: KeyVal=5; break;
case 0x8000: KeyVal=1; break;
}
while((GPIOB->IDR & 0xf000)!=0x0000);
return KeyVal;
} |