一、proteus设计
注:测试上4*4键盘直接接到控制器,读值出错,加驱动测试成功。
二、CubeMX设计
注:输入端的设置
三、KEIL程序设计
int KEY_SCAN(void)
{
int KEY_Value= 0x00ff;
int KEY_Read;
HAL_GPIO_WritePin(GPIOE,KEY_X1_Pin|KEY_X2_Pin|KEY_X3_Pin|KEY_X4_Pin,GPIO_PIN_SET);
if((GPIOE->IDR & 0x00f0) == 0x0000)
{
return -1;
}
else
{
HAL_Delay(5);
if((GPIOE->IDR & 0x00f0) == 0x0000)
{
return -1;
}
}
HAL_GPIO_WritePin(GPIOE,KEY_X2_Pin|KEY_X3_Pin|KEY_X4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,KEY_X1_Pin,GPIO_PIN_SET);
if( GPIOE->IDR & 0x00f0 )
{
KEY_Read = GPIOE->IDR & 0x00f0 ;
switch( KEY_Read )
{
case 0x0010: KEY_Value= 7; break;
case 0x0020: KEY_Value= 8; break;
case 0x0040: KEY_Value= 9; break;
case 0x0080: KEY_Value= 10; break;
}
return KEY_Value;
}
HAL_GPIO_WritePin(GPIOE,KEY_X1_Pin|KEY_X3_Pin|KEY_X4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,KEY_X2_Pin,GPIO_PIN_SET);
if( GPIOE->IDR & 0x00f0 )
{
KEY_Read = GPIOE->IDR & 0x00f0 ;
switch( KEY_Read )
{
case 0x0010: KEY_Value= 4; break;
case 0x0020: KEY_Value= 5; break;
case 0x0040: KEY_Value= 6; break;
case 0x0080: KEY_Value= 11; break;
}
return KEY_Value;
}
HAL_GPIO_WritePin(GPIOE,KEY_X1_Pin|KEY_X2_Pin|KEY_X4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,KEY_X3_Pin,GPIO_PIN_SET);
if( GPIOE->IDR & 0x00f0 )
{
KEY_Read = GPIOE->IDR & 0x00f0 ;
switch( KEY_Read )
{
case 0x0010: KEY_Value= 1; break;
case 0x0020: KEY_Value= 2; break;
case 0x0040: KEY_Value= 3; break;
case 0x0080: KEY_Value= 12; break;
}
return KEY_Value;
}
HAL_GPIO_WritePin(GPIOE,KEY_X1_Pin|KEY_X2_Pin|KEY_X3_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,KEY_X4_Pin,GPIO_PIN_SET);
if( GPIOE->IDR & 0x00f0 )
{
KEY_Read = GPIOE->IDR & 0x00f0 ;
switch( KEY_Read )
{
case 0x0010: KEY_Value= 14; break;
case 0x0020: KEY_Value= 0; break;
case 0x0040: KEY_Value= 15; break;
case 0x0080: KEY_Value= 13; break;
}
return KEY_Value;
}
return KEY_Value;
}