STM32
直播中

风尚男人

9年用户 992经验值
私信 关注
[问答]

STM32F103RBT6定时器是怎样去刷新LED数码管并更新数码管显示的


STM32F103RBT6定时器是怎样去刷新LED数码管并更新数码管显示的?
调整LED亮度的方式有哪些?

回帖(1)

张西子

2021-12-15 14:20:41
1 概述


  1.1 资源概述

  开发板:正点原子STM32F103 Nano开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6

  1.2 实现功能

  本实验,定时器以2ms时间刷新数码管,以1S周期时间,更新数码管显示,同时DS0闪烁 来指示程序运行。显示内容为HELLO。
  2 硬件相关知识

  2.1电路图

  采用38译码器和移位寄存器实现。

  

  

  2.2 字符查询

  字符查询,极性是共阴,排列顺序是a-dp

  

  

tips
如果我们要实现小数点,有一个捷径,不用重新生成字符,在原来字符上增加一个或0x01(共阴adp方式)的操作,如H.代码为0x6e|0x01

  

  

  3 程序实现

  此程序在正点原子的程序基础上进行修改
1,主程序

//共阴数字数组,字符内容 HELLO,全灭


u8 smg_num[]={0x6e,0x9e,0x1c,0x1c,0xfc,0x00};


int main(void)
{
               
    HAL_Init();                            //初始化HAL库   
    Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
    delay_init(72);                 //初始化延时函数
        uart_init(115200);                                //初始化串口
    LED_Init();                     //初始化LED
    LED_SMG_Init();  //数码管初始化       
    TIM3_Init(19,7199);//2ms定时显示,可以修改此值修改亮度       
        while(1)
        {       
        }
}


u8 smg_wei=0;//数码管位选
u8 smg_duan=0;//数码管段选
u16 t=0;


//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if((htim==(&TIM3_Handler))&&(LED0==GPIO_PIN_SET))
    {
      
                for (smg_wei=0;smg_wei<5;smg_wei++)//5个数码管显示对应位置的字符
                {
                LED_Write_Data(smg_num[smg_wei],smg_wei);//数码管显示
            LED_Refresh();//刷新显示         
                }
                LED_Write_Data(smg_num[5],4);//将数码管位4熄灭
            LED_LCLK=1;
            delay_us(1);
            LED_LCLK=0;                         
    }
        t++;
                if(t==500)//数码管每秒更新(2ms*500=1s)
                {
                        t=0;
                        LED0=!LED0;
                }
}
主程序时序分析,中断触发刷新LED,总计刷新5个LED,在最后一次将LED灯全灭,等待下一个计时器中断到来。

  

  

  2,相关函数

//74HC138驱动
//数码管位选
//num:要显示的数码管编号 0-7(共8个数码管)
void LED_Wei(u8 num)
{
    LED_A0=num&0x01;
        LED_A1=(num&0x02)>>1;
        LED_A2=(num&0x04)>>2;
}
//74HC595驱动
//数码管显示
//duan:显示的段码
//wei:要显示的数码管编号 0-7(共8个数码管)
void LED_Write_Data(u8 duan,u8 wei)
{
        u8 i;
        for( i=0;i<8;i++)//先送段
        {
                LED_DS=(duan>>i)&0x01;
                LED_SCK=0;
                delay_us(1);
                LED_SCK=1;
        }
    LED_Wei(wei);//后选中位
}
//74HC595驱动
//数码管刷新显示
void LED_Refresh(void)
{
        LED_LCLK=1;
        delay_us(200);//调节此参数可以控制亮度
        LED_LCLK=0;
}


4 实验结果


5 TIPS

调整LED亮度的几种方式
1,电路方法:减小限流电阻阻值,从而增大LED的电流,达到增加亮度目的。
2,软件方法:增加LED在单位时间内的总亮时长,方式有两种,增加刷新频率以及增大单个刷新周期内的点亮时间。
3,物理方法:如果LED有透光保护膜,增加透光膜的透明度。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分