STM32 控制4位共阳数码管输出计数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yoie01/article/details/38463921
用到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;
        }     
    }
}

最后main的测试代码
int count;
int TimeCheck;
 
int main(void)
{
    GPIO_Num_Init();
    count =0;
    TimeCheck = 0;
    while(1)
    {
        DisPlayNum(count);
        TimeCheck++;
        delay_ms(5);
        if (TimeCheck > 100){ //每500毫秒+1
            TimeCheck=0;
            count++;
        }
    }
}


————————————————
版权声明:本文为CSDN博主「Yoie」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yoie01/article/details/38463921

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章