stm32 74hc595驱动3位数码管
时间: 2023-10-14 13:07:36 浏览: 347
一个74hc595驱动3个数码管
以驱动一个3位共阴数码管为例,可以按照以下步骤进行:
1. 连接74HC595芯片和数码管,74HC595的输出引脚Q0~Q7分别连接到数码管的a~g、dp引脚,74HC595的SCK、RCK、SDA分别连接到STM32的SPI时钟线、SPI片选线、SPI数据线。
2. 在STM32中初始化SPI时钟,并设置SPI的工作模式、数据位、时钟极性等参数。
3. 定义一个数组,用于存储数码管显示的数字和对应的编码。
4. 编写数据传输函数,将显示的数字和编码通过SPI总线传输给74HC595芯片。
5. 编写显示函数,将需要显示的数字通过SPI总线传输给74HC595芯片,然后使能数码管,以实现显示效果。
以下是一份示例代码,仅供参考:
```c
#include "stm32f1xx_hal.h"
SPI_HandleTypeDef hspi1;
#define HC595_SPI_CS_GPIO_Port GPIOA
#define HC595_SPI_CS_Pin GPIO_PIN_4
#define DIG1_Pin GPIO_PIN_0
#define DIG1_GPIO_Port GPIOB
#define DIG2_Pin GPIO_PIN_1
#define DIG2_GPIO_Port GPIOB
#define DIG3_Pin GPIO_PIN_2
#define DIG3_GPIO_Port GPIOB
uint8_t digCode[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管显示数字和编码的对应关系
void HC595_SPI_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HC595_SPI_Transmit(uint8_t* data, uint16_t size)
{
HAL_GPIO_WritePin(HC595_SPI_CS_GPIO_Port, HC595_SPI_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, data, size, 100);
HAL_GPIO_WritePin(HC595_SPI_CS_GPIO_Port, HC595_SPI_CS_Pin, GPIO_PIN_SET);
}
void HC595_Display(uint8_t dig1, uint8_t dig2, uint8_t dig3)
{
uint8_t buf[3] = {digCode[dig1], digCode[dig2], digCode[dig3]}; // 将需要显示的数字转化为编码
HC595_SPI_Transmit(buf, 3); // 通过SPI总线传输数据
HAL_GPIO_WritePin(DIG1_GPIO_Port, DIG1_Pin, GPIO_PIN_SET); // 使能第一位数码管
HAL_Delay(1); // 延时
HAL_GPIO_WritePin(DIG1_GPIO_Port, DIG1_Pin, GPIO_PIN_RESET); // 取消使能
HAL_GPIO_WritePin(DIG2_GPIO_Port, DIG2_Pin, GPIO_PIN_SET); // 使能第二位数码管
HAL_Delay(1); // 延时
HAL_GPIO_WritePin(DIG2_GPIO_Port, DIG2_Pin, GPIO_PIN_RESET); // 取消使能
HAL_GPIO_WritePin(DIG3_GPIO_Port, DIG3_Pin, GPIO_PIN_SET); // 使能第三位数码管
HAL_Delay(1); // 延时
HAL_GPIO_WritePin(DIG3_GPIO_Port, DIG3_Pin, GPIO_PIN_RESET); // 取消使能
}
int main(void)
{
HAL_Init();
HC595_SPI_Init();
while (1)
{
HC595_Display(1, 2, 3); // 显示123
HAL_Delay(1000); // 延时1秒
HC595_Display(4, 5, 6); // 显示456
HAL_Delay(1000); // 延时1秒
}
}
```
阅读全文