1、stm32控制4位共阳数码管输出计数
用stm32控制4位数码管,需要用到GPIO口 PA0~PA11共12个引脚。首先我们来看看数码管的原理图。
因为是共阳所以12,9,8,6为电源输入,其他引脚均为接地,所以对于芯片来说12,9,8,6高位输出,其他设定为低位即可。
//设定下GPIO口
void GPIO_Num_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
这里有个要注意的,根据原理图可以看出数码管一次只能输出一位数组,所以如果是多位的必须使用扫描的方式输出,缩短切换的间隔,就可以达到不闪烁的效果。
//输出封装
void DisPlayNum(int n)
{
if (n 《 9999)
{ int i;
int s;
s = n;
i=0;
for (i=0;i《4;i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_All);
switch (i)
{
case 0:
GPIO_SetBits(GPIOA,GPIO_Pin_5);
break;
case 1:
GPIO_SetBits(GPIOA,GPIO_Pin_7);
break;
case 2:
GPIO_SetBits(GPIOA,GPIO_Pin_8);
break;
case 3:
GPIO_SetBits(GPIOA,GPIO_Pin_11);
break;
}
switch (s % 10)
{
case 0:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_4);
break;
case 1:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9|GPIO_Pin_10);
break;
case 2:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_9);
break;
case 3:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_9);
break;
case 4:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10);
break;
case 5:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_6);
break;
case 6:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_6);
break;
case 7:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9);
break;
case 8:
GPIO_SetBits(GPIOA,GPIO_Pin_2);
break;
case 9:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0);
break;}
s = s / 10;
delay_ms(1);
if (s==0)
break;}}}