STM32开发,HAL函数实现LED数码管功能

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
字符查询

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有透光保护膜,增加透光膜的透明度。

发布了12 篇原创文章 · 获赞 3 · 访问量 3038

猜你喜欢

转载自blog.csdn.net/weixin_46623350/article/details/105544636