1. 矩陣驅動原理
矩陣驅動是LED顯示屏常用的一種高效驅動方式,利用COM(Common,公共端)和SEG(Segment,段選)線的交叉點控制單個LED的亮滅。相比直接驅動,矩陣驅動可以顯著減少所需I/O引腳數量。
基本原理
- **直接驅動**:每個LED需要一個獨立的I/O引腳
- **矩陣驅動**:N×M矩陣只需N+M個I/O引腳
例如,驅動16個LED:
- 直接驅動:需要16個I/O引腳
- 4×4矩陣驅動:只需8個I/O引腳(4個COM + 4個SEG)
?2. COM-SEG引腳對應關系
標準7段數碼管引腳定義
a---
f | | b| g |---
e | | c| |---d ? dp
每個段與數據位的對應關系:
- bit0 → a段
- bit1 → b段
- bit2 → c段
- bit3 → d段
- bit4 → e段
- bit5 → f段
- bit6 → g段
- bit7 → dp段(小數點)
硬件連接方式
在4位數碼管(常見配置)中:
- COM線連接到每個數碼管的公共端(可能是共陽或共陰)
- SEG線并聯連接到所有數碼管的對應段
COM0 → 數碼管1公共端
COM1 → 數碼管2公共端
COM2 → 數碼管3公共端
COM3 → 數碼管4公共端SEG0 → 所有數碼管的a段
SEG1 → 所有數碼管的b段
...
SEG7 → 所有數碼管的dp段
?3. 掃描刷新機制
矩陣驅動采用時分復用技術,通過快速掃描實現視覺上的"同時顯示":
1. 激活COM0,設置SEG0-7的狀態,點亮數碼管1
2. 關閉COM0,激活COM1,設置SEG0-7的狀態,點亮數碼管2
3. 依此類推,循環重復
刷新過程人眼不可察覺,通常刷新頻率需>60Hz。
4. 代碼實現示例
初始化設置
void User_LED_Init()
{LED_InitStruct.Instance = LED_LCD;LED_InitStruct.Init.COMdriveLock = LED_LCD_COMNOLOCK; //COM口大電流不開啟LED_InitStruct.Init.SegIOSel = 0x00ff; //LED segl口選擇LED_InitStruct.Init.ComIOSel = 0x0f; ? //COMl口選擇(使用COM0-COM3四個口)LED_InitStruct.Init.ScanWidth = 0x05; ?//LED周期配置LED_InitStruct.Init.DutySel = LED_DUTYSEL_4_8; //占空比設置為4/8HAL_LED_Init(&LED_InitStruct);HAL_LED_StartScan(&LED_InitStruct); //啟動LED循環掃描模式
}
?段碼定義
// 定義0-9數字對應的段碼
uint32_t Led_arr_num[10] = {0x3F, // 0: 0011 1111 - 點亮a,b,c,d,e,f0x06, // 1: 0000 0110 - 點亮b,c0x5B, // 2: 0101 1011 - 點亮a,b,d,e,g0x4F, // 3: 0100 1111 - 點亮a,b,c,d,g0x66, // 4: 0110 0110 - 點亮b,c,f,g0x6D, // 5: 0110 1101 - 點亮a,c,d,f,g0x7D, // 6: 0111 1101 - 點亮a,c,d,e,f,g0x07, // 7: 0000 0111 - 點亮a,b,c0x7F, // 8: 0111 1111 - 點亮a,b,c,d,e,f,g0x6F // 9: 0110 1111 - 點亮a,b,c,d,f,g
};
數據更新
// 所有數碼管顯示相同數字
void display_same_number(uint8_t number) {if(number > 9) return; // 驗證輸入HAL_LED_ARR_Data(LED_LCD_COM_0, Led_arr_num[number]);HAL_LED_ARR_Data(LED_LCD_COM_1, Led_arr_num[number]);HAL_LED_ARR_Data(LED_LCD_COM_2, Led_arr_num[number]);HAL_LED_ARR_Data(LED_LCD_COM_3, Led_arr_num[number]);
}// 顯示4位數字(范圍0-9999)
void display_number(uint16_t number) {uint8_t digit1 = number % 10;uint8_t digit2 = (number / 10) % 10;uint8_t digit3 = (number / 100) % 10;uint8_t digit4 = (number / 1000) % 10;HAL_LED_ARR_Data(LED_LCD_COM_0, Led_arr_num[digit1]);HAL_LED_ARR_Data(LED_LCD_COM_1, Led_arr_num[digit2]);HAL_LED_ARR_Data(LED_LCD_COM_2, Led_arr_num[digit3]);HAL_LED_ARR_Data(LED_LCD_COM_3, Led_arr_num[digit4]);
}// 顯示帶小數點的數字
void display_with_decimal(uint16_t number, uint8_t decimal_pos) {uint8_t digit1 = number % 10;uint8_t digit2 = (number / 10) % 10;uint8_t digit3 = (number / 100) % 10;uint8_t digit4 = (number / 1000) % 10;HAL_LED_ARR_Data(LED_LCD_COM_0, Led_arr_num[digit1]);HAL_LED_ARR_Data(LED_LCD_COM_1, Led_arr_num[digit2]);HAL_LED_ARR_Data(LED_LCD_COM_2, Led_arr_num[digit3]);HAL_LED_ARR_Data(LED_LCD_COM_3, Led_arr_num[digit4]);// 在指定位置添加小數點(0為最右側數碼管)if(decimal_pos < 4) {uint32_t current_value = 0;switch(decimal_pos) {case 0: current_value = HAL_LED_Read_Data(LED_LCD_COM_0);HAL_LED_ARR_Data(LED_LCD_COM_0, current_value | 0x80);break;case 1: current_value = HAL_LED_Read_Data(LED_LCD_COM_1);HAL_LED_ARR_Data(LED_LCD_COM_1, current_value | 0x80);break;case 2: current_value = HAL_LED_Read_Data(LED_LCD_COM_2);HAL_LED_ARR_Data(LED_LCD_COM_2, current_value | 0x80);break;case 3: current_value = HAL_LED_Read_Data(LED_LCD_COM_3);HAL_LED_ARR_Data(LED_LCD_COM_3, current_value | 0x80);break;}}
}
5. 掃描頻率與占空比
關鍵參數說明:
1. **掃描寬度(ScanWidth)**:
? ?- 決定COM口掃描時間:period = (scan_width+1) × 16us
? ?- 示例:掃描寬度5對應96us的COM周期
2. **占空比(DutySel)**:
? ?- 定義COM口導通時間占周期的比例
? ?- 常見配置:4/8(50%)占空比
這兩個參數影響顯示的亮度和功耗。
6. 應用實例:時鐘顯示
void display_clock(uint8_t hours, uint8_t minutes) {uint8_t hour_tens = hours / 10;uint8_t hour_units = hours % 10;uint8_t min_tens = minutes / 10;uint8_t min_units = minutes % 10;// 顯示時間格式: HH:MM (小數點作為冒號)HAL_LED_ARR_Data(LED_LCD_COM_0, Led_arr_num[min_units]);HAL_LED_ARR_Data(LED_LCD_COM_1, Led_arr_num[min_tens]);HAL_LED_ARR_Data(LED_LCD_COM_2, Led_arr_num[hour_units] | 0x80); // 添加小數點作為冒號HAL_LED_ARR_Data(LED_LCD_COM_3, Led_arr_num[hour_tens]);
}
7. 矩陣驅動優缺點
優點
- 顯著減少I/O引腳需求
- 降低功耗
- 簡化PCB設計
缺點
- 需要軟件不斷刷新
- 同一時刻只有一位數碼管點亮
- 亮度受刷新頻率和占空比影響
?8. 結論
矩陣驅動技術是數碼管和LED顯示應用中的基礎技術,通過時分復用實現多位數顯示,平衡了硬件復雜度和顯示效果。掌握COM-SEG對應關系和掃描機制,可以輕松實現各種數字、字符甚至自定義圖形的顯示。