數碼管,我的超級LED
![[Pasted image 20250116130225.png]]
![[Pasted image 20250116134916.png]]
![[Pasted image 20250116130421.png]]
多個數碼管共引腳連線節省介面
在同一個時刻相同引腳的數碼管只能顯示相同內容
動態數碼管顯示是根據人眼視覺殘留與數碼管餘輝實現的
圖中COM為公共端(數碼管共陰極連線)
74HC245用於資料緩衝,防止傳輸的資料驅動能力不足
1. 數碼管的靜態控制
只在一個位置顯示一個數字
#include <REGX52.H>
void nixie(unsigned char location, unsigned char number);
unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00};
/*
@param location 用於確定數碼管位置
@param number 用於傳遞要在數碼管上顯示的值
數碼管的靜態控制函式
*/
void nixie(unsigned char location, unsigned char number)
{
switch (location)
{
case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break; // LED8
case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break; // LED7
case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break; // LED6
case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break; // LED5
case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break; // LED4
case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break; // LED3
case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break; // LED2
case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break; // LED1
}
P0 = nixieTable[number];
}
void main()
{
nixie(7,8);
while (1)
{
/* code */
}
}
2. 數碼管的動態控制
#include <REGX52.H>
#include <INTRINS.H>
void nixie(unsigned char location, unsigned char number);
void Delay1ms();
unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71, 0x00};
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void nixie(unsigned char location, unsigned char number)
{
switch (location)
{
case 1:P2_4 = 1, P2_3 = 1, P2_2 = 1;break; // LED8
case 2:P2_4 = 1, P2_3 = 1, P2_2 = 0;break; // LED7
case 3:P2_4 = 1, P2_3 = 0, P2_2 = 1;break; // LED6
case 4:P2_4 = 1, P2_3 = 0, P2_2 = 0;break; // LED5
case 5:P2_4 = 0, P2_3 = 1, P2_2 = 1;break; // LED4
case 6:P2_4 = 0, P2_3 = 1, P2_2 = 0;break; // LED3
case 7:P2_4 = 0, P2_3 = 0, P2_2 = 1;break; // LED2
case 8:P2_4 = 0, P2_3 = 0, P2_2 = 0;break; // LED1
}
P0 = nixieTable[number];
}
void main()
{
while (1)
{
nixie(7,8);
Delay1ms();
nixie(6,7);
Delay1ms();
nixie(1,1);
Delay1ms();
nixie(3,2);
Delay1ms();
}
}
實際上就是多次呼叫靜態控制函式,並再呼叫一次後加上很小的延遲來起到同時顯示的效果
若延遲給的過小或者沒有給延遲,則數碼管上會出現亂碼;這是因為數碼管先進行段選擇再進行位置選擇,多次呼叫靜態控制函式實則在每一次呼叫後都會進行清零操作,之後再進行數碼管段選擇位置選擇,因為微控制器計算速度快導致在顯示上人眼會看不出數字。
基於微控制器動態控制數碼管顯示的方法實際上非常耗費硬體資源,實際應該使用專門的晶片來進行影像資料處理(CPU一個個畫素點硬算和顯示卡直接計算列印的區別)