STM32开发,HAL函数实现LED数码管功能
程序员文章站
2022-06-08 19:57:13
...
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有透光保护膜,增加透光膜的透明度。