仅仅作为一个调试记录,供硬件设计使用。
环境
硬件:NUCLEO-F030R8。某宝购买的74HC165模组,接了
8
8
8 路按键。
开发环境:Win10+IAR EWARM 8.22.1
原理图
只是一个示意性的原理图,我自己不想画了,虽然图片的IO脚和主芯片不同。
我用的芯片型号为STM32F030R8。对应的实际IO接线如下:
165侧 芯片侧
1 PL -> PA4 SPI1_NSS
2 CP CLK -> PB3 SPI1_SCK
9 QH DS -> PA6 SPI1_MISO
15 CE -> GND
STM32CubmeMX 配置
本次使用软件模拟时序实现。
GPIO 配置
代码
利用 Cube 生成代码后,添加一下代码。
/*
1 PL -> PA4 SPI1_NSS
2 CP CLK -> PB3 SPI1_SCK
9 QH DS -> PA6 SPI1_MISO
*/
uint8_t HC165ReadData(void)
{
uint8_t dat=0;
HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, PL_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, PL_Pin, GPIO_PIN_SET);
for(uint8_t i=0;i<8;i++)
{
dat=dat<<1;
if (HAL_GPIO_ReadPin(GPIOA, DS_Pin)==1)
dat=dat+1;
HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET);
}
HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET);
return ~dat;
}
我在主循环中不断读取按键信息。主循环代码如下:
while (1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
//HAL_SPI_Receive(&hspi1, &cmd, 1, 1000);
key1=HC165ReadData();
if (key1!=0x00 && key1!=key2) {
//有按键
sprintf(RxBuffer, "Key is %d\n", key1);
printf(RxBuffer);
key2=key1;
}
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
其中变量 key1 和 key2 用来保存按键数据。下面是运行串口输出。
注意:以上只是测试代码。工程中绝对不会这样书写。
系统完整照片
用的是杜邦线连接,有点丑。测试系统将就用一下。