标题: STM32直接驱动两位共阴极数码管源程序 [打印本页]

作者: 用户21111412    时间: 2020-11-12 18:27
标题: STM32直接驱动两位共阴极数码管源程序
刚接触STM32,还在玩I/O口的状态,今天使用库函数方式实现I/O驱动两位数码管,如下图。


数码管显示子函数
display.h文件内容
#ifndef __DISPLAY_H
#define __DISPLAY_H
#include "delay.h"

void display_Init(void);
void display0(u8 i);
void display(void);

#endif

display.c文件内容
#include "display.h"
u8 g=0,s=0,num=0;

void display_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                //使能PA时钟
        
        GPIO_InitStructure.GPIO_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_Pin_8;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_ResetBits(GPIOA,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_Pin_8);
}
void display0(u8 i)
{
        switch(i)
        {
                case 0:                //显示0
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
                break;
                case 1:                //显示1
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);                        
                break;
                case 2:                //显示2
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6);                        
                break;
                case 3:                //显示3
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_6);                        
                break;
                case 4:                //显示4
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_6);                        
                break;
                case 5:                //显示5
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);                        
                break;
                case 6:                //显示6
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);                        
                break;
                case 7:                //显示7
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);                        
                break;
                case 8:                //显示8
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);                        
                break;
                case 9:                //显示9
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
                        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);                        
                break;        
        }
}
void display(void)
{
        static u16 j=0;
        j++;
        s=num/10;
        g=num%10;
        GPIO_SetBits(GPIOA,GPIO_Pin_7);                        //PA.7高电平,十位数码管位选选中
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);                //PA.8低电平,个位数码管位选未选中
        display0(s);                                                        
        delayms(1);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);
        display0(g);
        delayms(1);        
        if(j==600)
        {
                j=0;
                if(num<100)
                        num++;
                else
                        num=0;
        }
}



作者: 956663282    时间: 2020-12-20 15:55
LZ 我用了你的程序 为什么一直显示数字1啊,j 的数值为什是600啊  ,求解求解
作者: 956663282    时间: 2020-12-20 16:02
LZ  为什么我的一直显示1  j 为什么是600啊 求解求解!
作者: 小黎    时间: 2020-12-20 20:39
一起学习一起进步




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1