第一步先拼接连线
STM32上面的PA2-PA9就是P00到P07 是段选择引脚
B0-B3就是P10到P13
A0 -----p00 ----1-a
A1 -----p01 ----0-b
A2 -----p02 ----0-c
A3 -----p03 ----1-d
A4 -----p04 ----1-e
A5 -----p05 ----1-f
A6 -----p06 ----1-g
A7 -----p07 ----1-dp
1 = 0xF9 = 1111 1001
位选
B0 -----p10
B1 -----p11
B2 -----p12
B3 -----p13
B4-----P14 —ENLED
#include "main.h"
const uint32_t SEG_SegPins[] =
{
GPIO_PIN_0,
GPIO_PIN_1,
GPIO_PIN_2,
GPIO_PIN_3,
GPIO_PIN_4,
GPIO_PIN_5,
GPIO_PIN_6,
GPIO_PIN_7,
};
const uint8_t LedChar[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e //数码管真值表
};
void SystemClock_Config(void);
void Seg_Init(void);
void Seg_DisplaySingleDigit(uint32_t n);
int main(int argc, char **argv) {
HAL_Init();
SystemClock_Config();
//初始化数码管
Seg_Init();
while(1)
{
int i = 0;
for (i = 0; i < 16;i++) {
GPIOWRITE(GPIOA,LedChar[i]);
HAL_Delay(5000);
}
}
return 0;
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
void Seg_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitTypeDef gpioinit;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
uint32_t i;
//gpioinit.Mode = GPIO_MODE_OUTPUT_PP;
//gpioinit.Speed = GPIO_SPEED_FREQ_LOW;
for (i = 0; i <9; i++) {
gpioinit.Pin = SEG_SegPins[i];
//上来先全灭
HAL_GPIO_WritePin(GPIOA, SEG_SegPins[i], GPIO_PIN_RESET);
HAL_GPIO_Init(GPIOA, &gpioinit);
}
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PB0 PB1 PB2 PB3
ENLED_Pin */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void GPIOWRITE(GPIO_TypeDef* GPIOx,uint8_t dat)
{
GPIOx->ODR = dat | ((GPIOx->ODR)&0xff00);
}
void Error_Handler(void)
{
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */