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