stm32f103系列开发板控制对数码管来显示自定义时间(自主学习)

先明白数码管的编码方式:LED数码管与单片机相连,一般将数码管的个笔端引脚a,b...,g,dp按照某一顺序接到单片机对应配置的一个并行I/O口上,当配置I/O口一定的数值时候,就可以使LED数码管显示固定的字符。

按照公共端链接方式分为共阴极和共阳极,以下为共阴和共阳分别八段编码管:

数码管显示方式有静态显示和动态扫描,我们采用动态扫描,即把每一个数码管的a,b...连接在一起,一共八段,由一个八位I/O口进行控制,而每一位的公共端由宁外一个I/O口进行控制。

则就有控制数码管的位选码啦~

位选码的配置需要根据电路原理图进行配置~

数码管驱动函数

1.数码管显示初始化

       void smgInit()

{

   GPIO_InitTypeDef  GPIO_InitStructure;
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE);//使能GPIOF时钟
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_10|GPIO_Pin_8|GPIO_Pin_9;

//对应在stm32f103zet6开发板中,PE口的第八位另有其他作用,比如设置外部中断,所以不打开所有的I/O口 
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;    //速度50MHz    
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //速度50MHz
            GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化

           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;    //速度50MHz    
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //速度50MHz
            GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

}

2.数码管显示函数

void smgShow()

{
    while(1)
    {
        GPIO_Write(GPIOE,0x7FFF);//选中第一个数码管
        GPIO_Write(GPIOC,0xc0);//送第一个数字的段码
        delay_ms(1000);//延时一段时间
        
        GPIO_Write(GPIOE,0xBFFF);//选中第2个数码管
        GPIO_Write(GPIOC,0xf9);//送第2个数字的段码
        delay_ms(1000);//延时一段时间
    
        GPIO_Write(GPIOE,0xDFFF);//选中第3个数码管
        GPIO_Write(GPIOC,0xa4);//送第3个数字的段码
        delay_ms(1000);//延时一段时间
        
        GPIO_Write(GPIOE,0xEFFF);//选中第4个数码管
        GPIO_Write(GPIOC,0xb0);//送第4个数字的段码
        delay_ms(1000);//延时一段时间
        
        GPIO_Write(GPIOE,0xF7FF);//选中第5个数码管
        GPIO_Write(GPIOC,0x99);//送第5个数字的段码
        delay_ms(1000);//延时一段时间
        
        GPIO_Write(GPIOE,0xFBFF);//选中第6个数码管
        GPIO_Write(GPIOC,0x92);//送第6个数字的段码
        delay_ms(1000);//延时一段时间
    
    }
}

在数码管文件中定义


extern u8 hour,minute,second;//全局变量

u8 smgduan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};

u16 smgwei[6]={0x7fff,0xbfff,0xdfff,0xefff,0xf7ff,0xfbff};

在数码管显示函数中我们可以推出

显示时间的函数(考虑到时间情况有两位数,则我们可以采用取余的方法进行分离)

        GPIO_Write(GPIOE,smgwei[0]);//选中第1个数码管
        GPIO_Write(GPIOC,smgduan[hour/10]);//送第5个数字的段码
        delay_ms(1000);//延时一段时间

        GPIO_Write(GPIOE,smgwei[1]);//选中第2个数码管
        GPIO_Write(GPIOC,smgduan[hour%10]);//送第5个数字的段码
        delay_ms(1000);//延时一段时间

z这样就可以显示小时对应的数字,同理分和秒。

猜你喜欢

转载自blog.csdn.net/qq_60043905/article/details/124644006