void jz_key_init()
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
u8 jz_key_scan2()//二次封装消抖
{
if(jz_key_scan())
{
delay_ms(10);
if(jz_key_scan())
{
return jz_key_scan();
}
}
return 0;
}
u8 jz_key_scan()
{
u8 hang=0,lie=0;
GPIO_InitTypeDef GPIO_Initure;
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;//ÐÐ
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_NOPULL;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;//ÁÐ
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
GPIOA->ODR=(GPIOA->ODR|0x000F);//按位或 不影响其他PA口
delay_us(10);//延时 不加延时部分键值会无法检测
if((GPIOB->IDR & 0xF000)==0x8000)
lie=4;
else if((GPIOB->IDR & 0xF000)==0x4000)
lie=3;
else if((GPIOB->IDR& 0xF000)==0x2000)
lie=2;
else if((GPIOB->IDR & 0xF000)==0x1000)
lie=1;
else
return 0;
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;//ÐÐ
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;//ÁÐ
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
GPIOB->ODR=(GPIOB->ODR|0xF000);
delay_us(10);
if((GPIOA->IDR & 0x000F)==0x0008)
hang=4;
else if((GPIOA->IDR & 0x000F)==0x0004)
hang=3;
else if((GPIOA->IDR & 0x000F)==0x0002)
hang=2;
else if((GPIOA->IDR & 0x000F)==0x0001)
hang=1;
else
return 0;
return lie+(hang-1)*4;
}