#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 uint32_t SEG_DigPins[]=
{
GPIO_PIN_8,GPIO_PIN_9,GPIO_PIN_10,GPIO_PIN_11,
};
void Seg_Init(void);
void Seg_DisplaySingleDigit(uint8_t n);
void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4);
int main(void)
{
uint32_t tsStart;
uint32_t counter=0;
uint8_t n1,n2,n3,n4;
HAL_Init();
Seg_Init();
while(1)
{
tsStart=HAL_GetTick();
n1=(counter/1000)%10;
n2=(counter/100)%10;
n3=(counter/10)%10;
n4=counter%10;
while(HAL_GetTick()-tsStart >=1000)
{
Seg_DynamicScan(n1,n2,n3,n4);
}
counter++;
}
}
void Seg_Init(void)
{
GPIO_InitTypeDef gpioinit;
uint32_t i;
//1.初始化数码管的段选引脚
gpioinit.Mode=GPIO_MODE_OUTPUT_PP;
gpioinit.Speed=GPIO_SPEED_FREQ_LOW;
__HAL_RCC_GPIOA_CLK_ENABLE();
for(i=0;i<8;i++)
{
gpioinit.Pin=SEG_SegPins[i];
HAL_GPIO_WritePin(GPIOA,SEG_SegPins[i],GPIO_PIN_RESET);
HAL_GPIO_Init(GPIOA,&gpioinit);
}
//2.初始化数码管的位选引脚
gpioinit.Mode=GPIO_MODE_OUTPUT_PP;
gpioinit.Speed=GPIO_SPEED_FREQ_LOW;
__HAL_RCC_GPIOA_CLK_ENABLE();
for(i=0;i<4;i++)
{
gpioinit.Pin=SEG_DigPins[i];
HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_SET);
HAL_GPIO_Init(GPIOA,&gpioinit);
}
}
void Seg_DisplaySingleDigit(uint8_t n)
{
const uint8_t font[]=
{
0x3f,0x06,0x5B,0x4F,0x66,0x6D,0X7D,0X07,0X7F,0X6F
};
uint32_t i;
for(i=0;i<8;i++)
{
if((font[n] & (0x1 << i))!=0)
{
HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_RESET);
}
}
}
void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4)
{
uint32_t i, j;
uint8_t numbers[4];
numbers[0]=n1;
numbers[1]=n2;
numbers[2]=n3;
numbers[3]=n4;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
HAL_GPIO_WritePin(GPIOA,SEG_DigPins[j],GPIO_PIN_SET);
}
Seg_DisplaySingleDigit(numbers[i]);
HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_RESET);
HAL_Delay(10);
}
}